이 포스팅은 Expo SDK 52를 기준으로 작성되었습니다.
localStorage
라는 간단한 데이터 저장소가 있습니다. 이것은 브라우저에 데이터를 저장할 수 있는 방법 중 하나입니다. 하지만 리액트 네이티브 환경에서는 localStorage
를 사용할 수 없고, 대신 async-storage
를 사용해야 합니다. async-storage
는 비동기로 데이터를 저장하고 불러올 수 있는 방법이며, 리액트 네이티브 환경에서 사용할 수 있습니다. 이번 포스트에서는 async-storage
를 사용하는 방법에 대해 알아보겠습니다.
참고로 async-storage
는 리액트 네이티브 환경에서 사용할 수 있는 데이터 저장소입니다. 따라서 리액트 네이티브 웹 앱이나 PWA에서는 사용할 수 없습니다. 또한 Expo 뿐만 아니라 React Native CLI 환경에서도 사용할 수 있습니다.async-storage
를 사용하기 위해서는 먼저 @react-native-async-storage/async-storage
패키지를 설치해야 합니다. 이 패키지는 기존 RN에서 사용하던 @react-native-community/async-storage
패키지를 대체하고 있습니다. 따라서 어떠한 이유로 @react-native-community/async-storage
패키지를 사용하고 있다면 이를 @react-native-async-storage/async-storage
패키지로 변경해야 합니다.npm install @react-native-async-storage/async-storage
async-storage
를 설치할 수 있습니다.npx expo install @react-native-async-storage/async-storage
async-storage
를 사용하려면 먼저 import
구문을 사용하여 패키지를 불러와야 합니다.import AsyncStorage from '@react-native-async-storage/async-storage';
JSON.stringify
를 사용하여 문자열로 변환한 후 저장하고, JSON.parse
를 사용하여 다시 객체나 배열로 변환해야 합니다.const obj = { key: 'value' };
const str = JSON.stringify(obj);
const obj = JSON.parse(str);
async-storage
는 Promise
를 반환하는 메소드를 제공합니다. 따라서 async/await
나 Promise
를 사용하여 데이터를 저장하거나 불러올 수 있습니다. getItem
이 구성되어있는 방식은 다음과 같습니다.static getItem(key: string, [callback]: ?(error: ?Error, result: ?string) => void): Promise
setItem
메소드를 사용하여 데이터를 저장하는 방법입니다.const storeData = async (value) => {
try {
await AsyncStorage.setItem('my-key', value);
} catch (e) {
// saving error
}
};
JSON.stringify
를 사용하여 문자열로 변환한 후 저장해야 합니다.const storeData = async (value) => {
try {
const jsonValue = JSON.stringify(value);
await AsyncStorage.setItem('my-key', jsonValue);
} catch (e) {
// saving error
}
};
async-storage
는 getItem
메소드를 사용하여 데이터를 불러올 수 있습니다. getItem
이 구성되어있는 방식은 다음과 같습니다.static setItem(key: string, value: string, [callback]: ?(error: ?Error) => void): Promise
getItem
메소드를 사용하여 데이터를 불러올 수 있습니다.const getData = async () => {
try {
const value = await AsyncStorage.getItem('my-key');
if (value !== null) {
// value previously stored
}
} catch (e) {
// error reading value
}
};
JSON.parse
를 사용하여 문자열을 객체나 배열로 변환해야 합니다.const getData = async () => {
try {
const jsonValue = await AsyncStorage.getItem('my-key');
return jsonValue != null ? JSON.parse(jsonValue) : null;
} catch (e) {
// error reading value
}
};
async-storage
를 사용하는 방법에 대해 알아보았습니다. async-storage
는 리액트 네이티브 환경에서 데이터를 비동기로 저장하고 불러올 수 있는 방법입니다. async-storage
를 사용하면 앱에서 간단한 데이터를 저장하고 불러올 수 있습니다.async-storage
에는 어떤 메소드가 더 있을까요?const USER_1 = {
name: 'Tom',
age: 20,
traits: {
hair: 'black',
eyes: 'blue'
}
}
const USER_2 = {
name: 'Sarah',
age: 21,
hobby: 'cars',
traits: {
eyes: 'green',
}
}
mergeUsers = async () => {
try {
//save first user
await AsyncStorage.setItem('@MyApp_user', JSON.stringify(USER_1))
// merge USER_2 into saved USER_1
await AsyncStorage.mergeItem('@MyApp_user', JSON.stringify(USER_2))
// read merged item
const currentUser = await AsyncStorage.getItem('@MyApp_user')
console.log(currentUser)
// console.log result:
// {
// name: 'Sarah',
// age: 21,
// hobby: 'cars',
// traits: {
// eyes: 'green',
// hair: 'black'
// }
// }
}
}
async-storage
를 사용하는 커스텀 훅을 만듭니다.