๋ถ๋ชจ์์ ์์์ ์์์ ์์๊น์ง... ์ด ๊ณ ํต์ ์ด๋ป๊ฒ ๋๋ผ๊น์?
React๋ก ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ์ด๋ฐ ์ํฉ์ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค.
์ต์์ ์ปดํฌ๋ํธ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊น์ํ ํ์ ์ปดํฌ๋ํธ์์ ์จ์ผ ํ๋๋ฐ,
์ค๊ฐ์ ๋ ์ปดํฌ๋ํธ๋ค์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ง๋ ์์ผ๋ฉด์ ๊ทธ์
'์ ๋ฌ'๋ง ํ๊ณ ์๋ ์ํฉ ๋ง์ด์ฃ .
๋ง์น 10๋ช
์ด ์ผ๋ ฌ๋ก ์์ ๋ฌผ๋์ด๋ฅผ ๋๋ฅด๋ ๊ฒ๊ณผ ๋น์ทํฉ๋๋ค.
์ฐ๋ฆฌ๋ ์ด๊ฒ์ Props Drilling(ํ๋กญ์ค ๋๋ฆด๋ง)์ด๋ผ๊ณ
๋ถ๋ฆ
๋๋ค.
์ค๋์ ์ด ํ์์ด ์ ๋ฌธ์ ๊ฐ ๋๋์ง, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ฐ์ํ๊ฒ ํด๊ฒฐํ๋
3๊ฐ์ง ํจํด์ ์ ๋ฆฌํด ๋๋ฆฝ๋๋ค.
๐ง 1. Props Drilling, ์ ๋์๊ฐ์?
Props Drilling ์์ฒด๋ ๋์ ํจํด์ด ์๋๋๋ค.
React์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ๋ฆ์ ๋จ๋ฐฉํฅ(Top-down)์ด๊ธฐ ๋๋ฌธ์
์์ฐ์ค๋ฌ์ด ํ์์
๋๋ค.
ํ์ง๋ง ๊น์ด๊ฐ ๊น์ด์ง์๋ก(Depth๊ฐ 3~4๋จ๊ณ๋ฅผ ๋์ด๊ฐ์๋ก) ๊ฐ๋ฐ์๋ฅผ ๊ดด๋กญํ๋
์น๋ช
์ ์ธ ๋จ์ ๋ค์ด ๋๋ฌ๋ฉ๋๋ค.
๐ ์ฃผ์ ๋ถ์์ฉ 3๊ฐ์ง
-
์ฝ๋ ์ถ์ ์ ์ด๋ ค์: ๋ฐ์ดํฐ์ ์ถ์ฒ๋ฅผ ์ฐพ๊ธฐ ์ํด ๋ถ๋ชจ
์ปดํฌ๋ํธ๋ฅผ ๊ณ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ์ผ ํฉ๋๋ค.
-
์ค๊ฐ ์ปดํฌ๋ํธ์ ์ค์ผ: ์ค๊ฐ์ ์๋ ์ปดํฌ๋ํธ๋ค์
์์ ์๊ฒ ํ์ ์๋ Props ๋๋ฌธ์ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง๋๋ค.
-
์ ์ง๋ณด์ ๋น์ฉ ์ฆ๊ฐ: Props์ ์ด๋ฆ์ ๋ฐ๊พธ๊ฑฐ๋ ํ์
์
๋ณ๊ฒฝํ๋ ค๋ฉด, ๊ฑฐ์ณ๊ฐ๋ ๋ชจ๋ ์ปดํฌ๋ํธ ํ์ผ์ ์์ ํด์ผ ํฉ๋๋ค.
๐ฅ️ ๊ณ ํต์ค๋ฌ์ด ์ฝ๋ ์์
function App() {
const user = { name: 'Gemini' };
return <Header user={user} />;
}
function Header({ user }) {
// Header๋ user๊ฐ ํ์ ์์ง๋ง ์ ๋ฌํด์ผ ํจ ๐ฉ
return <UserMenu user={user} />;
}
... (๊ณ์ ๋ฐ๋ณต)
๐งฉ 2. ํด๊ฒฐ์ฑ A: ์ปดํฌ๋ํธ ํฉ์ฑ (Composition)
๋ง์ ๋ถ๋ค์ด Props Drilling์ ๋ง๋๋ฉด ๋ฐ๋ก Context API๋ Redux๋ฅผ
๋ ์ฌ๋ฆฝ๋๋ค.
ํ์ง๋ง ๊ฐ์ฅ ๋จผ์ ๊ณ ๋ คํด์ผ ํ ๊ฐ๋ณ๊ณ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์
์ปดํฌ๋ํธ ํฉ์ฑ์
๋๋ค.
`children` prop์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ๋ฉด ์ค๊ฐ ์ ๋ฌ์๋ค์ ์์จ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ๋ฅผ ์ง์ ๋ ๋๋งํด์ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ ๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ์ค๊ฐ ์ปดํฌ๋ํธ๋ "๋ฌด์์ด ๋ค์ด์ฌ์ง ๋ชจ๋ฅด๋" ๊ตฌ๋ฉ(`children`)๋ง ๋ซ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
const user = { name: 'Gemini' };
// Header์๊ฒ ๋ด์ฉ์ ์ง์ ์ฃผ์ !
return (
<Header>
<ProfileImage user={user} />
</Header>
);
}
์ด์ `Header` ์ปดํฌ๋ํธ๋ `user` prop์ ์ ํ์๊ฐ ์์ด์ก์ต๋๋ค.
๐ก 3. ํด๊ฒฐ์ฑ B & C: Context API์ ์ ์ญ ์ํ ๊ด๋ฆฌ
์ปดํฌ๋ํธ ํฉ์ฑ๋ง์ผ๋ก ํด๊ฒฐํ๊ธฐ์ ๊ตฌ์กฐ๊ฐ ๋๋ฌด ๋ณต์กํ๊ฑฐ๋, ์ฌ๋ฌ ๊ณณ์์ ๊ณตํต์ผ๋ก ์ฐ๋ ๋ฐ์ดํฐ(ํ ๋ง, ๋ก๊ทธ์ธ ์ ๋ณด ๋ฑ)๋ผ๋ฉด ๋๊ตฌ๋ฅผ ์จ์ผ ํฉ๋๋ค.
✅ Context API (React ๋ด์ฅ)
๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น ์์ด ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
`Provider`๋ก ๊ฐ์ธ์ง ๋ชจ๋ ํ์ ์ปดํฌ๋ํธ์์ ์งํต ํฐ๋์
๋ซ์ด ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์ธ ์ ์์ต๋๋ค.
๋จ, ์ฆ์ ์ํ ๋ณ๊ฒฝ ์ ๋ถํ์ํ ๋ ๋๋ง ์ด์๊ฐ ๋ฐ์ํ ์ ์์ด ์ฃผ์๊ฐ
ํ์ํฉ๋๋ค.
✅ ์ ์ญ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Zustand, Redux, Recoil)
ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ํฌ๋ค๋ฉด ์ ๋ฌธ์ ์ธ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๋ต์
๋๋ค.
์ต๊ทผ์๋ ๋ณด์ผ๋ฌํ๋ ์ดํธ ์ฝ๋๊ฐ ๋ง์ Redux๋ณด๋ค, ์ง๊ด์ ์ธ
Zustand๊ฐ ํฐ ์ธ๊ธฐ๋ฅผ ๋๊ณ ์์ต๋๋ค.
๐ ํด๊ฒฐ์ฑ ๋น๊ต ์์ฝ
| ๋ฐฉ๋ฒ | ์ถ์ฒ ์ํฉ | ๋์ด๋ |
|---|---|---|
| Composition | ๊น์ด๊ฐ 2~3๋จ๊ณ, ๊ตฌ์กฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ ์ | ⭐ (์ฌ์) |
| Context API | ํ ๋ง, ๋ค๊ตญ์ด ๋ฑ ๋ณ๊ฒฝ์ด ์ ์ ์ ์ญ ๋ฐ์ดํฐ | ⭐⭐ (๋ณดํต) |
| Zustand/Redux | ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง, ๋น๋ฒํ ์ ๋ฐ์ดํธ | ⭐⭐⭐ (์ด๋ ค์) |
๐๋ฌด์กฐ๊ฑด ๋๊ตฌ๋ถํฐ ์ฐพ์ง ๋ง์ธ์
Props Drilling์ด ๋ฐ์ํ๋ค๊ณ ํด์ ๋ฌด์กฐ๊ฑด Context๋ Redux๋ฅผ ๋์
ํ๋ ๊ฒ์
'๋ชจ๊ธฐ ์ก์ผ๋ ค๋ค ์ด๊ฐ์ผ๊ฐ ํ์ฐ๋ ๊ฒฉ'์ด ๋ ์ ์์ต๋๋ค.
๋จผ์ ์ฝ๋๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํ ์ ์๋ ์ปดํฌ๋ํธ ํฉ์ฑ์
์๋ํด ๋ณด์ธ์.
-
Props Drilling์ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด ๋ถํ์ํ ์ค๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๊ฑฐ์น๋
ํ์์
๋๋ค.
- ์ด๋ก ์ธํด ์ฝ๋ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง๊ณ ์ถ์ ์ด ํ๋ค์ด์ง๋๋ค.
-
1๋จ๊ณ: `children`์ ํ์ฉํ ํฉ์ฑ์ ๊ณ ๋ คํ์ธ์.
-
2๋จ๊ณ: ์ ์ญ์ ์ธ ๋ฐ์ดํฐ๋ผ๋ฉด Context API๋ Zustand๋ฅผ
์ฌ์ฉํ์ธ์.
์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์์ ๋ถํ์ํ๊ฒ props๋ฅผ ์ ๋ฌํ๊ณ ์๋ '๋ฐฐ๋ฌ๋ถ ์ปดํฌ๋ํธ'๋
์๋์ง ์ง๊ธ ๋ฐ๋ก ํ์ธํด ๋ณด๋ ๊ฑด ์ด๋จ๊น์?

๋๊ธ ์ฐ๊ธฐ