๐Ÿ’พ 67. React Native ๋กœ์ปฌ ์ €์žฅ์†Œ ์™„์ „ ์ดํ•ดํ•˜๊ธฐ - AsyncStorage๋ถ€ํ„ฐ Realm๊นŒ์ง€

JM_Devยท2025๋…„ 8์›” 5์ผ
0
post-thumbnail

๋ชจ๋ฐ”์ผ ์•ฑ์€ ์˜คํ”„๋ผ์ธ ์ƒํ™ฉ์—์„œ๋„ ์ž˜ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
ํŠนํžˆ ๋„คํŠธ์›Œํฌ๊ฐ€ ๋Š๊ธด ์ƒํ™ฉ์—์„œ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”
๋กœ์ปฌ ์ €์žฅ์†Œ(Local Storage)๋Š” ์•ฑ์˜ ์‹ ๋ขฐ๋„์™€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ขŒ์šฐํ•œ๋‹ค.

React Native์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ €์žฅ ๋ฐฉ์‹๊ณผ
์ƒํ™ฉ๋ณ„ ์ถ”์ฒœ ์ „๋žต๊นŒ์ง€ ํ•œ๋ˆˆ์— ์ •๋ฆฌํ•ด๋ณธ๋‹ค! ๐Ÿง 


๐Ÿ—‚ 1. AsyncStorage โ€“ ๊ธฐ๋ณธ ์ €์žฅ์†Œ

๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” key-value ์ €์žฅ ๋ฐฉ์‹.
์„ค์ • ์—†์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

npm install @react-native-async-storage/async-storage
import AsyncStorage from '@react-native-async-storage/async-storage';

await AsyncStorage.setItem('nickname', 'jeongmin');
const nick = await AsyncStorage.getItem('nickname');
  • ๊ฐ„๋‹จํ•˜๊ณ  ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ์Œ
  • ๋ฌธ์ž์—ด ์ €์žฅ ์œ„์ฃผ (JSON.stringify ํ•„์š”)
  • Promise ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ API

๐Ÿ”ธ ์บ์‹œ, ์„ธํŒ…๊ฐ’, ์ตœ๊ทผ ๊ฒ€์ƒ‰์–ด ๋“ฑ ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ์— ์ ํ•ฉ


โšก 2. MMKV โ€“ ๋น ๋ฅธ ์„ฑ๋Šฅ์˜ ๋กœ์ปฌ DB

Facebook์—์„œ ๋งŒ๋“  ๊ณ ์„ฑ๋Šฅ ์ €์žฅ์†Œ.
C++ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŒ๋“ค์–ด์ ธ ์†๋„๊ฐ€ ๋น ๋ฅด๊ณ  ์•ˆ์ •์ ์ด๋‹ค.

npm install react-native-mmkv
import { MMKV } from 'react-native-mmkv';
const storage = new MMKV();

storage.set('theme', 'dark');
const theme = storage.getString('theme');
  • ๋™๊ธฐ API โ†’ ๋งค์šฐ ๋น ๋ฅธ ์ ‘๊ทผ ์†๋„
  • JSON ์ €์žฅ๋„ ์ง€์›๋จ
  • ์•ฑ ์žฌ์‹œ์ž‘ ํ›„์—๋„ ๊ฐ’ ์œ ์ง€

๐Ÿ”น ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ์„ค์ •, ๋‹คํฌ๋ชจ๋“œ, ํ† ๊ธ€๊ฐ’ ์ €์žฅ์— ์ถ”์ฒœ!


๐Ÿ” 3. SecureStore / Keychain โ€“ ๋ฏผ๊ฐ ์ •๋ณด ๋ณด์•ˆ ์ €์žฅ

ํ† ํฐ, ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ธ์ฆ์„œ ๋“ฑ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ๋•
์šด์˜์ฒด์ œ ์ˆ˜์ค€์˜ ์•”ํ˜ธํ™” ์ €์žฅ์†Œ๋ฅผ ์จ์•ผ ํ•œ๋‹ค.

import * as SecureStore from 'expo-secure-store';

await SecureStore.setItemAsync('token', 'abcd1234');
const token = await SecureStore.getItemAsync('token');
  • ์ž๋™ ์•”ํ˜ธํ™” ์ฒ˜๋ฆฌ
  • iOS: Keychain, Android: Keystore ์‚ฌ์šฉ
  • expo-secure-store ๋˜๋Š” react-native-keychain ํ™œ์šฉ ๊ฐ€๋Šฅ

๐Ÿ”’ ๋กœ๊ทธ์ธ ์„ธ์…˜, ์ธ์ฆ ํ† ํฐ์—๋Š” ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉ!


๐Ÿงฑ 4. Realm โ€“ ๊ตฌ์กฐํ™”๋œ ๋กœ์ปฌ DB

์ •ํ˜•ํ™”๋œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Realm์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค.
SQLLite๋ณด๋‹ค API๊ฐ€ ์ง๊ด€์ ์ด๊ณ , ์˜คํ”„๋ผ์ธ ์ง€์›๋„ ๋›ฐ์–ด๋‚˜๋‹ค.

import Realm from "realm";

const TaskSchema = {
  name: 'Task',
  properties: {
    id: 'int',
    title: 'string',
    done: 'bool',
  }
};

const realm = await Realm.open({ schema: [TaskSchema] });

realm.write(() => {
  realm.create('Task', { id: 1, title: '๋ธ”๋กœ๊ทธ ์“ฐ๊ธฐ', done: false });
});
  • ๊ฐ์ฒด ๊ธฐ๋ฐ˜ DB โ†’ JSON ๊ตฌ์กฐ ์ €์žฅ์— ์ตœ์ 
  • ์ฟผ๋ฆฌ/ํ•„ํ„ฐ๋ง ๊ฐ€๋Šฅ
  • ์˜คํ”„๋ผ์ธ ์•ฑ์— ๊ฐ•๋ ฅํ•œ ์„ฑ๋Šฅ

๐Ÿ“Š ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ, ๋ฆฌ์ŠคํŠธ, ํžˆ์Šคํ† ๋ฆฌ ๋กœ๊ทธ ๋“ฑ์— ์ ํ•ฉ


๐Ÿค” ์–ธ์ œ ๋ฌด์—‡์„ ์จ์•ผ ํ• ๊นŒ?

์ƒํ™ฉ์ €์žฅ์†Œ ์ถ”์ฒœ
๋ฌธ์ž์—ด ์บ์‹œ, ์„ค์ •๊ฐ’AsyncStorage
๋น ๋ฅธ ํ† ๊ธ€ ์ƒํƒœ ๋“ฑMMKV
ํ† ํฐ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ €์žฅSecureStore / Keychain
DB ๊ตฌ์กฐ, ๋Œ€์šฉ๋Ÿ‰ ๋ชฉ๋กRealm

๐Ÿง  ์ •๋ฆฌํ•˜๋ฉฐ ๋А๋‚€ ์ 

์ฒ˜์Œ์—” ๋‹ค AsyncStorage๋กœ ๋•Œ๋ ค๋ฐ•์•˜๋˜ ์‹œ์ ˆ์ด ์žˆ์—ˆ๋Š”๋ฐ... ๐Ÿ˜…
์ด์ œ๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””์— ์ €์žฅํ•˜๋А๋ƒ์— ๋”ฐ๋ผ
์„ฑ๋Šฅ๊ณผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ™• ๋‹ฌ๋ผ์ง„๋‹ค.

ํŠนํžˆ ๋ณด์•ˆ ์ฒ˜๋ฆฌ, ์„ฑ๋Šฅ ์ตœ์ ํ™”, ์˜คํ”„๋ผ์ธ ๋Œ€์‘๊นŒ์ง€ ๊ณ ๋ คํ•œ๋‹ค๋ฉด
MMKV์™€ SecureStore๋Š” ๊ผญ ์จ๋ณด์ž!


๐Ÿš€ React Native ์•ฑ์˜ ํ€„๋ฆฌํ‹ฐ๋Š” ๋กœ์ปฌ ๋ฐ์ดํ„ฐ ์ €์žฅ ์ „๋žต์—์„œ ๊ฐˆ๋ฆฐ๋‹ค.
๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ์ด์ƒ์œผ๋กœ, ์•ฑ์˜ ์™„์„ฑ๋„๋ฅผ ๋†’์ด๋Š” ํ•ต์‹ฌ ํฌ์ธํŠธ๋‹ค!


profile
๊ฐœ๋ฐœ์ž๋กœ ์ทจ์—…์„ ์ค€๋น„ ์ค‘ ์ด๋ฉฐ, ์—ด์‹ฌํžˆ ๊ณต๋ถ€ ์ค‘ ์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€