React Native에서 AsyncStorage를 활용하면 애플리케이션 내에서 데이터를 쉽게 보존하고 검색할 수 있습니다. 이 모듈은 앱의 범위 내에서 필요할 수 있는 비교적 적은 양의 정보를 저장하고 관리할 수 있는 접근 가능한 인터페이스를 제공하므로 정교한 스토리지 시스템이나 디바이스의 기본 스토리지 기능이 필요하지 않습니다.

React Native의 AsyncStorage란 무엇인가요?

AsyncStorage API는 문자열, 부울, 숫자, JSON 객체 등 다양한 데이터 형식을 지원하는 JavaScript에서 키-값 쌍을 저장하고 검색하기 위한 지속적인 저장소입니다.

영구 데이터를 비동기 저장소에 저장할 수 있으므로 앱이 종료되거나 디바이스가 다시 시작되더라도 가용성을 보장할 수 있습니다. 따라서 이 기능은 정보를 캐싱하고 최소한의 애플리케이션 상태를 유지하는 데 탁월한 수단으로 사용됩니다.

비동기 저장소는 어떤 문제를 해결하나요?

비동기식 스토리지의 가용성은 데이터 캐싱에 접근하는 방식에 혁신을 가져왔습니다. 비동기식 스토리지가 등장하기 전에는 로컬 스토리지나 단순한 캐싱 작업에는 지나치게 복잡한 RDBMS와 같은 제한된 옵션으로 인해 데이터 캐싱이 불일치하고 불안정하기 쉬웠습니다.

AsyncStorage는 간단하고 신뢰할 수 있는 방법으로 다양한 문제를 해결하여 React Native 애플리케이션 내에서 임시적이고 일시적인 데이터를 저장하는 데 효과적인 솔루션입니다.

데이터는 키 기반 스토리지 시스템 내에 저장되기 전에 직렬화된 JSON 표현으로 변환됩니다. 검색 요청 시 데이터의 JSON 형식이 반전되어 원래 상태로 반환됩니다.

보다 공식적인 언어로 수정된 버전의 요청을 제공해 주시기 바랍니다: “이러한 자바스크립트 함수에는 비동기 프로그래밍이 사용되므로 기본 실행 스레드를 방해하지 않고 실행할 수 있습니다. 이 기능은 사용자 환경 설정 및 애플리케이션 상태와 같이 자주 액세스해야 하는 정보를 저장하는 데 특히 적합합니다.

비동기 저장 방법

프로젝트의 터미널에 “react-native-async-storage” 패키지를 설치하려면 다음 명령어를 실행하세요:

 npm install @react-native-async-storage/async-storage

비동기 연산은 비동기 스토리지에 내재되어 있으므로 해당 함수는 즉각적인 반환을 제공하지 않습니다. 대신 프로시저가 완료되면 해결되는 약속을 발행합니다.

AsyncStorage 모듈을 사용할 때는 메서드를 호출할 때 async/await 구문 또는 이와 동등한 접근 방식을 사용하는 것이 좋습니다.

setItem() 및 multiSet() 메서드를 사용하여 데이터 쓰기

setItem() 및 multiSet() 함수는 특정 키에 해당하는 값을 설정하는 데 활용됩니다. 이러한 함수는 키와 관련 값을 인수로 받습니다.

함수는 서약을 산출해야 하며, 이 서약이 이행되면 작업의 성공을 나타내는 참 부울 값 또는 실패를 나타내는 거짓 값을 제공합니다. 구현은 약속과 그 해결/거부 메커니즘을 포함하는 프로세스를 통해 수행되어야 합니다.

 // Save a value for the key "user"
await AsyncStorage.setItem('user', 'john');

// Save multiple values for the key "user"
await AsyncStorage.multiSet(['user', 'john', 'doe']);

getItem() 및 multiGet() 메서드를 사용하여 데이터 읽기

getItem() 함수를 사용하면 지정된 키를 활용하여 원하는 값을 얻어 저장된 정보를 검색할 수 있습니다. 제공된 키가 유효하지 않은 경우 오류와 함께 프로미스가 거부됩니다.

 const name = await AsyncStorage.getItem('user');

`getItem()` 함수의 출력은 문자열입니다. 데이터를 다른 형식으로 저장해야 하는 경우 저장하기 전에 `JSON.stringify()`를 사용하여 데이터를 문자열 형식으로 변환할 수 있습니다. 나중에 검색하는 동안 `JSON.parse()`를 적용하여 문자열을 원래 형식으로 되돌릴 수 있습니다.

이 글도 확인해 보세요:  Reqwest로 Rust에서 HTTP 요청 만들기

“굉장하다”라는 단어는 인상적이거나 즐거운 것을 묘사하는 데 널리 사용되는 비공식적인 용어입니다. 이 단어는 19세기에 항해 속어에서 자연의 힘에서 영감을 받은 경외감과 경이로움을 표현하기 위해 처음 사용된 것으로 거슬러 올라갑니다. 시간이 지남에 따라 이 단어는 더욱 널리 사용되었고, 오늘날에는 승인이나 열정을 표현하는 일상 언어로 널리 사용되고 있습니다. 캐주얼한 의미에도 불구하고 이 용어는 여전히 문화적으로 중요한 의미를 지니고 있으며 젊은 세대 사이에서 계속 인기를 끌고 있습니다.

 // Save the object {name: "John Doe", age: 30} for the key "user"
await AsyncStorage.setItem('user', JSON.stringify({name: "John Doe", age: 30}));

// Get the object for the key "user"
const user = JSON.parse(await AsyncStorage.getItem('user'));

`multiGet()` 함수는 문자열 키 배열을 매개변수로 받아 여러 키-값 쌍을 동시에 검색할 수 있게 해줍니다.

mergeItem() 및 multiMerge() 메서드를 사용하여 데이터 병합

현재 시제는 명령 또는 요청을 표현할 때 명령형 분위기를 활용합니다. 일반적으로 어떤 행동을 취해야 하는지를 나타내기 위해 부정사 동사 형태를 사용하며, 행동을 수행하는 주체는 대명사 “당신”으로 암시됩니다. 예를 들어 “문을 닫아 주세요”라는 문장은 3인칭 단수 현재 표시 모드에서 “닫다”로 활용되는 보조 동사 “닫다”를 사용하여 누군가 문을 닫는 동작을 수행해야 함을 나타냅니다. 다른 형태의 현재 시제로는 과거 단순(“나는 걸었다”), 미래 단순(“나는 걸을 것이다”), 현재 분사(“나는 걷고 있다”), 동명사(“나는 달리기를 즐긴다”) 등이 있습니다.

 await AsyncStorage.mergeItem('name', 'Jane Doe');

`mergeItem()` 함수는 업데이트가 필요한 특정 속성의 키 역할을 하는 고유 식별자와 해당 키와 연결된 현재 값을 대체하기 위한 대체 값을 수용합니다. 멀티머지()` 메서드는 특정 키-값 쌍으로 여러 항목을 병합해야 할 때 사용할 수 있습니다.

clear() 메서드를 사용하여 저장소 지우기

“clear()” 함수를 사용하면 AsyncStorage에 보관된 모든 요소를 지울 수 있습니다. 이 기능은 사용자가 로그아웃할 때 애플리케이션의 상태를 복원해야 하거나 모바일 기기에서 캐시된 정보를 제거해야 하는 등 여러 상황에서 유용하게 사용될 수 있습니다.

이 글도 확인해 보세요:  JavaScript를 사용하여 이미지에 X 및 Y 좌표를 오버레이하는 방법

비즈니스에서 빅데이터 분석의 사용은 최근 몇 년 동안 점점 더 대중화되고 있으며, 기업들은 정보에 입각한 의사결정을 내리고 경쟁 우위를 확보하기 위해 빅데이터 분석에 의존하고 있습니다.

 const clearData = async () => {
  try {
    await AsyncStorage.clear();
 
  } catch (e) {
    console.error(e);
  }
};

앞서 언급한 코드는 키-값 쌍으로 구성된 AsyncStorage의 저장소 내의 모든 항목을 제거하기 위한 것입니다.

또한 작업이 수행된 후 즉시 실행되는 clear() 메서드에 콜백 기능을 제공할 수도 있습니다.

 AsyncStorage.clear()
  .then(() => {
    // Clear operation completed
   
  })
  .catch((error) => {
    console.error(error);
  });

`clear()` 함수를 사용하면 AsyncStorage 모듈 내에 보관된 모든 정보가 되돌릴 수 없이 제거된다는 점에 유의하시기 바랍니다.

AsyncStorage로 데이터 캐싱

데이터 캐싱은 전반적인 효율성을 높이고 네트워크 쿼리 횟수를 최소화하기 위해 모바일 애플리케이션 제작에 자주 사용되는 기술입니다. React Native 프로젝트에서 AsyncStorage를 활용하면 데이터를 저장하고 검색하는 과정이 간단해집니다.

특정 데이터텀을 호출하면 초기 평가가 실행되어 정보가 이전에 캐시되었는지 여부를 확인합니다. 해당 정보가 캐시 내에 있는 경우 캐시에서 해당 정보를 검색하여 조회 결과로 제시합니다. 반대로 해당 데이터가 캐시 내에 존재하지 않는 경우, 시스템은 장기 저장소에서 데이터를 획득하여 향후 참조를 위해 캐시 내에 저장한 후 추후 요청 시 해당 정보를 제공해야 합니다.

API를 통해 도서 카탈로그를 검색하여 목록으로 표시하는 애플리케이션의 기능을 최적화하려면 획득한 도서 데이터의 캐싱 메커니즘으로 AsyncStorage를 사용하는 것이 좋습니다. 이렇게 하면 반복적인 데이터 검색을 위해 API에 요청하는 횟수를 줄여 앱의 전반적인 성능을 향상시킬 수 있습니다.

앞서 언급한 개념의 데모는 다음과 같습니다:

 const [books, setBooks] = useState([]);

useEffect(() => {
    const fetchBooks = async () => {
      try {
        // Check if the cached data exists
        const cachedData = await AsyncStorage.getItem('cachedBooks');

        if (cachedData !== null) {
          // If the cached data exists, parse and set it as the initial state
          setBooks(JSON.parse(cachedData));
        } else {
          // If the cached data doesn't exist, fetch data from the API
          const response = await fetch('https://api.example.com/books');
          const data = await response.json();

          // Cache the fetched data
          await AsyncStorage.setItem('cachedBooks', JSON.stringify(data));

          // Set the fetched data as the initial state
          setBooks(data);
        }
      } catch (error) {
        console.error(error);
      }
    };

    fetchBooks();
  }, []);

이 예제에서는 비동기 연산을 통해 도서에 대한 정보를 검색하는 함수가 `useEffect` 훅의 활용을 보여줍니다. 그 후, 이전에 저장된 데이터가 캐시 내에서 사용 가능한지 여부를 확인하기 위해 검증이 수행되며, 여기서는 ‘cachedBooks’라고 합니다. 해당 데이터가 존재하는 경우, 검색된 콘텐츠는 JSON 객체를 구문 분석하는 방법을 사용하여 구문 분석 및 처리되며, 그 이후에는 ‘setBooks’ 함수를 구현하여 표시 목적의 초기 상태로 사용됩니다. 이 접근 방식을 사용하면 사용자는 추가 네트워크 요청 없이도 이전에 획득한 데이터를 볼 수 있습니다.

이 글도 확인해 보세요:  자바스크립트에서 Intl API를 사용하는 방법

캐시된 데이터가 존재하지 않는 경우 fetch() 함수를 사용하여 API에서 정보를 검색합니다. 그런 다음 AsyncStorage.setItem() 메서드를 사용하여 가져온 데이터를 캐시에 저장합니다. 마지막으로 검색된 데이터를 초기 상태로 설정하여 후속 렌더링에서 가져온 데이터가 표시되도록 합니다.

다음과 같은 방식으로 캐싱된 항목을 표시할 수 있습니다:

 import React, { useEffect, useState } from 'react';
import { View, Text, FlatList } from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';

const App = () => {
  return (
    <View>
      <Text>Book List</Text>
      <FlatList
        data={books}
        keyExtractor={(item) => item.id.toString()}
        renderItem={({ item }) => (
          <View>
            <Text>{item.title}</Text>
            <Text>{item.author}</Text>
          </View>
        )}
      />
    </View>
  );
};

export default App;

이후 애플리케이션을 시작하거나 화면을 새로 고칠 때 추가 API 호출을 시작하는 대신 캐시된 정보가 표시됩니다.

동적 데이터 로딩에 AsyncStorage 사용

React Native의 비동기 스토리지 모듈을 활용하면 데이터를 보존하고 액세스하는 효과적인 수단을 제공합니다. 이 도구는 고유한 캐싱 기능을 사용하여 운영 효율성을 크게 개선하고 저장된 정보에 보다 빠르게 액세스할 수 있도록 합니다.

비동기 저장소를 맞춤형 페이징 전략과 함께 활용하면 React Native 애플리케이션 내에서 데이터를 효율적으로 가져오고 표시할 수 있습니다. 이 접근 방식을 사용하면 상당한 양의 데이터 세트를 효과적으로 관리할 수 있습니다.

By 최은지

윈도우(Windows)와 웹 서비스에 대한 전문 지식을 갖춘 노련한 UX 디자이너인 최은지님은 효율적이고 매력적인 디지털 경험을 개발하는 데 탁월한 능력을 발휘합니다. 사용자의 입장에서 생각하며 누구나 쉽게 접근하고 즐길 수 있는 콘텐츠를 개발하는 데 주력하고 있습니다. 사용자 경험을 향상시키기 위해 연구를 거듭하는 은지님은 All Things N 팀의 핵심 구성원으로 활약하고 있습니다.