์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[RN] ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ฒช์€ Props Drilling ๋ฌธ์ œ, ๊ทธ๋ฆฌ๊ณ  Redux ๋ถ„์„

hiijihyun 2023. 9. 1. 10:28
๋ฐ˜์‘ํ˜•

 

 

React-Native๋กœ ์•ฑ์„ ๋งŒ๋“œ๋Š” ์—…๋ฌด๋ฅผ ํ• ๋‹น ๋ฐ›๊ณ 
์ผ๋‹จ ํ™”๋ฉด์„ ๋งŒ๋“ค์–ด ๋‚ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์—
ํฌ๊ฒŒ ๊ณ ๋ฏผ ์—†์ด
๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” hook(useState, useEffect),
๊ทธ๋ฆฌ๊ณ  props ๋กœ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ๊ฐ€๋ฉฐ
ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•ด ๋‚˜๊ฐ”๋‹ค.
 
์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์†ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋‹ค๊ฐ€
ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ์ ์  ๋Š˜์–ด๋‚˜๋ฉฐ
๋ฌธ๋“, 'Props Drilling'๋ผ๋Š” ๋ฌธ์ œ์ ์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋œ๋‹ค.
 
.
.

 

์ด ๊ธ€์—์„œ๋Š” 1์ฃผ์ผ ๋™์•ˆ react native๋กœ
์•ฑ์„ ๋งŒ๋“œ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์•Œ๊ฒŒ๋œ

 

react ์˜ ํŠน์ง• 
๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ hook ์ด๋ž€ ๋ฌด์—‡์ธ์ง€,
 
Props Drilling ๋ฌธ์ œ๋ž€ ๋ฌด์—‡์ด๋ฉฐ
์–ด๋””์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ๋Š”์ง€,

๊ทธ๋ฆฌ๊ณ  Redux๋ž€ ๋ฌด์—‡์ธ๊ฐ€,
Redux๋ฅผ ์ข€ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜
๊ทธ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ์ง€ ๋“ฑ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ด์•˜๋‹ค.

 

 

React ์˜ ์ƒํƒœ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ

 

์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์„ ํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋“ค๊ณผ๋Š” ๋‹ฌ๋ฆฌ,

react๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ”์ธ๋”ฉ์„ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.

 

๋ถ€๋ชจ -> ์ž์‹ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ state๋ฅผ props๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ณ ,

์ž์‹์˜ props๋ฅผ ๋ถ€๋ชจ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

 

 

๋Œ€์‹  ์ž์‹ component์—์„œ ๋ถ€๋ชจ component์˜ state๋ฅผ 

๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.

 

 

1. ์ž์‹์—๊ฒŒ ๋ถ€๋ชจ์˜ state๋ฅผ modifyํ•  ์ˆ˜ ์žˆ๋Š” setStateํ•จ์ˆ˜๋ฅผ props๋กœ ๋„˜๊ฒจ์ค€๋‹ค.

 

2. state management tool (redux, recoil)์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

 



 
 

Hook์˜ ๊ฐœ๋… ๋ฐ ์ข…๋ฅ˜

 

React Hook์ด๋ž€?

 
React ์—์„œ ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ Class๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด,
state์™€, ์—ฌ๋Ÿฌ React๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋‹ค.
 
์ด๋Š” ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ React state์™€ ์ƒ๋ช…์ฃผ๊ธฐ(lifecycle fetures)๋ฅผ
์—ฐ๋™(hook into) ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
 
์ฆ‰, ๊ธฐ์กด ํด๋ž˜์Šค์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ์ˆ˜ํ˜• ๋ฐฉ์‹์—์„œ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ์ด๋‹ค.
์ƒํƒœ ๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜, 
๋ณ€๊ฒฝ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋“ฑ์˜ ์ƒํ™ฉ์—์„œ 
๋ฆฌ์•กํŠธ์˜ ํ›… ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์ธ ๋“ฏํ•˜๋‹ค.
 
๋งŽ์€ ์ข…๋ฅ˜์˜ hook๋“ค์ด ์กด์žฌํ•˜์ง€๋งŒ
 
๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” hook์ด๊ธฐ๋„ ํ•˜๊ณ ,
๋‚ด๊ฐ€ ํ˜„์žฌ๊นŒ์ง€์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•œ
useState, useEffect๋ฅผ ์œ„์ฃผ๋กœ ๊ธ€์„ ์ ๋„๋ก ํ•˜๊ฒ ๋‹ค.
 

1. useState

 
์—ฌ๊ธฐ์„œ state๋ž€, react ์—์„œ ์‚ฌ์šฉ์ž์˜ ๋ฐ˜์‘์— ๋”ฐ๋ผ, ํ™”๋ฉด์„ ๋ฐ”๊ฟ”์ฃผ๊ธฐ (๋ Œ๋”๋ง) ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š”
ํŠธ๋ฆฌ๊ฑฐ(์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ์‹œ์ €) ์—ญํ• ์„ ํ•˜๋Š” ๋ณ€์ˆ˜์ด๋‹ค.
 
React๊ฐ€ state๋ฅผ ๊ฐ์‹œํ•˜๊ณ , ๋ฐ”๋€ ์ •๋ณด์— ๋”ฐ๋ฅธ ํ™”๋ฉด์„ ํ‘œ์‹œํ•ด ์ค€๋‹ค.
 

// React์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋˜์–ด ์žˆ๋Š” useState ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด, state๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
import { useState } from "react";
// const [state, state๋ณ€๊ฒฝํ•จ์ˆ˜] = useState(๊ธฐ๋ณธ state๊ฐ’);
const [isLoggedIn, setIsLoggedIn] = useState(false);

 
๋‹ค์Œ๊ณผ ๊ฐ™์ด state๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
 isLoggedIn์€ ๊ธฐ๋ณธ state๊ฐ’, setIsLoggedIn์€ state ๋ณ€๊ฒฝํ•จ์ˆ˜๋ฅผ ๋œป ํ•œ๋‹ค.
 

// ์ „์— ๋งŒ๋“  "isLoggedIn" state์˜ ๊ฐ’์„ true๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค.
setIsLoggedIn(true);
// ** useStateํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๋งŒ๋“  "state ๋ณ€๊ฒฝ ํ•จ์ˆ˜"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค.

 
์ „์— ๋งŒ๋“  isLoggedIn์˜ state ์˜ ๊ฐ’์„ true๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ๋˜๋ฉด, isLoggedIn์„ ์ถœ๋ ฅํ•ด๋ณด๋ฉด, true๋กœ ์ฐํžˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
 

2. useEffect

 
useEffect() ํ•จ์ˆ˜๋Š” React component๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค 
ํŠน์ • ์ž‘์—…(Side effect)์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ฆฌ์•กํŠธ hook์ด๋‹ค.
 
์—ฌ๊ธฐ์„œ side effect๋Š” component๊ฐ€ ๋ Œ๋”๋ง ๋œ ์ดํ›„์— ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” 
๋ถ€์ˆ˜์ ์ธ ํšจ๊ณผ๋“ค์„ ๋œปํ•œ๋‹ค.
 
์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ์ธํ•ด ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ํด๋ž˜์Šค ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ 
์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
 
useEffect๋Š” component๊ฐ€ mount(์ƒ์„ฑ), ummount(์ œ๊ฑฐ), update(์—…๋ฐ์ดํŠธ) ๋˜์—ˆ์„ ๋•Œ
ํŠน์ • ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
 
์ฆ‰, ํด๋ž˜์Šค ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ
ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.
 

 
- componentDidMount : ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์ฒซ ๋ Œ๋”๋ง์„ ๋‹ค ๋งˆ์นœ ํ›„์— ์‹คํ–‰๋œ๋‹ค.
- componentDidUpdate : ๋ฆฌ๋ Œ๋”๋ง์„ ์™„๋ฃŒํ•œ ํ›„ ์‹คํ–‰, ์ฆ‰ render()๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰ํ•œ๋‹ค.
- componentWillUnMount : ์ปดํฌ๋„ŒํŠธ๋ฅผ DOM์—์„œ ์ œ๊ฑฐํ•  ๋•Œ ์‹คํ–‰ํ•œ๋‹ค.
 
 
[ useEffect ์‚ฌ์šฉ๋ฐฉ์‹
 
1. componentDidMount
 
: Component๊ฐ€ mount ๋์„ ๋•Œ(์ฒ˜์Œ ๋‚˜ํƒ€๋‚ฌ์„ ๋•Œ ์‹คํ–‰)
 

useEffect(() =>{
 console.log('๋งˆ์šดํŠธ ๋  ๋•Œ๋งŒ ์‹คํ–‰๋œ๋‹ค');
}, []);

 
: ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๊ฐ€์žฅ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด deps ์œ„์น˜์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ์–ด์ค€๋‹ค.
 

useEffect(()=>{
 console.log('๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.');
});

 
: ๋งŒ์•ฝ ๋ฐฐ์—ด์„ ์ƒ๋žตํ•œ๋‹ค๋ฉด ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.
 
2. componentDidupdate
 
: Component ๊ฐ€ update ๋  ๋•Œ (ํŠน์ • props, state๊ฐ€ ๋ฐ”๋€” ๋•Œ ์‹คํ–‰)
 

useEffect(()=>{
 console.log(name);
 console.log('์—…๋ฐ์ดํŠธ ๋  ๋•Œ ์‹คํ–‰');
}, [name]);

 
: ํŠน์ • ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋  ๋•Œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด deps์œ„์น˜์˜ ๋ฐฐ์—ด ์•ˆ์— ๊ฒ€์‚ฌํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.
(์˜์กด ๊ฐ’์ด ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด deps๋ผ๊ณ ๋„ ํ•œ๋‹ค. dependency๋ฅผ ์˜๋ฏธ)
 
ํ•˜์ง€๋งŒ ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งŒ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
๋งˆ์šดํŠธ ๋  ๋•Œ๋„ ์‹คํ–‰๋œ๋‹ค.
๋งŒ์•ฝ, ์—…๋ฐ์ดํŠธ๋  ๋•Œ๋งŒ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ๋‹ค๋ฉด?
 

const mounted = useRef(false);
useEffect(()=>{
 if(!mounted.current){
   mounted.current=true;
   } else{
     console.log(name);
     console.log('์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰');
   }
}, [name]);

 
์ด๋ ‡๊ฒŒ useEffect ํ›…๊ณผ useRef ํ›…์„ ํ™œ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ๋˜์—ˆ๋Š”์ง€,
์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋Š”์ง€์— ๋”ฐ๋ผ ํšจ๊ณผ์ ์œผ๋กœ ์กฐ๊ฑด์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
 
useRefํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ mounted๋ผ๋Š” ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
useEffectํ›…์„ ์ƒ์„ฑํ•˜์—ฌ ์ดˆ๊ธฐ ๋งˆ์šดํŠธ์™€ ํ›„์† ์—…๋ฐ์ดํŠธ ์‹œ์— 
์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
์ดˆ๊ธฐ ๋งˆ์šดํŠธ์—์„œ๋Š” mounted ์ฐธ์กฐ๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค. 
ํ›„์† ์—…๋ฐ์ดํŠธ์—์„œ๋Š” name ํ”„๋กญ ๊ฐ’์„ ๋กœ๊ทธํ•˜๊ณ  ํšจ๊ณผ๊ฐ€ ์‹คํ–‰๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
 
 
3. componentDidUnMount
:  component๊ฐ€ unmount ๋  ๋•Œ (์‚ฌ๋ผ์งˆ ๋•Œ) & update ๋˜๊ธฐ ์ง์ „์— ์‹คํ–‰
 

useEffect(()=>{
  console.log('effect');
  console.log(name);
  return()=>{
   console.log('cleanup');
   console.log(name);
  }
 }, []);

 
cleanup ํ•จ์ˆ˜ ๋ฐ˜ํ™˜(return ๋’ค์— ๋‚˜์˜ค๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, useEffect์— ๋Œ€ํ•œ ๋’ท์ •๋ฆฌ ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.)
 
1. ์›๋งˆ์šดํŠธ ๋  ๋•Œ๋งŒ cleanupํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋นˆ ๋ฐฐ์—ด์„ ๋„ฃ๋Š”๋‹ค.
2. ํŠน์ • ๊ฐ’์ด ์—…๋ฐ์ดํŠธ๋˜๊ธฐ ์ง์ „์— cleanupํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, deps ๋ฐฐ์—ด ์•ˆ์— ๊ฒ€์‚ฌํ•˜๊ณ  ์‹ถ์€ ๊ฐ’์„ ๋„ฃ๋Š”๋‹ค.
 
์ฆ‰ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ ์‚ฌ์šฉ ๋  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋ฉฐ ๋ชจ๋“  ์ƒˆ๋กœ์šด sideEffect ํ•จ์ˆ˜๊ฐ€
์‹คํ–‰๋˜๊ธฐ ์ „์—(์ฒ˜์Œ ์‹คํ–‰ ์ œ์™ธ)
๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜๊ธฐ ์ „์— ์‹คํ–‰๋œ๋‹ค.
 
 


 
 
hook์˜ ์ข…๋ฅ˜๋กœ๋Š” useLayoutEffect, useContext, useMemo, useRef ๋“ฑ๊ณผ ๊ฐ™์€
๋” ๋งŽ์€ ํ›…๋“ค์ด ์กด์žฌํ•˜์ง€๋งŒ
๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ, ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜ useState, useEffect์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด์•˜๋‹ค.
 
๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋Œ€๋žต์ ์ธ ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ useState์— ์ €์žฅํ•ด์„œ
props๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.
 
๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ๋ฌธ๋“ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค.
 
์ผ๋‹จ ๋ญ๊ฐ€ ๋˜์—ˆ๋“  ์ด ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์šฐ์„ ์ด๋ผ ์ƒ๊ฐ๋˜์–ด,
๊ธ‰ํ•œ ๋งˆ์Œ์œผ๋กœ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„˜๊ธฐ๊ณ .. ๋˜ ๋„˜๊ธฐ๊ณ .. ๋˜ ๋„˜๊ธฐ๋‹ค ๋ณด๋‹ˆ.. ๋ฌธ๋“
์ž ๋งŒ.. ์ด๊ฒŒ ๋งž๋‚˜??
๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. 
ํ˜„์žฌ์—๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋ช‡ ๊ฐœ ์•ˆ ๋˜์–ด์„œ ์ƒ๊ด€์—†๊ฒ ์ง€๋งŒ
์ด๊ฒŒ ํŽ˜์ด์ง€ ์ˆ˜๊ฐ€ ๋” ๋งŽ์•„์ง€๋ฉด ๋‹ต ์—†๊ฒ ๋Š”๋ฐ ์‹ถ์—ˆ๋‹ค. 
 
 
์ด๊ฒƒ์„ ๋ฐ”๋กœ 
 
๋ฐ”๋กœ Props Drilling๋ผ๊ณ  ํ•œ๋‹ค.
 
 

 
์ด๋Š” ํ”„๋กœํผํ‹ฐ ๋‚ด๋ฆฌ ๊ฝ‚๊ธฐ, threading๋“ฑ์œผ๋กœ ๋ถˆ๋ฆฐ๋‹ค.
 
props๋ฅผ ํ†ตํ•ด  ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์—์„œ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋Š” 
๊ทธ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ์—๋„ 
์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด 
props๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.
 
๋˜ํ•œ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•œ ์ƒํƒœ์— ์•ก์„ธ์Šค ํ•˜๊ณ  ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ,
์ด๋Ÿฌํ•œ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ฒฐํ•ฉ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ• ์ง€๋„ ๋ชฐ๋ผ ๋ง‰๋ง‰ํ•จ์„ ๋А๊ผˆ๋‹ค.
 
 
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด axiox๋กœ ๊ณ„์† json์š”์ฒญ์„ ํ•ด์•ผ ๋˜๋‚˜?
๋ผ๊ณ  ์ƒ๊ฐ ํ–ˆ์ง€๋งŒ,
๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์„ฑ๋Šฅ๋ฌธ์ œ, ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ, ui ๊นœ๋ฐ•์ž„ ๋“ฑ์˜ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.
 
 

๊ทธ๋Ÿฌ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ• ๊นŒ?

 

์ƒํƒœ๊ด€๋ฆฌ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
 
- ๋ฐ์ดํ„ฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •๋ง ๊นŠ์ˆ™์ด ์œ„์น˜ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด,
React์—์„œ ์ œ๊ณตํ•˜๋Š” Context API๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Redux ๋“ฑ์˜
์™ธ๋ถ€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ 
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.
 



 

Redux๋ž€?

 
React ์˜ ๋Œ€ํ‘œ์ ์ธ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
Redux๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ •๊ตํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š”
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
 
Redux๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ์ƒํƒœ๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํŒจํ„ด์„ ์จ์„œ 
๊ด€๋ฆฌ๋ฅผ ํŽธํ•˜๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.
 

 
๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์ด๋Ÿฐ ํ˜•ํƒœ์™€ ๊ฐ™๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ์ข€ ๋” ์ž์„ธํžˆ ๋ณด๋ฉด 

์ด๋Ÿฐ ํ˜•ํƒœ์™€ ๊ฐ™๋‹ค.

 

์ค‘์š” ํ‚ค์›Œ๋“œ ๋ฐ ๊ฐœ๋…

 

์•ก์…˜

 
: ์‚ฌ์šฉ์ž์— ์˜ํ•ด ์ƒํƒœ์˜ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธธ ๋•Œ ์ด๊ฒƒ์„ ์•ก์…˜์ด ๋ฐœ์ƒ๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋‹ค.
์•„๋ž˜์™€ ๊ฐ™์ด ํƒ€์ž…๊ณผ value๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
type์€ ๋ฌด์กฐ๊ฑด ๋“ค์–ด๊ฐ€์•ผ ํ•˜๋ฉฐ value๋Š” ์ž์œ ๋กญ๊ฒŒ ์ž‘์„ฑํ•ด๋„ ๋œ๋‹ค.
 

{
  type: "PUSH_BUTTON"
  button: "pushed"
}

// ํ˜น์€

{
  type: "PUSH_BUTTON"
  isToggle: true
}

 
 

์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜

 
: ์•ก์…˜์„ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
ํŒŒ๋ผ๋ฏธํ„ฐ(data)๋ฅผ ๋ฐ›์•„์™€์„œ ์•ก์…˜ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฆฌํ„ดํ•ด์„œ,
์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์ „์— ์ง€์ •ํ•œ ์•ก์…˜์„ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
 

export function pushButton(data) {
  return {
    type: "PUSH_BUTTON",
    data
  };
}

 
 

๋ฆฌ๋“€์„œ

 
๋ณ€ํ™”๋ฅผ ์ผ์œผํ‚ค๋Š” ํ•จ์ˆ˜์ด๋‹ค. useReducer()์™€ ๋˜‘๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, 
ํ˜„์žฌ์˜ ์ƒํƒœ(state)์™€ ์ „๋‹ฌ๋ฐ›์€ ์•ก์…˜(action)์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๊ณ ,
์ƒˆ๋กœ์šด ์ƒํƒœ์˜ ๊ฐ’(return +-1, ์ฆ๋ถ„ ๋œ ๊ฐ’)์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
 

// ์นด์šดํ„ฐ ๊ธฐ๋Šฅ์„ ์˜ˆ๋กœ ๋“ค์—ˆ์„ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.
function counter(state, action) {
  switch (action.type) {
    case 'INCREASE':
      return state + 1;
    case 'DECREASE':
      return state - 1;
    default:
      return state;
  }
}

 
์•ก์…˜์—์„œ ์ง€์ •ํ•œ type์„ switch-case๋กœ ํ™•์ธํ•˜๊ณ ,
์ „๋‹ฌ๋ฐ›์€stateํŒŒ๋ผ๋ฏธํ„ฐ์— +1 ๋˜๋Š” -1๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
 
์ด ํ˜„์žฌ์˜ state์™€ ๋ฐ˜ํ™˜๋˜๋Š” state๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค.
 
๋จผ์ € ์•„๋ž˜ ์Šคํ† ์–ด(store)์— ๋Œ€ํ•ด ํ™•์ธํ•ด ๋ณด๊ฒ ๋‹ค.
 

์Šคํ† ์–ด

 

 
๋ฆฌ๋•์Šค์—์„œ ๋‹จ ํ•˜๋‚˜์˜ ์Šคํ† ์–ด๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋˜๋Š”๋ฐ,
์ด ์Šคํ† ์— ๋‚ด๋ถ€์—๋Š” ํ˜„์žฌ์˜ ์•ฑ ์ƒํƒœ(State)์™€ ๋ฆฌ๋“€์„œ(reducer)๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.
 
์œ„์™€ ๊ฐ™์ด ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๋ฆฌ๋“€์„œ ์ชฝ์—์„œ ์ •์˜ํ•œ state๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•ด ๋ณด์ž.
์นด์šดํ„ฐ๋กœ ์ธํ•ด ์ˆซ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๊ณ  ์ค„์–ด๋“œ๋Š” ํ…์ŠคํŠธ๋ฐ•์Šค(์ปดํฌ๋„ŒํŠธ)๊ฐ€ ์žˆ์œผ๋ฉฐ,
์ด ์ƒํƒœ๋ฅผ ์šฐ๋ฆฌ๋Š” redux๋ฅผ ์ด์šฉํ•ด ์ƒํƒœ๊ด€๋ฆฌ๋ฅผ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
 
 
์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ redux๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ,
์•„๋ž˜์™€ ๊ฐ™์ด useSelector()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์Šคํ† ์–ด์— ์ €์žฅ๋œ ํ˜„์žฌ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ ธ์™€
์ดˆ๊ธฐํ™”๋ฅผ ํ•ด์ค€๋‹ค.
 

  const count = useSelector((state: RootState) => state.counter.count);
  
  return (
  	<div>{count}</div>
  )

 
+1๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ -1๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ, ๋””์ŠคํŒจ์น˜(dispatch)๋ผ๋Š” ๊ฒƒ์„ ํ†ตํ•ด ์•ก์…˜ ์ƒ์„ฌํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•œ๋‹ค.
 
 

๋””์ŠคํŒจ์น˜

 
๋””์ŠคํŒจ์น˜๋Š” ์Šคํ† ์–ด(store)์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜ ์ค‘์˜ ํ•˜๋‚˜๋กœ ์•ก์…˜์„ ๋ฐœ์ƒ์‹œ์ผœ์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.
 

const dispatch = useDispatch(); // ๋””์ŠคํŒจ์น˜ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค

  // ๊ฐ ์•ก์…˜๋“ค์„ ๋””์ŠคํŒจ์น˜ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์„ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค
  const onIncrease = () => {
    dispatch(increase());
  };

  const onDecrease = () => {
    dispatch(decrease());
  };

 
์œ„์™€ ๊ฐ™์ด ๋””์ŠคํŒจ์น˜ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์•ก์…˜ ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜๊ณ , 
onIncrease()(์•ก์…˜ ์ƒ์„ฑ ํ•จ์ˆ˜)๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ์•ก์…˜ ์ƒ์„ฑํ•จ์ˆ˜๋กœ ์ธํ•ด ์•ก์…˜์ด ์ƒ์„ฑ๋˜๊ณ ,
๊ทธ๋‹ค์Œ ๋ฆฌ๋“€์„œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉฐ ํ˜„์žฌ์˜ ์ƒํƒœ(ํ…์ŠคํŠธ ๋ฐ•์Šค์˜ ์ˆซ์ž๊ฐ€ 3์ด๋ฉด 3, ํ˜น์€ 19์ด๋ฉด 19)์— 
๋ฆฌ๋“€์„œ์—์„œ ์ง€์ •ํ•œ return state+1์ด ๋ฐ˜ํ™˜๋˜๋ฉฐ,
์ด ๊ฐ’์ด ์Šคํ† ์–ด (store)์— ์ €์žฅ๋œ๋‹ค.
 
useSelector()๋Š” ์Šคํ† ์–ด์— ์žˆ๋Š” ๊ฐ’์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ํ…์ŠคํŠธ ๋ฐ•์Šค๋ฅผ ๊ฐฑ์‹ ์‹œ์ผœ ์ฃผ๊ฒŒ ๋˜๊ณ ,
๊ฒฐ๊ณผ์ ์œผ๋กœ +1์ด ๋œ ๊ฐ’์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๊ฒŒ ๋œ๋‹ค.
 

 
์ด ํ๋ฆ„์„ ์ดํ•ด ํ–ˆ๋‹ค๋ฉด 
๋ฆฌ๋•์Šค๋ฅผ ๋‹ค ์ดํ•ดํ–ˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
 
 
 

๋ฆฌ๋•์Šค์˜ ์žฅ/๋‹จ์  

 

๋ฆฌ๋•์Šค์˜ ์žฅ์ 

 
๋ฆฌ๋•์Šค๋Š” ์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅธ๋‹ค.
์ฆ‰, ๋ฒ„๊ทธ๋ฅผ ์˜ˆ์ธกํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋‚ด๊ฐ€ ์–ด๋–ค ์•ก์…˜์„ ์‹คํ–‰ํ•˜์˜€๊ณ  ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅด๋Š”์ง€
์˜ˆ์ธก์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋””๋ฒ„๊น…์ด ๋งค์šฐ ์šฉ์ดํ•˜๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ก์ด ๋‚จ์•„์„œ ์ด์ „ ์ƒํƒœ๋กœ๋„ ๋˜๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ์˜ ์ค‘์•™์ง‘๊ถŒํ™”์ด๋‹ค.
 

๋ฆฌ๋•์Šค์˜ ๋‹จ์ 

 
์šฐ์„  ์ฝ”๋“œ ์ž‘์„ฑ์ด '์ดˆ๊ธฐ์—๋Š” ๋ณต์žก'ํ•˜๋‹ค. ์Šคํ…Œ์ดํŠธ ์—…๋ฐ์ดํŠธ์— ๋งž๋Š” ์•ก์…˜ ๊ฐ’๋“ค๊ณผ
๋””์ŠคํŒจ์น˜ ํ•จ์ˆ˜๋“ค ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ๋“€์„œ๋“ค ๋“ฑ๋“ฑ
์ดˆ๊ธฐ์— ๋ฏธ๋ฆฌ ์ „๋ถ€ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•˜๋Š” ๋ณต์žก์„ฑ์ด ์žˆ๋‹ค.
 
์œ„์˜ ๊ทธ๋ฆผ์—์„  ๋‹จ 2๊ฐ€์ง€ ์ƒํƒœ๊ฐ’๋ฐ–์— ์—†์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์ง€๊ณ  ๋ณต์žกํ•ด์ง€๋ฉด ์•ก์…˜ ๊ฐ’๋“ค์ด
๋ช‡์‹ญ ๊ฐœ๋Š” ๋Š˜์–ด๋‚  ๊ฒƒ์ด๋‹ค.
 
 
๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๋•Œ
 
๋ฆฌ๋•์Šค ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด ์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹๋‹ค๊ณ  ๋‚˜์™€์žˆ๋‹ค.
 
- ์•ฑ์˜ ์—ฌ๋Ÿฌ ์œ„์น˜์—์„œ ํ•„์š”ํ•œ ๋งŽ์€ ์–‘์˜ ์ƒํƒœ๋“ค์ด ์กด์žฌํ•  ๋•Œ (์ „์—ญ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ๋А๊ปด์งˆ ๋•Œ)
- ์ƒํƒœ๋“ค์ด ์ž์ฃผ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ
- ์•ฑ์ด ์ค‘๊ฐ„ ๋˜๋Š” ํฐ ์‚ฌ์ด์ฆˆ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์— ์˜ํ•ด ์ฝ”๋“œ ๊ด€๋ฆฌ๊ฐ€ ๋  ๋•Œ
- ์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์‹œ์ ์„ ๊ด€์ฐฐํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ
 
 

reduxjs/toolkit

 
redux์˜ ๊ฐœ์„  ๋ฒ„์ „์œผ๋กœ, ๋ฌธ๋ฒ•์ด ์ข€ ๋” ์‰ฌ์›Œ ์กŒ๋‹ค.
 
 
1. configureStore๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Redux Store ์ƒ์„ฑ
 
store.js>
 

import { configureStore } from "@reduxjs/toolkit";
import todoReducer from './slices/todoSlice';

export const store = configureStore({
    reducer:{
        todo: todoReducer //์ƒ์„ฑํ•œ reducer๋ฅผ Store์— ๋“ฑ๋ก
    }
});

 
: state๋“ค์„ ๋ณด๊ด€ํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค.
 
2. React ์ปดํฌ๋„ŒํŠธ์— Redux Store ์ œ๊ณต ์ˆœ์„œ
 
index.js>
 

import { Provider } from 'react-redux';
import {store} from './redux/store';
import MainScreen from './screens/MainScreen';

export default function App() {
  return (
    <Provider store={store}>
      <MainScreen/>
    </Provider>
  );

 
๊ทธ๋ฆฌ๊ณ  App ์ปดํฌ๋„ŒํŠธ ์•„๋ž˜ ์ปดํฌ๋„ŒํŠธ์ธ MainScreen ์ปดํฌ๋„ŒํŠธ์— data๋ฐ state๋ฅผ ๊ณต๊ธ‰ํ•˜๊ธฐ ์œ„ํ•ด
๋‹ค์Œ๊ณผ ๊ฐ™์ด Provider ์ปดํฌ๋„ŒํŠธ์— store๋ฅผ props๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค.
 
์ด๋•Œ ์ƒ์„ฑํ•œ store๋Š” ๋‚ด์žฅ ๋ชจ๋“ˆ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—
{}๋กœ ๊ฐ์‹ธ์„œ ๋ชจ๋“ˆ์„ import ํ•˜๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.
 
3. createSlice๋กœ Redux slice reducer ์ƒ์„ฑ( Redux store์— state ๋ณด๊ด€ํ•˜๋Š” ๋ฒ•)
 

const todoSlice = createSlice({
  name: "todo", 
  initialState: {
        currentId: 4,
        todos: [],
    }, //์ดˆ๊ธฐ state ์ •์˜
  reducers: {
    //state functions(add,delete,update ๋กœ์ง ๊ตฌํ˜„ ๋ถ€)
  },
});
export default todoSlice.reducer;

 
ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ๋Š” add, update, delete์— ๊ด€ํ•œ ์ƒํƒœ๊ด€๋ฆฌ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
reducer ๋กœ ์ •์˜ํ•œ๋‹ค. 
 
4. useSelector๋กœ ๋ฐ์ดํ„ฐ ์ฝ๊ณ  state raise ํ•˜๊ธฐ
 

(Todo.js)

import { useSelector } from "react-redux"

function Todo(){
  let a = useSelector((state) => { return state } )
  console.log(a)

  return (์ƒ๋žต)
}

 
์•„๋ฌด ์ปดํฌ๋„ŒํŠธ์—์„œ useSelector((state) => { return state } ) ์“ฐ๋ฉด
store์— ์žˆ๋˜ ๋ชจ๋“  state๊ฐ€ ๊ทธ ์ž๋ฆฌ์— ๋‚จ๋Š”๋‹ค. 

let a = useSelector((state) => state.user )

 
์ด๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
 
5. store์˜ state ๋ณ€๊ฒฝํ•˜๋Š” ๋ฒ•
 
5.1 addTodo()
 

addTodo: (state, action) =>{
  state.todos.push({
    id: state.currentId++,
    text: action.payload.trim(),
    state: 'todo',
  });
 },

 
 
5. 2 updateTodo()
 

updateTodo:(state, action) =>{
  const item = sstate.todos.findindex((item)=> item.id ===action.payload);
  state.todos[item].state = state.todos[item].state==='todo' ? 'done' : 'todo';
  state.todos.push(state.todos.splice(item, 1)[0]);
 },

 
5. 3 deleteTodo()
 

deleteTodo : (state, action)=>{
  const item = state.todos.findIndex((item)=> item.id===action.payload);
  if(item>-1){
   state.todos.splice(item, 1);
   }
  }

 
 
๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ์ปดํฌ๋„ŒํŠธ์—์„œ import ํ•ด์™€์„œ ์‚ฌ์šฉํ•œ๋‹ค.
๊ทผ๋ฐ ์ด๋•Œ, dispatch()๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  dispatch(state ๋ณ€๊ฒฝํ•จ์ˆ˜()) ์ด๋ ‡๊ฒŒ ๊ฐ์‹ธ์„œ ์‹คํ–‰ํ•˜๋ฉด state๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
 

  


  
๋ณธ์ธ์ด ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์— ๋งž์ถ”์–ด
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
 
Redux-toolkit ์ด์™ธ์—๋„ 
recoil, jotai ๋“ฑ๋“ฑ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค.
 
๊ทธ๊ฒƒ๋“ค๋„ ๋น„๊ตํ•ด๋ณด๊ณ  ์‹ถ์—ˆ์ง€๋งŒ
๊ทธ๊ฑด ๋‹ค์Œ ๋ธ”๋กœ๊ทธ์—์„œ ์ฐจ์ฐจ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ๋‹ค.

๊ทธ๋Ÿผ ์ด๋งŒ,,,