Capstone#6. ν”„λ‘œμ νŠΈμ— Redux Toolkit λ„μž…ν•΄ μƒνƒœ 관리 ν•˜κΈ°

2024. 11. 14. 21:48γ†μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

λ°˜μ‘ν˜•

 

 


μ•ˆλ…•ν•˜μ„Έμš”~~!!
였늘 벌써 μ €μ˜ μΊ‘μŠ€ν†€μ„ μ†Œκ°œν•˜λŠ” 6μ§Έ μ‹œκ°„μ΄λ„€μš” 크크크
μ˜€λŠ˜μ€ μ–΄λ–€ 글을 λ‚¨κΈΈκΉŒ~~ ν•˜λ‹€κ°€
μš°μ„ μš°μ„  μ•„λ¬΄λž˜λ„ μƒνƒœκ΄€λ¦¬λ§ŒνΌ 또 μ€‘μš”ν•œκ²Œ μ—†μž–μ•„μš”~?
 

React Nativeμ—μ„œμ˜ 'μƒνƒœ'λž€ λ‘κ°€μ§€λ‘œ ꡬ뢄이 λ˜λŠ”λ°,

 

둜컬 μƒνƒœμ™€ κΈ€λ‘œλ²Œ μƒνƒœ

 

 

 

[μ™Όμͺ½ 트리 κ·Έλ¦Ό]

- useState λ“±μ˜ 둜컬 μƒνƒœκ΄€λ¦¬ : ν›„ν¬λŠ” 둜컬 ꡬ성 μš”μ†Œ μƒνƒœμ— μ‚¬μš©ν•΄μš”.

μƒνƒœλ₯Ό νŠΉμ • ꡬ성 μš”μ†Œμ— 둜컬둜 μœ μ§€ν•˜κ³  ν•΄λ‹Ή ꡬ성 μš”μ†Œκ°€ 자체 μƒνƒœλ₯Ό μ œμ–΄ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

이 μƒνƒœλŠ” λͺ…μ‹œμ μœΌλ‘œ props둜 μ „λ‹¬ν•˜κ±°λ‚˜ μ „μ—­ μƒνƒœ 관리 ν˜•μ‹μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” ν•œ 

ꡬ성 μš”μ†Œ κ°„ κ³΅μœ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!!

 

[였λ₯Έμͺ½ 트리 κ·Έλ¦Ό]

- Redux store의 μ „μ—­ μƒνƒœ 관리 : Redux μŠ€ν† μ–΄λŠ” μ—°κ²°λœ μ•±μ˜ λͺ¨λ“  ꡬ성 μš”μ†Œμ—μ„œ μ•‘μ„ΈμŠ€ ν•  수 μžˆλŠ” μ „μ—­ μ•± μƒνƒœλ₯Ό λ³΄μœ ν•©λ‹ˆλ‹€. Redux μŠ€ν† μ–΄λŠ” μ•±μ˜ μƒνƒœ 관리λ₯Ό μ€‘μ•™μ§‘μ€‘ν™”ν•˜λ„λ‘ 섀계 λ˜μ—ˆμ–΄μš”.

 

 

그림으둜 보면 ν•œ λˆˆμ— 이해할 수 있겠죠??

 

 


 

 

ν•΄λ‹Ή κΈ€μ—μ„œλŠ” μ „μ—­ μƒνƒœ 관리 방법인 Redux에 λŒ€ν•΄ μ†Œκ°œν•΄ λ“œλ¦΄κ±°μ˜ˆμš”!

둜컬 μƒνƒœ 관리에 λŒ€ν•œ 글은

 

https://dlawlgus40.tistory.com/116

 

[RN] ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©° κ²ͺ은 Props Drilling 문제, 그리고 Redux 뢄석

React-Native둜 앱을 λ§Œλ“œλŠ” 업무λ₯Ό ν• λ‹Ή λ°›κ³  일단 화면을 λ§Œλ“€μ–΄ λ‚΄μ•Ό ν•œλ‹€λŠ” 생각에 크게 κ³ λ―Ό 없이 κ°€μž₯ 기본이 λ˜λŠ” hook(useState, useEffect), 그리고 props 둜 ν•„μš”ν•œ 정보λ₯Ό λ„˜κ²¨κ°€λ©° 화면을 ꡬ성해

dlawlgus40.tistory.com

 

μ’€ μ˜›~날에 μ“΄ κΈ€μ΄μ§€λ§Œ 이 κΈ€μ—μ„œ 정리λ₯Ό ν–ˆμ–΄μš”.

처음 react λ₯Ό μ ‘ν•  λ•Œ 썻던 글이라 μ’€ μ‘°μž‘ν•˜μ§€λ§Œ... μ €λ•ŒλŠ” λ‚˜λ¦„ μ—΄μ‹¬νžˆ μ •λ¦¬ν–ˆλ‹΅λ‹ˆλ‹€...γ…Žγ…Ž

 

μ•„λ¬΄νŠΌ !!


μ €μ˜ ν”„λ‘œμ νŠΈμ—μ„  Reduxλ₯Ό μ’€ 더 μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλŠ”

Redux toolkit을 μ‚¬μš©ν•˜μ˜€μ–΄μš”.


μƒνƒœκ΄€λ¦¬κ°€ λ­λž„κΉŒ.. ν”„λ‘ νŠΈμ—”λ“œμ˜ 꽃?? 같은 λŠλ‚Œμ΄μ˜ˆμš”
되게 되게 핡심 같은..
 
 μ΄λ²ˆ κΈ€μ—μ„œλŠ” 제 ν”„λ‘œμ νŠΈμ— Redux ToolKitλ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜μ˜€λŠ”μ§€μ— λŒ€ν•΄

μ„€λͺ…ν•΄λ“œλ¦΄κ²Œμš”~~πŸ’πŸ’

 

 


 

 

 

κ΅¬μ‘°λŠ” λ‹€μŒκ³Ό 같이 κ΅¬μ„±ν•˜μ˜€μ–΄μš”.

 

λ„μž…ν•˜λŠ” μˆœμ„œλ₯Ό μ°¨κ·Όμ°¨κ·Ό μ•Œλ €λ“œλ¦΄κ²Œμš”

 

1. Redux νˆ΄ν‚· μ„€μΉ˜

 

# NPM
npm install @reduxjs/toolkit

# Yarn
yarn add @reduxjs/toolkit

 

μ„€μΉ˜ λ¨Όμ € ν•΄μ€˜μš”!!

 

2. Redux store μ„€μ • (configureStore)

 

첫 번째 λ‹¨κ³„μ—μ„œλŠ” Redux storeλ₯Ό μƒμ„±ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

Redux Toolkit의 configureStoreλ₯Ό μ‚¬μš©ν•˜μ—¬ 이λ₯Ό μˆ˜ν–‰ν•˜κ²Œ λ˜λŠ”λ°

이 store 의 역할은 μ‰½κ²Œ 말해 μ–΄ν”Œμ˜ μƒνƒœλ₯Ό λ³΄κ΄€ν•˜λŠ” 역할을 ν•΄μš”!

 

Reduxμ—λŠ” storeκ°€ ν•˜λ‚˜λ§Œ 있기 λ•Œλ¬Έμ— μƒνƒœλŠ” μ•± μ „μ²΄μ—μ„œ μΌκ΄€λœ ν˜•νƒœλ₯Ό λ—˜μš”!

 

κ·Έλž˜μ„œ configureStore도 ν•œλ²ˆλ§Œ μ •μ˜λ˜κ² μ£ ?

 

이런 νŠΉμ§•μ„ κ°–κ³  

store의 μ£Όμš” 역할을 μš”μ•½ν•˜μžλ©΄,

 

- 단일 정보 μ†ŒμŠ€ : μŠ€ν† μ–΄λŠ” μ•± 전체 μƒνƒœλ₯Ό λ³΄μœ ν•œλ‹€.

- 쀑앙 집쀑식 μƒνƒœ 관리

 

export default configureStore({
  reducer: {
    user: userSlice,
    navigationSource: navigationSourceSlice,
  },
});

 

 

3. Redux 슬라이슀 생성

 

 

createSlice λ₯Ό μ‚¬μš©ν•˜μ—¬ 슬라이슀λ₯Ό λ§Œλ“€μ–΄μ€˜μš”!

 

μŠ¬λΌμ΄μŠ€λŠ” μƒνƒœμ˜ 일뢀λ₯Ό μ •μ˜ν•˜κ³  이λ₯Ό μˆ˜μ •ν•˜κΈ° μœ„ν•œ λ¦¬λ“€μ„œ 및 μž‘μ—…μ„ μ œκ³΅ν•©λ‹ˆλ‹€.

 

import { createSlice } from '@reduxjs/toolkit';

const initialState = {
  name: '',
  email: '',
};

const userSlice = createSlice({
  name: 'user',  // The slice name used in the store
  initialState,
  reducers: {
    setUser: (state, action) => {
      state.name = action.payload.name;
      state.email = action.payload.email;
    },
  },
});

export const { setUser } = userSlice.actions;
export default userSlice.reducer;

 

createSliceλŠ” μžλ™μœΌλ‘œ μ•‘μ…˜κ³Ό λ¦¬λ“€μ„œλ₯Ό μƒμ„±ν•΄μš”.

 

initialStateλŠ” λ³€μˆ˜λͺ… κ·ΈλŒ€λ‘œ 초기 μƒνƒœλ₯Ό μ •μ˜ν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

 

λ¦¬λ“€μ„œλŠ” μƒνƒœλ₯Ό μˆ˜μ •ν•˜λŠ” ν•¨μˆ˜, μ•‘μ…˜μ€ μƒνƒœ 변경을 트리거 ν•˜κΈ° μœ„ν•΄ μ „λ‹¬ν•©λ‹ˆλ‹€.

 

여기에 μžμ‹ μ΄ ν•„μš”λ‘œ ν•˜λŠ” μƒνƒœλ“€μ˜ 초기 κ°’κ³Ό λ³€κ²½ λ¦¬λ“€μ„œλ“€μ„ μ •μ˜ν•΄μ£Όμ–΄μš”!

 

4. Provider 둜 μ•± λž˜ν•‘ν•˜κΈ°

 

 

import { Provider } from 'react-redux';
import { NavigationContainer } from '@react-navigation/native';
import { store } from './store';  // Import the store you just createdimport AppStackNavigation from './navigation/AppStackNavigation';  // Your navigation setup

export default function App() {
  return (
    <Provider store={store}>  {/* Wrap the entire app with Provider */}
      <NavigationContainer>
        <AppStackNavigation />
      </NavigationContainer>
    </Provider>
  );
}

 

 

이제 Provider κ΅¬μ„±μš”μ†Œμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λž˜ν•‘ν•΄μ€˜μ•Όν•΄μš”.

 

전체 μ•±μ—μ„œ Redux storeλ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ ν•„μˆ˜λ‘œ ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ” μž‘μ—…μ΄μ˜ˆμš”.

 

5. Redux μƒνƒœ μ—…λ°μ΄νŠΈ ν•˜κΈ°

 

μœ„μ—μ„œ 처럼 μŠ€ν† μ–΄λ₯Ό μ—°κ²°λ˜λ©΄ μ»΄ν¬λ„ŒνŠΈ, ν™”λ©΄κ°„μ˜ μƒνƒœ 전달이 κ°€λŠ₯ν•΄μ Έμš”!

 

import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { setUser } from './slices/userSlice';

const UserProfile = () => {
  const user = useSelector((state) => state.user);  // Get user data from Redux store
  const dispatch = useDispatch();  // Get dispatch function

  const updateUser = () => {
    dispatch(setUser({ name: 'John Doe', email: 'john.doe@example.com' }));
  };

  return (
    <div>
      <h1>User Profile</h1>
      <p>Name: {user.name}</p>
      <p>Email: {user.email}</p>
      <button onClick={updateUser}>Update User</button>
    </div>
  );
};

export default UserProfile;

 

 

- useSelect λŠ” redux μ €μž₯μ†Œμ˜ μƒνƒœμ— μ•‘μ„ΈμŠ€ ν•˜κΈ° μœ„ν•΄ Reduxμ—μ„œ μ œκ³΅ν•˜λŠ” ν›„ν¬μ˜ˆμš”.

μœ„μ˜ μ½”λ“œμ²˜λŸΌ state.user을 κ°€μ Έμ˜€λ©΄ 'user'λΌλŠ” 이름을 κ°€μ§„ slice의 전체 μƒνƒœλ₯Ό κ°€μ Έμ˜¨λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

 

- useDispatch λŠ” μž‘μ—…μ„ μ „λ‹¬ν•˜κΈ° μœ„ν•΄ reduxμ—μ„œ μ œκ³΅ν•˜λŠ” ν›„ν¬μ˜ˆμš”.

dispatch(setUser ~~) μ΄λŸ°μ‹μœΌλ‘œ setUser에 nameμ΄λž‘ email λ₯Ό μ—…λ°μ΄νŠΈ ν•˜κ² λ‹¨ κ²ƒμž…λ‹ˆλ‹€.

 

 

 

μ΄λ ‡κ²Œ ν•˜λ©΄ λ‚˜μ˜ ν”„λ‘œμ νŠΈμ—μ„œ Redux toolkit 을 μ‚¬μš©ν•΄μ„œ μƒνƒœκ΄€λ¦¬ ν•˜κΈ° 성곡 β­β­πŸ‘πŸ‘