[RN] ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๊ฒช์ Props Drilling ๋ฌธ์ , ๊ทธ๋ฆฌ๊ณ Redux ๋ถ์
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 ๋ฑ๋ฑ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌํ๊ณ ์๋ค.
๊ทธ๊ฒ๋ค๋ ๋น๊ตํด๋ณด๊ณ ์ถ์์ง๋ง
๊ทธ๊ฑด ๋ค์ ๋ธ๋ก๊ทธ์์ ์ฐจ์ฐจ ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค.
๊ทธ๋ผ ์ด๋ง,,,