1. External Store
์์กด์ฝ๋ ๋ฑ๋ก ์ ์๋ด์ ํตํด ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๊ฐ ์ค์ํ๋ค๋ ํ๋งจ์ ๋ง์ด ๋ ์ค๋ฅธ๋ค. ์ด๋ ํ ๊ด์ ์์ ์ด๋ฅผ ๊ฐ์กฐํ์๊น? ๊ฐ์์์๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ UI๋ฅผ TS๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๋ด๋นํ๋ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ํตํด ๊ฐ๊ฐ์ ๋ํ ํ ์คํธ ์ฝ๋๋ฅผ ์ ๋ คํ๊ฒ ์์ฑํ ์ ์๋ค๋ ์ฅ์ ์ ์ค๋ช ํ๋ค.
Keyword
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
Layered Architecture
Flux Architecture
useReducer
useCallback
1. ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
์ํํธ์จ์ด์ ๊ตฌ์ฑ ์์๋ค์ด ๊ฐ๊ฐ ์์ ์ ์ญํ ์๋ง ์ง์คํ๊ณ ๋ค๋ฅธ ์์์์ ๊ฒฐํฉ์ ์ต์ํํ๋ ์ค๊ณ ์์น์ด๋ค. ์ด๋ฅผ ํตํด ์ฝ๋์ ๊ฐ๋ ์ฑ, ์ ์ง๋ณด์์ฑ, ์ฌ์ฌ์ฉ์ฑ์ด ์ฆ๊ฐํ๋ค. MVC ํจํด์ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ๊ฐ์กฐํ๋ ์ํํธ์จ์ด ์ํคํ ์ฒ๋ก Model, View, Controller๋ก ๊ตฌ์ฑ๋์ด ์๋ค.
Layered Architecture์์ ์ฌ์ฉ์์๊ฒ ๊ฐ๊น์ด ๊ฒ๊ณผ ์ฌ์ฉ์์๊ฒ ๋จผ ๊ฒ์ผ๋ก ๊ตฌ๋ถํ๋ค. ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒ(UI๋ฅผ ๋ค๋ฃจ๋ ํ๋ฉด) -> ์ค๊ฐ(Business Logic) -> ๊ฐ์ฅ ๋จผ ๊ฒ(๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ ๋ถ๋ถ)
2. Layered Architecture
์ํํธ์จ์ด ๊ฐ๋ฐ์์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ํคํ
์ฒ(=ํจํด)์ด๋ค. ๊ฐ ๊ณ์ธต์ ์ดํ๋ฆฌ์ผ์ด์
๋ด์์์ ํน์ ์ญํ ๊ณผ ๊ด์ฌ์ฌ(ํ๋ฉด ํ์, ๋น์ฆ๋์ค ๋ก์ง ์ํ, DB ์์
๋ฑ)๋ณ๋ก ๊ตฌ๋ถ๋๋ค. ์ด๋ Layered Architecture ์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ธ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ (Separation of Concern)
๋ฅผ ์๋ฏธํ๋ค. ํน์ ๊ณ์ธต์ ๊ตฌ์ฑ์์๋ ํด๋น ๊ณ์ธต์ ๊ด๋ จ๋ ๊ธฐ๋ฅ๋ง ์ํํ๋ค. ๋ค๋ฅธ ๊ณ์ธต์์ ์ผ์ด๋๋ ์ผ์ ๊ด์ฌ์ด ์๋ค๋ ์๊ธฐ. ์ด๋ก ์ธํด ์
๋ฐ์ดํธ๊ฐ ํ์ํ ๊ฒฝ์ฐ ํด๋น ๊ณ์ธต๋ง ์์ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ ์ง๋ณด์์ ์ ๋ฆฌํ๊ณ ํ
์คํธ๊ฐ ์ฝ๋ค๋ ์ฅ์ ์ด ์๋ค.
์๋ฅผ ๋ค๋ฉด, ์ฌ๋ฌ ๊ฐ์ง์ ์ผ์ ํ๋ ์ปดํฌ๋ํธ๊ฐ ์กด์ฌํ๋๋ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๊ทธ๋๋ก์์๋ UI๋ฅผ ์์ ํ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ๊ธฐ์ ํ ์คํธ ์ฝ๋๊ฐ ๊ณ ์ฅ๋ ์ ์๋ค.
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ฅผ ํตํด ํ๋์ ์ผ๋ง์ ์ํํจ์ผ๋ก์ ํ ์คํธ ์ฝ๋ ์์ฑ์ด ์ฌ์์ง๋ค.

Presentation Layer: ํ๋ฉด์ ์ ๋ณด๋ฅผ ํ์ํ๊ณ UI๋ฅผ ํตํ ์ ์ ์ธํฐ๋ ์ ์ ๊ด์ฌ์ฌ๋ก ๋๋ค. (ex. View, Controller)
Business Layer: ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ ๊ฒ์ ๊ด์ฌ์ฌ๋ก ๋๋ค.
Persistence layer: ๊ฐ์ฒด ๊ด๊ณํ ๋งคํ(ORM)๊ณผ ๊ฐ์ ๊ธฐ๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ด์ฌ์ฌ๋ก ๋๋ค.
Database layer: ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์์นํ ๊ณ์ธต
3. Flux Architecture
Redux์ ๊ธฐ๋ฐ์ด ๋๋ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ํ์ฉํ ๋ฆฌ์กํธ์ฉ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ, ๊ณง๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ํ๋ ์์ํฌ๋ผ๊ธฐ ๋ณด๋จ ํจํด์ ๊ฐ๊น๋ค. ์ฆ ๋ฐ์ดํฐ์ ํ๋ฆ์ ์ ์ํ ํ๋์ ๋ฐฉ๋ฒ์ด๋ค.
FLUX data flow

Action: ๋ฐ์ดํฐ ๋ณํ๋ฅผ ์ฃผ๊ธฐ์ํด ๋ฐ์ํ๋ ๋์
Dispatcher: ์คํ ์ด๋ก ์ก์ ์ ๋ฐ์กํ๋ ์ญํ
Store: ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ, ์์ ํ ์ก์ ์ ๋ฐ๋ผ ์ํ๋ฅผ ๋ณ๊ฒฝ
View: ์คํ ์ด์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ๋ฉด, ์ ์ ์ธํฐ๋ ์ ์ด ๋ฐ์ํ๋ฉด ๋์ผํ FLUX Cycle์ด ๋ฐ๋ณต๋๋ค.
์ค์ํ ๊ฒ์ ์ด ๊ณผ์ ์ด ๋จ๋ฐฉํฅ์ผ๋ก
๋ฐ์ดํฐ๊ฐ ํ๋ฅธ๋ค๋ ๊ฒ.
MVC ํจํด ๊ด๋ จ ๋งํฌ

Facebook์์ FLUX ์ํคํ ์ฒ๋ฅผ ๋ง๋ ์ด์ ๊ฐ MVC ํจํด์์ ์์๋ ๊ฒ์ผ๋ก ์ด์ ๋ํด ์๊ณ ๊ฐ ํ์๊ฐ ์๋ค.
์ปจํธ๋กค๋ฌ: ์ปจํธ๋กค๋ฌ๋ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ฑฐ๋ ์ ๋ฐ์ดํธํ๋ค.
๋ชจ๋ธ: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ๋ชจ๋ธ์ ์ ๋ฐ์ดํธ๋ ๋ทฐ์ ๋ฐ์๋๋ค.
๋ทฐ: ์ฌ์ฉ์๊ฐ ๋ทฐ๋ฅผ ํตํด ํ ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํ๋ค.

๊ทธ๋ฐ๋ฐ ๋ง์ฝ ์ ์ ์ธํฐ๋ ์ ์ด ๋ทฐ๋ฅผ ํตํด ๋ฐ์ํ๊ณ , ๋ชจ๋ธ์ ์ ๋ฐ์ดํธํ๊ณ ํด๋น ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ ๋๋ค๋ฅธ ๋ทฐ๊ฐ ์ ๋ฐ์ดํธ ๋๊ณ , ์ด ๋ทฐ๊ฐ ๋ ์ด๋ค ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๊ณ ์๋ก์๋ก๊ฐ ์์กดํ๊ฒ ๋๋ ์๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ณต์กํ๊ฒ ๋ง๋ ๋ค. ๊ธฐ๋ฅ์ด ๊ฐ๋จํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ์๊ฒ ์ง๋ง ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ด๋ค ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋๋ค๋ฉด ๋ณต์ก์ฑ์ด ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๊ฒ ๋๊ณ , ์ด๋ ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ธก๋ถ๊ฐ๋ฅ ํด์ง๋ฉฐ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ํ๋ฆ์ด ์์ธก ๊ฐ๋ฅํ FLUX ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ ๊ฒ
๊ฐ ๊ตฌ์ฑ์์์ ์ญํ ์ ์ปจํธ๋กค๋ฌ๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ์ฒ๋ฆฌํ๋ฉฐ ๋ทฐ์ ๋ชจ๋ธ์ ์ฐ๊ฒฐํด์ฃผ๊ณ ๋ชจ๋ธ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ ๋ฐ์ดํธ, ๋ทฐ๋ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ํ๋ฉด์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋๋ฐ, Facebook์์ ์ค๋ช ํ๋ ํจํด์ด ์ผ๋ฐ์ ์ผ๋ก ์ค๋ช ํ๋ MVC ํจํด์ ํ๋ฆ๊ณผ๋ ์ฐจ์ด๊ฐ ์ข ์๋ค. ํน์๋ Facebook์์ ์๋ชป๋ MVC ํจํด์ ์ฌ์ฉํ๊ณ ์์๋ค๊ฑฐ๋, SPA ๊ตฌ์กฐ์ MVC ํจํด์ ์ต์ง๋ก ๋ผ์๋ง์ถ๋ค๋ณด๋ ์ด๋ฐ ํจํด์ด ๋ฐ์ํ๋ค๋ ๋ง๋ ์๋ค. Facebook์์ ๊ฐ๊ฐ์ ๊ตฌ์ฑ์์๋ฅผ ์ด๋ ํ ๊ด์ ์ผ๋ก ๋ฐ๋ผ๋ณด๊ณ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง, ํ๋ก ํธ์๋ ๊ด์ ์์ ์ปจํธ๋กค๋ฌ๋ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ, ๊ฐ๊ฐ์ ๋ชจ๋ธ์ ์ปดํฌ๋ํธ์ ์ํ, ๋ทฐ๋ฅผ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ UI๋ผ๊ณ ์๊ฐํ๋ฉด ๋ฐ์ดํฐ์ ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ด ๊ฐ์ ธ์ฌ ์์คํ ๋ณต์ก์ฑ ์ฆ๊ฐ๋ ๋ฐ์ดํฐ ํ๋ฆ์ ์์ธกํ๊ธฐ ์ด๋ ต๊ฒ ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
4. useReducer
์ปดํฌ๋ํธ์์ ๋ณต์กํ ์ํ๊ด๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ useReducer hook์ ์ฌ์ฉํ๋ค.
useReducer hook ํํ
const ['์ํ ๊ฐ์ฒด', 'dispatch ํจ์'] = useReducer('reducer ํจ์', '์ด๊ธฐ ์ํ', '์ด๊ธฐ ํจ์');
useReducer ํจ์๋ state์ action ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ๋ฐ์์ ์๋ก์ด state๋ฅผ ๋ฐํํ๋ค. dispatch ํจ์๋ ์ํ ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋๋ฐ ์ธ์๋ก action ๊ฐ์ฒด๋ฅผ ๋ฐ๋๋ค.
action ๊ฐ์ฒด
์ด๋ ํ ํ๋์ ๋ํ๋ด๋์ง ์ ์ํ type ์์ฑ๊ณผ ํด๋น ํ๋๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ๋ด์ payload ์์ฑ์ ๋ด๊ณ ์๋ค.
reducer๊ฐ ๋ญ ๋ป ์ด์ง..?
reduce๋ผ๋ ์ค์ด๋ค๋ผ๋ ์๋ฏธ๋ฅผ ๊ฐ์ง๋๋ฐ reducer์ ๋ป์ ์ฐพ์๋ณด๋ฉด ๊ฐ์ถ๊ธฐ๋ผ๊ณ ๋์จ๋ค. ๋ญ์๋ฆฌ์ธ๊ฐ ์ถ์๋๋ฐ ๋ณธ๋ reduce์ ๋ป์ ๋ณ๊ฒฝ์ด๋ผ๋ ์๋ฏธ์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์ reducer๋ ํ์ฌ ์ํ(previousState)๋ฅผ ์๋ก์ด ์ํ(newState)๋ก ๋ณ๊ฒฝํ ๋ ์ฌ์ฉํ๋ ํจ์๊ฐ ๋๋ค.
5. useCallback
React์์ ์ฑ๋ฅ์ ์ต์ ํ ํ ๋ ์ฌ์ฉํ๋ฉฐ, ํจ์๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ (memoization)ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ hook์ด๋ค. ์ปดํฌ๋ํธ๋ ๋ ๋๋ง ๋ ๋๋ง๋ค ๋ด๋ถ์ ์ ์ธํ ํจ์๊ฐ ์๋กญ๊ฒ ์์ฑ๋๋๋ฐ useCallback์ ํตํด ๊ธฐ์กด ํจ์๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ฌ์ฉํ๋ค.
๋ฉ๋ชจ์ด์ ์ด์
(memoization)
ํจ์ ํธ์ถ๊ฒฐ๊ณผ๋ฅผ ์บ์ฑํ๊ณ ๋์ผํ ์ ๋ ฅ์ด ๋ค์ ๋ฐ์ํ ๋ ์บ์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ ์ด๋ค.
const memoizedFunction = useCallback('ํจ์', '๋ฐฐ์ด');
๋๋ฒ์งธ ์ธ์์ธ ์์กด์ฑ ๋ฐฐ์ด์ ์ฝ์ ํ ์์์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ํจ์๋ฅผ ์ฌ์ ์ธํ๋ค.
๊ทธ๋ฐ๋ฐ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋ ๋ง๋ค ํจ์๊ฐ ์๋ก ์ ์ธ๋๋ ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ผ๋ง๋ ๋นจ๋ฆฌ ์คํ๋๋์ง๋ฅผ ์๊ฐํด๋ณด๋ฉด ์ฑ๋ฅ์ ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
๋ฐ๋ผ์ ๋จ์ํ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ํจ์๋ฅผ ๋ฐ๋ณต ์์ฑํ์ง ์๊ธฐ ์ํด
useCallback()์
์ฌ์ฉํ๋ ๊ฒ์ ํฐ ์๋ฏธ๊ฐ ์๊ฑฐ๋ ์คํ๋ ค์ํด์ผ
์ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ํจ์ ๋๋ฑ์ฑ
์๋ฐ์คํฌ๋ฆฝํธ์์ ํจ์๋ ๊ฐ์ฒด(์ ํํ๋ ์ผ๊ธ๊ฐ์ฒด)๋ก ์ทจ๊ธ๋๋๋ฐ, ๋์ผํ ์ฝ๋์ ํจ์์ผ์ง๋ผ๋ ๋ค๋ฅธ ํจ์๋ก ํ๋จํ๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ํ ์ฐธ์กฐ ๋น๊ต๋ฅผ ์ํํ๊ธฐ ๋๋ฌธ์ด๋ค.(๊ฐ ํจ์๊ฐ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๊ฐ์ง์๋ค)
const add1 = () => x + y;
const add2 = () => x + y;
add1 === add2 // false
์ด๋ฌํ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ์ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋๊ธฐ๊ฑฐ๋, ์์์ปดํฌ๋ํธ์ props๋ก ๋๊ธธ ๋ ํจ์์ ์ฐธ์กฐ๊ฐ ๋ฌ๋ผ์ ์์์น ๋ชปํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์์์น ๋ชปํ ์ฑ๋ฅ ๋ฌธ์
fetch API๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ fetchData ํจ์์ useEffect์ ์์กด์ฑ ๋ฐฐ์ด์ ํด๋น ํจ์๋ฅผ ์ถ๊ฐํ ์์๋ค.
import React, { useState, useEffect } from "react";
function Profile({ userId }) {
const [user, setUser] = useState(null);
const fetchUser = () =>
fetch(`https://your-api.com/users/${userId}`)
.then((response) => response.json())
.then(({ user }) => user);
useEffect(() => {
fetchUser().then((user) => setUser(user));
}, [fetchUser]);
// ...
}
fetchUser์ ํจ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด useEffect๋ฅผ ํธ์ถํด ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ฐ์์ค๋ ๋ก์ง์ด๋ค.
๋ฌธ์ ์ ์ ํจ์์ ๋๋ฑ์ฑ์ผ๋ก ์ธํ ์๋ก ๋ค๋ฅธ ํจ์๋ก ํ๋จํ๊ธฐ ๋๋ฌธ์ ๋ฌดํ๋ฃจํ์ ๋น ์ง๋ค.
userId๊ฐ๊ณผ ์๊ด์์ด fetchUser ํจ์๋ ๋ ๋๋ง๋ ๋ ๋ง๋ค ์๋ก์ด ์ฐธ์กฐ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋๊ธฐ ๋๋ฌธ์ useEffect์ effect ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ๊ณ user ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋๊ณ ๋ค์ fetchUser ํจ์์ ์ฐธ์กฐ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ ์ด๋ฐ ์ฌ์ดํด์ ๋ฌดํ๋ฃจํ์ ๋น ์ง๊ฒ ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
์ด๋ด๋ useCallback hook์ ์ด์ฉํด ํจ์์ ๋๋ฑ์ฑ์ ์ ์งํ๋ค.
import React, { useState, useEffect } from "react";
function Profile({ userId }) {
const [user, setUser] = useState(null);
const fetchUser = useCallback(
() =>
fetch(`https://your-api.com/users/${userId}`)
.then((response) => response.json())
.then(({ user }) => user),
[userId]
);
useEffect(() => {
fetchUser().then((user) => setUser(user));
}, [fetchUser]);
// ...
}
useCallback()
ํ ์ ์ด์ฉํด ํจ์์ ์ฐธ์กฐ๊ฐ์ ๋์ผํ๊ฒ ์ ์ง์ํจ๋ค.fetchUserํจ์๋ ์์กด์ฑ ๋ฐฐ์ด์ userId๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋ํ ์ฌํธ์ถ๋์ง ์๋๋ค.
useMemo
useMemo hook๋ํ ๋ฉ๋ชจ์ด์ ์ด์ ๊ธฐ๋ฒ์ด ์ฌ์ฉ๋๋๋ฐ, ๊ธฐ์กด๊ณผ ๋์ผํ ์ ๋ ฅ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ์บ์ฑ๋ ๊ฐ์ ์ฌ์ฌ์ฉํ๋ค.
Last updated