๐ฏ ๋์ ๋ถ: Context API, ๊ณผ์ฐ ๋ง๋ฅ ์นํธํค์ผ๊น?
React Context API๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ๋ฅผ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ ๋ฌํ ์ ์๊ฒ
ํด์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก, 'Prop Drilling' ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ํฐ ๋์์ด
๋ฉ๋๋ค.
ํ์ง๋ง Context๋ฅผ ๋ฌด์ฌ์ฝ ์ฌ์ฉํ๋ค ๋ณด๋ฉด, ์ฑ์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก
์ฑ๋ฅ ์ ํ๋ผ๋ ์์์น ๋ชปํ ํจ์ ์ ๋น ์ง๊ฒ ๋ฉ๋๋ค.
Context์ ๊ฐ์ด ์กฐ๊ธ๋ง ๋ฐ๋์ด๋ ํด๋น Context๋ฅผ
๊ตฌ๋
(Subscribe)ํ๋ ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ฌด์ฐจ๋ณ์ ์ผ๋ก
๋ฆฌ๋ ๋๋ง ๋๋ ํ์ ๋๋ฌธ์
๋๋ค.
์ด๋ฒ ์ฌํ ํ์ต์์๋ Context API ์ฌ์ฉ ์ ๋ฐ์ํ๋
๋ถํ์ํ ๋ฆฌ๋ ๋๋ง(Rendering Waste)์ ๊ทผ๋ณธ์ ์ธ ์์ธ์
ํํค์น๊ณ , ์ด๋ฅผ ๋ฐฉ์งํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ์ ๊ทน๋ํํ๋ ์ค์ง์ ์ธ ์ต์ ํ
์ ๋ต์ ์๊ฐํฉ๋๋ค.
useContext๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค.
์ด๋ ๊ฐ์ ์ผ๋ถ๋ง ์ฌ์ฉํ๋๋ผ๋ ๋ฐ์ํฉ๋๋ค.๐ Context์ ์์ ๋น๊ต์ ๋ฆฌ๋ ๋๋ง ์ ํ
1. Context Provider์ ๊ฐ ๋น๊ต ์๋ฆฌ
Context Provider์ `value` prop์ ๊ธฐ๋ณธ์ ์ผ๋ก
์์ ๋น๊ต(Shallow Comparison)๋ฅผ ์ํํฉ๋๋ค.
์ด์ ๋ ๋๋ง ์์ ์ `value` ๊ฐ์ฒด์ ํ์ฌ ๋ ๋๋ง ์์ ์ `value` ๊ฐ์ฒด๋ฅผ
๋น๊ตํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ, React๋ ๊ฐ์ด ๋ณ๊ฒฝ๋์๋ค๊ณ ํ๋จํ๊ณ
Context๋ฅผ ๊ตฌ๋
ํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌ๋ ๋๋งํฉ๋๋ค.
2. ๋ฆฌ๋ ๋๋ง ๋ญ๋น์ ์ฃผ์ ์์ธ
Context์ `value`์ Object๋ Array๋ฅผ ์ ๋ฌํ ๋, ํด๋น ๊ฐ์ฒด๋ค์
๋งค ๋ ๋๋ง๋ง๋ค ์๋ก์ด ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
๋ค์ ํ๋ ํํ ๋ฐ์ํ๋ ๋ฆฌ๋ ๋๋ง ๋ญ๋น์ ์์ธ์
๋๋ค.
| ํญ๋ชฉ | ์ค๋ช | ๋ฌธ์ ์ |
|---|---|---|
| ์ธ๋ผ์ธ ๊ฐ์ฒด/ํจ์ |
value={{ state, action: () => {} }}์ ๊ฐ์ด Provider์
์ง์ ์ ์๋ ๊ฐ์ฒด๋ ํจ์.
|
๋งค ๋ ๋๋ง๋ง๋ค ์ฐธ์กฐ ์ฃผ์๊ฐ ๋ณ๊ฒฝ๋์ด ์์ ๋น๊ต ์คํจ. |
| ๋จ์ผ ๋ํ Context | ์ฌ์ฉ์ ์ ๋ณด, ํ ๋ง, ์ค์ ๋ฑ ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ํ๋์ Context๋ก ๊ด๋ฆฌ. | ํน์ ์ปดํฌ๋ํธ๊ฐ ์ผ๋ถ ๋ฐ์ดํฐ๋ง ์ฌ์ฉํด๋, ์ ์ฒด ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง๋จ. |
useContext๋ก Context๋ฅผ ๊ฐ์ ธ์จ
์ปดํฌ๋ํธ๋ React์ memo๋ฅผ ์ฌ์ฉํ๋๋ผ๋ Context ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด
๋ฌด์กฐ๊ฑด ๋ฆฌ๋ ๋๋ง๋ฉ๋๋ค. Context์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด
memo์ Props ๋น๊ต ๋ก์ง์ ์ฐํํ๊ณ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํฉ๋๋ค.๐ก ์ฌํ ์ต์ ํ ์ ๋ต 3๊ฐ์ง
Context API์ ๋ฆฌ๋ ๋๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ์ธ ๊ฐ์ง ํต์ฌ ์ ๋ต์ '์ฐธ์กฐ
๋ฌด๊ฒฐ์ฑ ์ ์ง', 'Context ๋ถ๋ฆฌ', '์ ํ์ ๊ตฌ๋
'์
๋๋ค.
1. ๐ฏ ๊ฐ ๋ฉ๋ชจ์ด์ ์ด์ : useMemo์ useCallback ํ์ฉ
Provider์ `value`๊ฐ ๊ฐ์ฒด๋ ํจ์์ผ ๊ฒฝ์ฐ,
๋งค ๋ ๋๋ง๋ง๋ค ์๋ก์ด ์ฐธ์กฐ๊ฐ ์์ฑ๋์ง ์๋๋ก
useMemo์ useCallback์ ์ฌ์ฉํ์ฌ
๋ฉ๋ชจ์ด์ ์ด์
ํด์ผ ํฉ๋๋ค.
✅ `value` ๊ฐ์ฒด ๋ฉ๋ชจ์ด์ ์ด์
(useMemo)
const memoizedValue = useMemo(() => ({ stateData, actions }),
[stateData, actions]);
// value๊ฐ stateData ๋๋ actions๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์๋ก์ด ์ฐธ์กฐ๋ฅผ
๊ฐ์ง.
✅ ํธ๋ค๋ฌ ํจ์ ๋ฉ๋ชจ์ด์ ์ด์
(useCallback)
const handleAction = useCallback(() => { /* ๋ก์ง */ },
[dependency]);
// actions ๊ฐ์ฒด ๋ด์ ํจ์๋ค์ด ๋ถํ์ํ๊ฒ ์ฌ์์ฑ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ
useMemo์ ์์กด์ฑ(dependency) ๋ณ๊ฒฝ์ ๋ง์.
2. ๐งฉ Context ๋ถ๋ฆฌ: State์ Dispatch ๋ถํ
๋๊ท๋ชจ Context๋ฅผ ์ฌ์ฉํ๋ ๋์ , ์์ฃผ ๋ณํ๋ ์ํ(State)์
๋ณ๊ฒฝ๋์ง ์๋ ์ก์
(Dispatch/Setter ํจ์)์ ๋ณ๋์
Context๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ์ต์ ํ ๊ธฐ๋ฒ ์ค ํ๋์
๋๋ค.
์ก์
Context๋ ํ ๋ฒ ์ ์๋๋ฉด ๋ณํ์ง ์์ผ๋ฏ๋ก, ์ด๋ฅผ
๊ตฌ๋
(Subscribe)ํ๋ ์ปดํฌ๋ํธ๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋ฆฌ๋ ๋๋ง
๋์ง ์์ต๋๋ค.
๐ ๋ถ๋ฆฌ ํจํด์ ํจ๊ณผ
- ✔️ ์ํ Context ๊ตฌ๋ ์ปดํฌ๋ํธ: ์ํ(State)๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ๋ฆฌ๋ ๋๋ง๋จ.
- ✔️ ์ก์ Context ๊ตฌ๋ ์ปดํฌ๋ํธ: ์ก์ ํจ์๋ ๋ถ๋ณํ๋ฏ๋ก, ์ํ ๋ณ๊ฒฝ ์ ๋ฆฌ๋ ๋๋ง ๋์ง ์์.
3. ๐ ์ ํ์ ๊ตฌ๋ ์ ์ํ Custom Hook
Context๋ฅผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๊ฐ Context์ ์ผ๋ถ ๊ฐ(user.name)๋ง
ํ์๋ก ํ ๋, Context ์ ์ฒด(user ๊ฐ์ฒด)๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ๋ ๋๋ง๋๋
๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ด๋ฅผ ์ํด Custom Hook์ ๋ง๋ค์ด ํน์ ํ๋๋ง ์ถ์ถํ๊ณ , ํด๋น
ํ๋๊ฐ ๋ณ๊ฒฝ๋์์ ๋๋ง ๊ฐ์ ๋ก ์
๋ฐ์ดํธํ๋๋ก ๋ก์ง์ ๊ตฌํํ ์ ์์ต๋๋ค.
(์: Redux์ useSelector์ ์ ์ฌ)
๐ Custom Hook ๊ตฌ์กฐ ์์
function useCustomState() {
const context = useContext(MyContext);
const specificValue = context.valueA;
return specificValue;
}
์ด ํจํด์ Context์ ๊ฐ ๋น๊ต๋ฅผ ์ง์ ์ํํ๋ ๋ก์ง(์:
useSyncExternalStore ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ Custom Hook์ ์จ๊ฒจ,
์ค์ ๋ก ํ์ํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง ์ปดํฌ๋ํธ๋ฅผ
์
๋ฐ์ดํธํ๋๋ก ํฉ๋๋ค.
✅ Context ์ต์ ํ๋ ๊ณง ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ ๊ด๋ฆฌ
React Context API๋ ํธ๋ฆฌํ์ง๋ง, ์ฑ๋ฅ ์ธก๋ฉด์์๋ ํญ์ ๊ฒฝ๊ณํด์ผ ํ ๋ถ๋ถ์ด
์์ต๋๋ค.
๊ฒฐ๊ตญ Context API ์ต์ ํ์ ํต์ฌ์
Provider์ `value`์ ์ ๋ฌ๋๋ ๊ฐ์ฒด ๋๋ ํจ์์ ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์
์ ์งํ์ฌ, React์ ์์ ๋น๊ต๊ฐ ๋ถํ์ํ๊ฒ ์คํจํ์ง ์๋๋ก ๊ด๋ฆฌํ๋
๊ฒ์
๋๋ค.
๐ก 3์ค ์์ฝ ๋ฐ ์ต์ข ์ ๊ฒ ๋ฆฌ์คํธ
- 1. ๋ฉ๋ชจ์ด์ ์ด์ : Provider์ `value`์ ๋ด๋ถ ํจ์๋ ๋ฐ๋์ `useMemo`์ `useCallback`์ผ๋ก ๊ฐ์ธ์ ์ฐธ์กฐ ๋ณ๊ฒฝ์ ๋ง์ผ์ญ์์ค.
- 2. ๋ถ๋ฆฌ ์ ๋ต: ์์ฃผ ๋ณํ๋ ๋ฐ์ดํฐ์ ๋ณํ์ง ์๋ ์ก์ (ํจ์)์ ๋ ๊ฐ์ Context๋ก ๋ถ๋ฆฌํ์ฌ ๊ตฌ๋ ๋ฒ์๋ฅผ ์ต์ํํ์ญ์์ค.
- 3. ๋์ ๊ฒํ : Context์ ๋ฆฌ๋ ๋๋ง ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๋๋ค๋ฉด, Zustand, Jotai ๋ฑ ๋ฆฌ๋ ๋๋ง ๊ด๋ฆฌ๊ฐ ๋ ์ฉ์ดํ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ ํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
์ด ์ฌํ ์ ๋ต๋ค์ ์ ์ฉํ์ฌ ๋ถํ์ํ ๋ ๋๋ง์ ์ค์ธ๋ค๋ฉด, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์ ๊ฒฝํ(UX)๊ณผ ๊ฐ๋ฐ ํจ์จ์ฑ์ด ํฌ๊ฒ ํฅ์๋ ๊ฒ์ ๋๋ค. ๊พธ์คํ ํ๋กํ์ผ๋ง์ ํตํด ๋ ๋๋ง ๋ญ๋น๋ฅผ ํ์ธํ๋ ์ต๊ด์ ๋ค์ด์ธ์.

๋๊ธ ์ฐ๊ธฐ