1. External Store
1. External Store
๋ฆฌ์กํธ์ ์ธ๋ถ์์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ํคํ ์ฒ ๊ด์ ์ด ์๋๋ผ, ์คํ ์ด๊ฐ ๋ฆฌ์กํธ ๋ฐ(External)์ ์๋ค๋ ์๋ฏธ ๊ธฐ์กด์๋ useState ๋ฑ์ hook์ ์ด์ฉํด ์ฒ๋ฆฌ
์ธ๋ถ์ ์คํ ์ด์์ ๋ฐ๋ ์ํ๋ฅผ ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ปก forceUpdate์ ๊ฐ์ ๊ฒ์ด ์์ต๋๊น?
forceUpdate๋ Class component์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
์์
1. ๊ธฐ์กด์ useState
const [count, setCount] = useState(0);
2. useReducer ์ด์ฉ
const [, forceUpdate] = useReducer(reducer, {x: 0});
// Reducer ํจ์
function reducer(state) {
return {...state, x: state.x + 1};
}
3. useForceUpdate ์ปค์คํ
ํ
์ฌ์ฉ โ
export default function useForceUpdate() {
const [, setState] = useState({});
// useState์ forceUpdate ํจ์๋ก useReducer์ ๋์ผ ํจ๊ณผ
const forceUpdate = () => {
setState({}); // ์๋ก์ด ๊ฐ์ฒด ์์ฑ
};
return forceUpdate;
}
๋ช
ํํ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
import useForceUpdate from '../hooks/useForceUpdate';
// Business Logic
const state = {
count: 0,
};
function increase() {
state.count += 1;
}
// UI
export default function Counter() {
const forceUpdate = useForceUpdate();
const handleClick = () => {
increase();
forceUpdate();
};
return (
<div>
<p>{state.count}</p>
<button
type='button'
onClick={handleClick}
>
Increase
</button>
</div>
);
}
React๊ฐ UI๋ฅผ ๋ด๋นํ๊ณ , ์์ํ TypeScript(JavaScript)๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋น
์ฅ์
์์ฃผ ๋ฐ๋๋ UI ์์์ ๋ํ ํ ์คํธ ๋์ , ์ค๋ ์ ์ง๋๋(๋ฐ๋๋ฉด ์น๋ช ์ ์ธ) ๋น์ฆ๋์ค ๋ก์ง์ ๋ํ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด ์ ์ง๋ณด์์ ๋์์ด ๋๋ ํ ์คํธ ์ฝ๋๋ฅผ ์น๋ฐํ๊ฒ ์์ฑํ ์ ์์
2. ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
๊ด์ฌ์ฌ ๋ถ๋ฆฌ(separation of concerns, SoC)๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ณ๋ ๋ถ๋ถ์ผ๋ก ๋ถ๋ฆฌ์ํค๋ ๋์์ธ ์์น ๊ด์ฌ์ฌ๋ ํ๋ก๊ทธ๋จ ์ฝ๋์ ์ํฅ์ ๋ฏธ์น๋ ์ ๋ณด์ ์งํฉ์ด๋ฉฐ, ๊ฐ ๋ถ๋ฌธ์ ๊ฐ๊ฐ์ ๊ด์ฌ์ฌ๋ฅผ ํด๊ฒฐ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ ์ ๋ณด๋ฅผ ์ ์ ์๋ ์ธํฐํ์ด์ค๊ฐ ์๋ ์ฝ๋ ๋ถ๋ถ ์์ ์บก์ํ(์ ๋ณด ์จ๊ธฐ๊ธฐ์ ํ ์๋จ) ์ํด์ผ๋ก์จ ๋ฌ์ฑ ๊ณ์ธตํ๋ ๋์์ธ์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ๋ค๋ฅธ ๊ตฌํ (Ex. ํํ ๊ณ์ธต, ๋น์ฆ๋์ค ๋ก์ง ๊ณ์ธต, ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต, ํผ์์คํด์ค ๊ณ์ธต) ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ ์ถ์ํ์ ์ผ์ข
React Component
์ปดํฌ๋ํธ๋ ํ ๊ฐ์ง ๊ธฐ๋ฅ์ ์ํํ๋ UI ๋จ์ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํด์ ์ฌ์ฉ โ ๊ฐ ์ปดํฌ๋ํธ๋ ๊ด์ฌ์ฌ(๊ธฐ๋ฅ) ์ ๋ฐ๋ผ ๋ถ๋ฆฌ๋ ๊ฒ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ์์ ๋ ํฐ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด๋
3. Layered Architecture
Software Architecture Patterns - Layered Architecture
๋ฐฑ์๋์์ ๋ง์ด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ํ๋ก ํธ์์๋ ๋น์ทํ๊ฒ ์ ๊ทผํ ์ ์์
๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ธฐ์ค - ์ค๊ณ
Layered Architecture์์๋ ์ฌ์ฉ์์๊ฒ ๊ฐ๊น์ด ๊ฒ(UI), ์ฌ์ฉ์์ ๋จผ ๊ฒ(๋น์ฆ๋์ค ๋ก์ง) ์ผ๋ก ๊ตฌ๋ถ
๐๐ปโโ๏ธ ์ฌ๋
โ ๐ ์ค์์น(UI)
โ โ๏ธ ๋ชจํฐ(๋น์ฆ๋์ค ๋ก์ง)
โ ๐ ๋ฐํด(DB)
์ฌ๋์ด ์ค์์น๋ฅผ ์กฐ์ข ํ๋ฉด(UI)
๋ชจํฐ๊ฐ ์์ง์ฌ์(๋น์ฆ๋์ค ๋ก์ง์ ์ด์ฉ)
๋ฐํด๋ฅผ ๊ตด๋ฆด ์ ์์(DB์ ์ ๊ทผํ๊ณ ์ฒ๋ฆฌํ ์ ์์)
๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ธฐ์ค - ํ๋ก์ธ์ค
๊ฐ๋จํ๊ฒ Input
โ Process
โ Output
3๋จ๊ณ๋ก ์ฝ๋๋ฅผ ์ ์ ํ ๊ตฌ๋ถ๋ง ํด๋ ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ๋๋ฐ ํฌ๊ฒ ๋์์ด ๋จ
ํ๋์ Output์ ๋ค์ ์ฌ์ฉ์์๊ฒ Input์ ์์ฒญํ๊ฒ ๋๊ณ , ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ ์ํํ๋ ๊ตฌ์กฐ๊ฐ ๋จ
Input: ํ๋ก๊ทธ๋จ ์์
Process: ํ๋ก๊ทธ๋จ ์ด๊ธฐํ
Output: ์ฌ์ฉ์์๊ฒ ์ด๊ธฐ UI ๋ณด์ฌ์ฃผ๊ธฐ
Input: ์ฌ์ฉ์์ ์ ๋ ฅ
Process: ์ฌ์ฉ์์ ์ ๋ ฅ์ ๋ฐ๋ผ ์ฒ๋ฆฌ
Output: ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ๋ณด์ฌ์ฃผ๊ธฐ
Input: ์ฌ์ฉ์์ ๋ ๋ค๋ฅธ ์ ๋ ฅ
๋ฐ๋ณต
์ฅ์
๊ฐ๊ฐ์ ํ๋์ ์ญํ (๊ด์ฌ์ฌ)๋ง ์ํํ๊ธฐ ๋๋ฌธ์ ๋ณต์ก๋๊ฐ ๋ฎ์์ง
MVC์ ๋งคํ
MVC๋ก ๊ฑฐ์น ๊ฒ ๋งคํํ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ด ๋ณผ ์ ์์ โ ๏ธ ๋ฑ ๋จ์ด์ง๋ ๊ฒ์ ์๋๊ณ ์ด๋ ์ ๋์ ๋ผ์ ๋ง์ถ๊ธฐ
Controller โ Input
Model(๋น์ฆ๋์ค ๋ก์ง์ ํฌํจ) โ Process
View โ Output
๐ฟ MVC ํจํด
๋ชจ๋ธ(Model), ๋ทฐ(View), ์ปจํธ๋กค๋ฌ(Controller)๋ก ์ด๋ฃจ์ด์ง ๋์์ธ ํจํด ๊ตฌ์ฑ ์์๋ฅผ 3๊ฐ์ง ์ญํ ๋ก ๊ตฌ๋ถํด, ๊ฐ๋ฐ ํ๋ก์ธ์ค์์ ๊ฐ๊ฐ์ ๊ตฌ์ฑ ์์์๋ง ์ง์คํ ์ ์์ ์ฌ์ฌ์ฉ๊ณผ ํ์ฅ์ด ์ฉ์ด
4. Flux Architecture
MVC ํจํด์ ํ๊ณ
๐จ View์ Model ๊ฐ์ ๊ด๊ณ๊ฐ ๋ณต์กํด์ ธ ๋ฒ๊ทธ๋ฅผ ์์ ํ๊ฑฐ๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์์๋ณด๊ธฐ ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ๋ฐ์
'์ฝ์ ํ์(mark seen)์ ๊ดํด ๋ง์ View๊ฐ ์๋ค๋ฉด ์ด๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ผ ํ ๊น?'์ ๋ํ ํด๋ต (์ด๋ค ํ์ด์ง์์ ๋ฉ์์ง๋ฅผ ์ฝ์๋๋ฐ, ๋ค๋ฅธ ํ์ด์ง์์๋ ๋ฉ์์ง๊ฐ ์ ์ฝ์๋ค๊ณ ๋จ๊ธฐ๋ ํ๋ ๋ฌธ์ )
View์์ ์ผ์ด๋ ๊ฒ์ด Model์ ์ํฅ์ ๋ผ์น๊ธฐ๋ ํ๊ณ , ๊ทธ ๋ฐ๋๋ ์ํฅ์ ๋ฏธ์น๋ ๋ก์ง์ด ์๋ ์ํฉ โ ๋ฐ์ดํฐ๋ฅผ ์ผ๊ด์ฑ ์๊ฒ View์ ๊ณต์ ํ๊ธฐ๊ฐ ์ด๋ ค์(์ค์ ๋ก ๋ทฐ๊ฐ ๋ชจ๋ธ์ ์ง์ ๊ฑด๋๋ฆฌ๊ฑฐ๋ ํ๋ ์ํฉ์ ์์) โ ํด๊ฒฐ๋ฐฉ๋ฒ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ํ ๋ฐฉํฅ์ผ๋ก๋ง ํ๋ฅด๋๋ก ํ๋ flux ํจํด์ด ๋ฑ์ฅ
Flux ํจํด์ ํ์
Facebook(ํ Meta)์์ MVC ํจํด์ ํ๊ณ์ ๋์์ผ๋ก ๋ด์ธ์ด ์ํคํ ์ฒ ๊ธฐ์กด์ 2-way binding(์๋ฐฉํฅ ๋ฐ์ธ๋ฉ)์ ์ผ์ ๋ ์๊ธธ ์ ์๋ Model-View์ ๋ณต์กํ ๊ด๊ณ(์ ํต์ ์ธ MVC์์ ์ด๋ฐ ์ํฉ์ ์ง์)๋ฅผ ๊ฒจ๋ฅ ๋ช ํํ unidirectional data flow๋ฅผ ๊ฐ์กฐ
๐ค ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ
์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ์งํ๋ ๋ฐ์ธ๋ฉ๊ณผ, ์์ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ํ๋กํผํฐ ๋ฐ์ธ๋ฉ์ด ๊ฒฐํฉ๋ ํํ
Action, Dispatcher, Store

Action โ ์ด๋ฒคํธ/๋ฉ์์ง ๊ฐ์ ๊ฐ์ฒด, (dispatchEvent ์ ๋น์ทํ ํ๋)
Dispatcher โ (์ฌ๋ฌ) Store๋ก Action์ ์ ๋ฌ. ๋ฉ์์ง ๋ธ๋ก์ปค ์ ์ ์ฌ
Store (์ฌ๋ฌ ๊ฐ) โ ๋ฐ์ Action์ ๋ฐ๋ผ ์ํ๋ฅผ ๋ณ๊ฒฝ, ์ํ ๋ณ๊ฒฝ์ ์๋ฆผ
View โ Store๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ค๊ฐ ๋ณํ๊ฐ ์์ผ๋ฉด Store์ ์ํ๋ฅผ ๋ฐ์, ํ๋ฉด์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฑด๋๋ฆฌ๋ฉด ๋ค์ action ๋ฐ์
์ฅ์
๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ํ์ฉํด ๋ณต์กํ ๋ทฐ ๊ตฌ์ฑ์ ๋จ์ํํ ๋์์ธ ํจํด
๋ฐ์ดํฐ ์ผ๊ด์ฑ์ด ๋์ด๋จ
๋ฒ๊ทธ ์ฐพ๊ธฐ ์ฌ์
๋จ์ ํ ์คํ ์ด ์ฌ์
Redux์ Fluxํจํด ์ ์ฉ์ฌ๋ก
Redux๋ ๋จ์ผ ์คํ ์ด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ข ๋ ๋จ์ํ ๊ทธ๋ฆผ์ ์ ์

Action โ State๋ฅผ ๋ณํ์ํด
switch๋ฅผ ํตํด action์ type์ ํ๋จ, ๊ฐ๊ฐ์ ํ์๋ฅผ ๊ฒฐ์
Store โ dispatch๋ฅผ ํตํด Action์ ๋ฐ๊ณ , ์ฌ์ฉ์๊ฐ ์ ์ํ reducer๋ฅผ ํตํด State๋ฅผ ๋ณ๊ฒฝ(๊ธฐ์กด ์ํ๋ ๋๋๊ณ ์๋ก์ด ๊ฐ์ฒด ์์ฑ)
View โ State๋ฅผ ๋ฐ์ํด์ ๋ณด์ฌ์ค, Action์ ๋ค์ ๋ง๋ฆ
๐ก Action์ ์ด๋ป๊ฒ ํํํ๋๋๊ฐ ์ฌ์ฉ์ฑ์ ํฐ ์ฐจ์ด๋ฅผ ๋ง๋ฆ
๊ฐ์ฒด/๊ฐ์ฒด๊ฐ ์๋ ๊ฒ
dispatch๋ก ์ ๋ฌ
Action creator ํจ์ ์์ฑ
ํ์ง๋ง ์ํ๋ฅผ UI์ ๋ฐ์ํ๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋์ผ โ React ์ฌ์ฉ
3๋จ๊ณ ํ๋ก์ธ์ค์ ๋งคํ
Input โ Action + dispatch
Process โ reducer
Output โ View(React)
5. useReducer
useReducer๊ฐ ๊ธฐ๋ณธํ setState๊ฐ ๋ด๋ถ์ ์ผ๋ก useReducer๋ฅผ ์ฌ์ฉ ๊ฑฐ์ ๊ฐ์ ๊ฒ์ด๋ผ๊ณ ๋ณผ ์ ์์(useState์ ๋์ฒด ํจ์)
์ฌ์ฉ ๋ฐฉ๋ฒ
const [state, dispatch] = useReducer(reducer, initialArg, init);
(state, action) => newState
์ ํํ๋ก reducer๋ฅผ ๋ฐ๊ณ dispatch ๋ฉ์๋์ ์ง์ ํํ๋ก ํ์ฌ state๋ฅผ ๋ฐํ
6. useCallback
useMemo๋ฅผ ์กฐ๊ธ ๋ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๋ง๋ ๋ฒ์ ํจ์๋ฅผ memoization ํ ์ ์๋๋ก ํด์ฃผ๋ ํจ์์ด๋ฉฐ, ์์กด์ฑ ๋ฐฐ์ด์ ๋์์ ๋์ผ
์ฌ์ฉ ๋ฐฉ๋ฒ
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
useCallback์ ์ฝ๋ฐฑํจ์์ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ ๋ฐํ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ ์ฝ๋ฐฑ์ ์์กด์ฑ์ด ๋ณ๊ฒฝ๋์์ ๋์๋ง ๋ณ๊ฒฝ(useEffect์ ์์กด์ฑ ๋ฐฐ์ด๊ณผ ๊ฐ์)
Memoization
ํน์ ํ ๊ฐ์ ์ ์ฅํด๋๋ค๊ฐ, ์ดํ์ ํด๋น ๊ฐ์ด ํ์ํ ๋ ์๋กญ๊ฒ ๊ณ์ฐํด์ ์ฌ์ฉํ๋๊ฒ ์๋๋ผ ์ ์ฅํด๋ ๊ฐ์ ํ์ฉํ๋ ํ ํฌ๋ ๋ฆฌ์กํธ์์๋ ํจ์ ์ปดํฌ๋ํธ์์ ๊ฐ์ memoization ํ ์ ์๋๋ก useMemo, useCallback ๋ฑ์ API(๋ฉ์๋)๋ฅผ ์ ๊ณตํจ
๐ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํญ์ ์ข์๊น?
์ ์ฅํด๋๊ณ ํ์ํ ๋ ๊บผ๋ด์ ์ด๋ค โ ํจ์จ์ ์ผ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐ๋์ง๋ง, โ ๏ธ ๋ฌด์กฐ๊ฑด ์ฐ๋๊ฒ ์ข์ ๊ฒ์ ์๋ ์๋ก์ด ๊ฐ์ ๋ง๋๋ ๊ฒ๊ณผ ์ด๋๊ฐ์ ์ด์ ์ ๊ฐ์ ์ ์ฅํด๋๊ณ ๋ฉ๋ชจ์ด์ ์ด์ ํจ์๋ฅผ ํธ์ถํ๊ณ , ์์กด์ฑ์ ๋น๊ตํด์ ๊ฐ์ ธ์ฌ์ง ๋ง์ง ์ฌ๋ถ๋ฅผ ํ๋จํ๋ ๊ฒ ์ค ์ด๋ค ๊ฒ์ด ๋น์ฉ์ด ๋ ์ ๊ฒ ๋ค๊น? ๐ก ์๋ก์ด ๊ฐ์ ๋ง๋๋ ๊ณผ์ ์ด ๋ณต์กํ์ง ์๋ค๋ฉด, ๋ฉ๋ชจ์ด์ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ์คํ๋ ค ๋น์ฉ์ด ๋ ๋ง์ด ๋ค ์๋ ์์!
์ด๋ค ์ํฉ์์ ์ฌ์ฉํ ๊น?
์๋ก์ด ๊ฐ์ ๋ง๋๋ ์ฐ์ฐ์ด ๋ณต์กํ ๋
ํจ์ ์ปดํฌ๋ํธ์ ์ด์ ํธ์ถ๊ณผ, ๋ค์ ํธ์ถ ๊ฐ ์ฌ์ฉํ๋ ๊ฐ์ ๋์ผ์ฑ์ ๋ณด์ฅํ๊ณ ์ถ์ ๋
ํจ์ ์ปดํฌ๋ํธ์ ํธ์ถ ๊ฐ ๊ฐ๋ค์ ๋์ผ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด์
๋์ผ์ฑ์ ๋ณด์ฅํด์ผ ํ๋ ์ด์ ๋ React.memo ์ ์ฐ๋ํด์ ์ฌ์ฉํ๊ธฐ ์ํด
useNavigate, useState๋ฑ๋ ๋ด๋ถ์ ์ผ๋ก ๋ฉ๋ชจ์ด์ ์ด์ ๋์ด์์
Last updated