Capstone#5. React Native ๋น„๋™๊ธฐ ์ €์žฅ์†Œ AsyncStorage

2024. 11. 13. 16:13ใ†Study_Develop/React Native

๋ฐ˜์‘ํ˜•

 

 

 

์•ˆ๋…•ํ•˜์„ธ์š”!

์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ 

 

https://dlawlgus40.tistory.com/136

 

Capstone#4. Axios instance ์ƒ์„ฑํ•˜๊ธฐ / Axios interceptors

์•ˆ๋…•ํ•˜์„ธ์š”!์˜ค๋Š˜์€ ๋ฒŒ์จ!! ์ €์˜ ์บก์Šคํ†ค์„ ์†Œ๊ฐœํ•˜๋Š” ๋„ค ๋ฒˆ์งธ ์‹œ๊ฐ„์ด๋„ค์š”~~ ์Œ.. ๋‹ค์Œ ๊ธ€์€ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ• ๊นŒ... ํ™”๋ฉด ๊ตฌ์„ฑํ•˜๋Š” ๊ฑธ๋กœ ํ• ๊นŒ..๋ญ˜๋กœ ํ• ๊นŒ ํ•˜๋‹ค๊ฐ€.. ์šฐ์„  ์–ดํ”Œ์ด ๋”ฑ ์ฒ˜์Œ์— ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ

dlawlgus40.tistory.com

 

interceptors์˜ ๊ธฐ๋Šฅ ์„ค๋ช…ํ•˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ์ž ๊น ๋‚˜์™”์—ˆ์—ˆ๋Š”๋ฐ,

์—ฌ๊ธฐ์„œ 

 

Axios.interceptors.request.use(async config => {
  if (
    config.headers.Authorization === '' ||
    config.headers.Authorization === undefined
  ) {
    const value = await AsyncStorage.getItem('AccessToken');
    if (value) {
      const accessToken = value;
      if (accessToken) {
        Axios.defaults.headers.common.Authorization = `Bearer ${accessToken}`;
        config.headers.Authorization = `Bearer ${accessToken}`;
      }
    }
  }
  return config;
});

 

 

์—ฌ๊ธฐ์„œ AsyncStorage๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋‚˜์˜ค์ž–์•„์š”!

์ €๊ธฐ์„œ ๋‚˜์˜จ AccessToken์„ Axios์˜ ํ—ค๋”์— ๊ณตํ†ต์œผ๋กœ ๋„ฃ๋Š”๋‹ค..??

 

๋‹ค๋“ค AsyncStorage๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”~?

์›น์‚ฌ์ดํŠธ์˜ LocalStorage์™€ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š”๋ฐ

AsyncStorage๋ž€ ์•”ํ˜ธํ™” ๋˜์ง€ ์•Š์€ ๋น„๋™๊ธฐ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” Key-Value ์ €์žฅ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค!

์•ฑ์˜ ์ „์—ญ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ด์š”.

 

 

AsyncStorage ์‚ฌ์šฉ ์ด์œ ??

 

 

๋ถ„๋ช…ํžˆ ์ฝ”๋“œ์— ์ผ์œผ๋ฉด ์ด๊ฑธ ์‚ฌ์šฉํ•œ ์ด์œ ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

์™œ ์ผ๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค!

 

AsyncStorage๋Š” redux ๋“ฑ์˜ ์ƒํƒœ๊ด€๋ฆฌ์™€ ๋‹ฌ๋ฆฌ ์•ฑ์„ ๋‹ซ๊ฑฐ๋‚˜ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด๋„ ์ €์žฅํ•œ ๊ฐ’์ด ์œ ์ง€๋œ๋‹ค๋Š”

๋ฐ์ดํ„ฐ ์ง€์†์„ฑ ํŠน์ง•์ด ์žˆ์–ด์š”.

 

์ถ”๊ฐ€์ ์œผ๋กœ ์˜คํ”„๋ผ์ธ์„ ์ง€์›ํ•˜๊ณ  ํ‚ค-๊ฐ’ ์Œ์„ ์œ„ํ•œ ๊ฐ„๋‹จํ•œ API์ž…๋‹ˆ๋‹ค!

 

๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž ์„ธ์…˜ ๋ฐ ์ธ์ฆ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ์ด ๋ผ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ์ธํ–ˆ์„ ๋•Œ ๊ฑฐ๊ธฐ์„œ ๋‚˜์˜จ ํ† ํฐ์„ ์ „์—ญ์— ๋ฏธ๋ฆฌ ์ €์žฅํ•ด ๋‘๊ณ 

์ €์žฅ๋œ ๊ฐ’์ด ์žˆ์œผ๋ฉด ๋กœ๊ทธ์ธ์„ ํ–ˆ๋‹ค, ์—†์œผ๋ฉด ์•ˆ ํ–ˆ๋‹ค๋กœ ๊ตฌ๋ถ„์„ ํ•ด์ฃผ๋ฉด ๋˜๋‹ˆ๊นŒ์š”!

 

AsyncStorage ์„ค์น˜

 

์™œ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์œผ๋‚˜ ๊ณต์‹๋ฌธ์„œ์—์„œ ์‚ญ์ œ๋˜์—ˆ๋‹ค๊ณ  ๋‚˜์˜ค๋„ค์š”!

 

https://reactnative.directory/?search=storage

 

ํ•ด๋‹น ์ปค๋ฎค๋‹ˆํ‹ฐ ํŒจํ‚ค์ง€ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋ผ๊ณ  ๋‚˜์˜ค๋„ค์š”!

 

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

or

yarn add @react-native-async-storage/async-storage

 

 

 

ํ”„๋กœ์ ํŠธ ๋‚ด AsyncStorage ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

 

 

import {AsyncStorage} from 'react-native';

 

์šฐ์„  ๊ฐ€์žฅ ์ค‘์š”ํ•œ import๋ฅผ ํ•ด์ฃผ๊ณ ์š”!

 

์ €๋Š” ๋กœ๊ทธ์ธ API๋ฅผ ์ฝœํ•œ ํ›„ ์‘๋‹ต๋ฐ›์€ accessToken์„

์ €์žฅ์†Œ์— setItem์œผ๋กœ ์ €์žฅํ•ด ๋‘์—ˆ์–ด์š”.

 

export const setAuthToken = async token => {
  if (token) {
    await AsyncStorage.setItem('AccessToken', token);
    await AsyncStorage.setItem('RefreshToken', token.refresh);
    Axios.defaults.headers.common.Authorization = `Bearer ${token}`;
  } else {
    await AsyncStorage.removeItem('AccessToken');
    await AsyncStorage.removeItem('RefreshToken');
    delete Axios.defaults.headers.common.Authorization;
  }
};

 

์ด๋Ÿฐ ์‹์œผ๋กœ ์š”!

์ด๋•Œ AccessToken์ด key๊ฐ’์ด๊ณ  token์ด value๊ฐ’์ด ๋˜๊ฒ ์ฃ ?

 

removeItem์€ AccessToken์— ์ €์žฅ๋œ ๊ฐ’์„ ์ง€์šฐ๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค!

 

๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ–ˆ์œผ๋ฉด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š”๋ฐ

 

    const value = await AsyncStorage.getItem('AccessToken');

 

 

์ด๋ ‡๊ฒŒ getItem์œผ๋กœ AccessToken์— ์ €์žฅ๋œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”!

 

ํ”„๋กœ์ ํŠธ ๋‚ด ๋ณธ์ธ์ด ์›ํ•˜๋Š” ๊ณณ์—์„œ ํ•ด๋‹น AccessToken์„ ๊บผ๋‚ด์™€ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”!

 

 

๊ทธ๋Ÿผ ์•ˆ๋…•~~ ๋‹ค์Œํฌ์ŠคํŒ… ๋•Œ ๋ด…์‹œ๋‹ค โค๏ธโค๏ธ