๐งฉ 04. Props Drilling์ ๋น๊ทน๊ณผ State Colocation
๐ ๊ฐ์
์ํ๋ฅผ ๋ฌด์กฐ๊ฑด ์ต์์(App)๋ก ๋์ด์ฌ๋ฆด ๋ ๋ฐ์ํ๋ ๋ ๋๋ง ํญํ์ ์์ธ๊ณผ, ์ํ๋ฅผ ์๋ง์ ์์น์ ๋ฐฐ์น(Colocation)ํ๋ 5๋ ์ฐจ์ ์ค๊ณ๋ฒ์ ๋ฐฐ์๋๋ค.
๐ฏ ์ด ์น์ ์ ์ฝ๊ณ ๋๋ฉด:
- ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(Redux, Zustand)๋ฅผ ๋์ ํ๊ธฐ ์ ์ ์ปดํฌ๋ํธ ์ค๊ณ๋ฅผ ๋จผ์ ์์ฌํ ์ ์๋ค.
- ์ํ๋ฅผ ์ต์์ ์ปดํฌ๋ํธ๋ก ๋์ด์ฌ๋ ธ์ ๋(Lifting State Up) ๋ฐ์ํ๋ ๋ ๋๋ง ํญํ(์ฌ์)์ ์ดํดํ๋ค.
- ์ํ๋ฅผ "๊ฐ์ฅ ํ์๋ก ํ๋ ์ปดํฌ๋ํธ์ ์ต๋ํ ๊ฐ๊น๊ฒ ๋ฐฐ์น(State Colocation)"ํ๋ ํต์ฌ ๊ธฐ์ค์ ํ๋ํ๋ค.
๐ ๋ชฉ์ฐจ
- ๐ค ์ ์์์ผ ํ๋๊ฐ: '๋์ด์ฌ๋ฆฌ๊ธฐ(Lifting)'์ ์ด๋ฉด
- ๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
- ๐งฉ State Colocation: ์ํ๋ ์๊ธฐ ์๋ฆฌ์ ๋์ด๋ผ
- ๐ฅ ์๋ฌ ํด๊ฒฐ ์นดํ๋ก๊ทธ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 15๋ถ / ํต์ฌ ํํธ: 8๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ์์ฒ (์ ์
): "๊ฒ์๊ธ ๋ชฉ๋ก ์ ์ผ ๋์ ์๋ ๋๊ธ์ '์ข์์' ๋ฒํผ์ ์๋ก ๋ฌ์์ด์! ์ด์
App.tsx์likes์ํ๋ฅผ ๋๊ณ ํ๋กญ์ค๋ก ๋๊ธธ๊ฒ์." - ์ํธ(๋ฆฌ๋): "์์ฒ ๋... ๋๊ธ ํ๋์ ์ข์์๋ฅผ ๋๋ ๋๋ฐ ์ ์ปค๋ฎค๋ํฐ ์ ์ฒด ์ฌ์ดํธ๊ฐ ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ฉด์ ์๋ก๊ณ ์นจ(๋ฆฌ๋ ๋๋ง)๋๋ ๊ฑฐ์ฃ ?"
๐ค ์ ์์์ผ ํ๋๊ฐ: '๋์ด์ฌ๋ฆฌ๊ธฐ(Lifting)'์ ์ด๋ฉด
React ๊ณต์ ๋ฌธ์์์๋ ๋ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ ์ํ๋ฅผ ๊ณต์ ํด์ผ ํ ๋ "์ํ๋ฅผ ๊ณตํต ๋ถ๋ชจ ์์๋ก ๋์ด์ฌ๋ฆฌ์ธ์(Lifting State Up)" ๋ผ๊ณ ๊ฐ๋ฅด์ณ. ์ด ์์น์ ์์ฃผ ํ๋ฅญํ์ง๋ง, ์ ์ ๊ฐ๋ฐ์๋ค์ ์ข ์ข ์ด ๋ง์ ๊ณกํดํด์ ๋ํ ์ฌ๊ณ ๋ฅผ ์น๊ณ ๋ง์.
๐ค ์ ๊น, ๋จผ์ ์๊ฐํด ๋ด
์ฑ์์ ์ฐ์ด๋ ๋ชจ๋ ์ํ๋ฅผ ์ ์ผ ๊ผญ๋๊ธฐ์ธApp์ปดํฌ๋ํธ ํ๋์ ๋ค ๋ชฐ์๋ฃ๊ณ ์์๋ค์๊ฒ ๋๋ ์ฃผ๋ฉด ๊ด๋ฆฌ๊ฐ ํธํ์ง ์์๊น?
// โ ์์ฒ ์ด์ ํญํ ์ค๊ณ (Naive Approach)
function App() {
const [theme, setTheme] = useState('light');
const [currentUser, setCurrentUser] = useState(null);
// ๐ฃ ์ด ์ฑ์ ์์ฒ ๊ฐ ๋๊ธ ์ค "๋จ ํ๋"์ ์ข์์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ฐ์ด๋ ์ํ
const [commentLikes, setCommentLikes] = useState({});
const handleLike = (commentId) => {
setCommentLikes(prev => ({ ...prev, [commentId]: prev[commentId] + 1 }));
};
return (
<div className={`app ${theme}`}>
<CommunityHeader user={currentUser} />
<Sidebar />
{/* ๐ฅ ํ๋กญ์ค ๋๋ฆด๋ง์ ์์ */}
<Feed commentLikes={commentLikes} onLike={handleLike} />
</div>
);
}์์ฒ ์ด์ ์ฝ๋๋ ๊ฒ๋ณด๊ธฐ์ ์๋ํด. ํ์ง๋ง ์ฌ์ฉ์๊ฐ ํผ๋ ๋งจ ์๋์ ์จ๊ฒจ์ง ๋๊ธ์ '์ข์์' ๋ฒํผ์ ํด๋ฆญํ๋ ์๊ฐ ์ฑ ์ ์ฒด์ ๋์ฐํ ์ฌ์์ด ์์๋ผ.
๐๏ธ ๋น์ ๋ก ๋จผ์ ์ดํดํ๊ธฐ
๐ง 5์ด์๊ฒ ์ค๋ช ํ๋ค๋ฉด?
์ฐ๋ฆฌ ์ง์ ์๋น , ์๋ค, ์์๊ฐ ์ด๊ณ ์์ด.
์์๊ฐ ์๊ธฐ ์ฅ๋๊ฐ ๋ก๋ด์ ์๊น์ ํ๋์์์ ๋นจ๊ฐ์์ผ๋ก ์น ํ์ด.
์ด ์ฌ์ค์ ์ง์์ ์ต๊ณ ๋์ฅ(์๋น ) ์๊ฒ ๋ณด๊ณ (App์ ์ํ ๋๊ธฐ)ํ์ง.
๊ทธ๋ฌ์ ์๋น ๋ ํ์ฑ๊ธฐ๋ฅผ ๋ค๊ณ ์จ ์ง์์ ์๋ฆฌ์ณค์ด!
"๋น์! ์ฐ๋ฆฌ ์ง ์ํ๊ฐ ๋ณ๊ฒฝ๋์๋ค! ์จ ๊ฐ์กฑ ๊ตฌ์ฑ์์ ํ๋ ์ผ์ ๋ฉ์ถ๊ณ ๊ฐ์์ ๋ฐฉ์ ์น ๋ค ์ธํ ๋ฆฌ์ด(๋ฆฌ๋ ๋๋ง) ๋ค์ ํด๋ผ!"
๋ก๋ด ์์น ํ๋ ํ์ ๋ฟ์ธ๋ฐ, ํ์ฅ์ค์ ์๋ ์๋น ๋, ์ฃผ๋ฐฉ์ ์๋ ์ผ์ด๋, ์๋ฐฉ์ ๋๋๋ ๋ถํ์ํ๊ฒ ์๊ธฐ ๋ฐฉ์ ํ๋ฌผ๊ณ ๋ค์ ์ง๊ฒ ๋ ์ ์ด์ผ.
โ
ํต์ฌ ์๋ฆฌ:
React์ ์ ๋ ๊ท์น: "๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ํ(State)๊ฐ ๋ณ๊ฒฝ๋๋ฉด, ๊ทธ ์ปดํฌ๋ํธ๊ฐ ํ๊ณ ์๋ ๋ชจ๋ ์์ ์ปดํฌ๋ํธ๋ค์ ๊ฐ์ ๋ก ๋ฆฌ๋ ๋๋ง๋๋ค."
์ํ๋ฅผ ์ต์๋จ(App์ด๋ ์ต์์ Context)์ผ๋ก ๋ฌด์ง์ฑ์ผ๋ก ๋์ด์ฌ๋ฆฌ๋ฉด, ๋จ๋ง ๋
ธ๋(๋ฆฌํ)์์ ์ผ์ด๋ ์กฐ๊ทธ๋งํ ์ํธ์์ฉ ํ๋๊ฐ ์ฑ ์ ์ฒด ํธ๋ฆฌ๋ฅผ ๋ชจ์กฐ๋ฆฌ ๋ค์ ๊ณ์ฐ(Diffing)ํ๊ฒ ๋ง๋ค์ด ์ฑ๋ฅ์ ์์ ํ ๋ฐ์ด ๋
๋๋ค. ๊ฒ๋ค๊ฐ ๊ทธ ์ํ์ ํจ์๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์ค๊ฐ์ ๊ปด์๋ ์๋ง์ ์ปดํฌ๋ํธ๋ค์ด ์ฐ์ง๋ ์์ props๋ฅผ ์ฃผ๋ ์ฃผ๋ ๋ฌ๊ณ ๋๊ฒจ์ฃผ๊ฒ ๋์ฃ . ์ด๋ฅผ Props Drilling์ด๋ผ๊ณ ํฉ๋๋ค.
๐งฉ State Colocation: ์ํ๋ ์๊ธฐ ์๋ฆฌ์ ๋์ด๋ผ
์ด ์ฌ์์ ๋ง๊ธฐ ์ํด 5๋
์ฐจ ์๋์ด๋ค์ด ๊ฐ์ฅ ๋จผ์ ์ฒดํฌํ๋ ์ค๊ณ ์์น์ด ๋ฐ๋ก State Colocation(์ํ์ ์ ์ ๋ฐฐ์น) ์ด์ผ.
"์ํ๋ ๊ทธ๊ฒ์ ํ์๋ก ํ๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ์ต๋ํ ๊ฐ๊น์ด ๊ณณ(์ตํ์ ๊ณ์ธต)์ ๋์ด๋ผ" ๋ผ๋ ๋ป์ด์ง.
โ ์ํธ์ ๋ฆฌํฉํ ๋ง: ์ํ๋ฅผ ๋๋ฝ์ผ๋ก ๋จ์ด๋จ๋ฆฌ๊ธฐ
๋๊ธ์ '์ข์์' ์ํ๋ App์ด๋ Feed ์ปดํฌ๋ํธ๊ฐ ์ ํ์๊ฐ ์ ํ ์์ด. ์ค๋ก์ง ๊ทธ ๋๊ธ ์ปดํฌ๋ํธ ์ค์ค๋ก๋ง ์๊ณ ์์ผ๋ฉด ๋ผ!
// โ
์ฐ์ํ ์ค๊ณ (Pro Approach: State Colocation)
// 1. App์ ๊ฐ๋ฒผ์์ก๋ค.
function App() {
const [theme, setTheme] = useState('light');
return (
<div className={`app ${theme}`}>
<CommunityHeader />
<Sidebar />
<Feed /> {/* props drilling์ด ์ฌ๋ผ์ง! */}
</div>
);
}
// 2. ์ํ๋ฅผ ์ง์ง ํ์ํ ์ต๋ง๋จ ์ปดํฌ๋ํธ ์์ผ๋ก ์ง์ด๋ฃ๋๋ค.
function CommentItem({ commentData }) {
// ๐ฏ ์ด ๋๊ธ๋ง์ ๋
์์ ์ธ(Local) ์ํ!
const [likes, setLikes] = useState(commentData.initialLikes);
return (
<div className="comment">
<p>{commentData.text}</p>
<button onClick={() => setLikes(likes + 1)}>
์ข์์ {likes}
</button>
</div>
);
}์ด์ ํน์ ๋๊ธ์ ์ข์์ ๋ฒํผ์ ๋๋ฌ๋, ๊ทธ ๋๊ธ ํ๋(CommentItem)๋ง ๋ฆฌ๋ ๋๋ง๋ผ. App์ด๋ ํ์ ์ปดํฌ๋ํธ๋ค์ ์๋ฌด๋ฐ ํ๊ฒฉ์ ๋ฐ์ง ์์ง. ์ด๊ฒ์ด ๋ฐ๋ก ์ํคํ
์ฒ ๋จ์์ ๊ฐ์ฅ ๊ณต์ง๊ณ ์๋ฒฝํ ๋ ๋๋ง ์ต์ ํ์ผ.
๐ฅ ์๋ฌ ํด๊ฒฐ ์นดํ๋ก๊ทธ
โ ๋ฌด์ง์ฑ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋๊ตฌ(Zustand, Redux) ๋จ์ฉ
์ํฉ: ์์ฒ ์ด๊ฐ "์! ํ๋กญ์ค ๋๋ฆด๋ง์ด ๋๋ฌด ๊ท์ฐฎ์! ๋ชจ๋ ์ํ๋ฅผ ์ ๋ถ Redux๋ Zustand ์ ์ญ ์คํ ์ด(Global Store)์ ๋ฐ์๋๊ณ ์ด๋์๋ ๊ฐ์ ธ๋ค ์ฐ์!" ๋ผ๊ณ ์ฃผ์ฅํ๋ค.
์์ธ: ์ํ๋ฅผ ์ปดํฌ๋ํธ ๋ฐ(Store)์ผ๋ก ๋นผ๋๋ค๊ณ ํด์ ์ํ๊ฐ ์ข์์ง๋ ๊ฒ ์๋์ผ.
์ ์ญ ์คํ ์ด์ ์ํ๋ฅผ ๋๋ ์๊ฐ, ํด๋น ์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉ์ฑ์ด ๋ฐ์ด ๋. ๋์ค์ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์ด ํ์๊ฐ์
ํผ์ ๊ทธ๋๋ก ๋ผ์ด๋ค ์ฐ๊ณ ์ถ์๋ฐ, Zustand ์คํ ์ด์ ๊ฒฐํฉ(Coupling)๋์ด ์์ด์ ๋ผ๊ฐ ์๊ฐ ์์ด์ง๋ ์ ์ง๋ณด์ ์คํ๊ฒํฐ๊ฐ ๋์ด๋ฒ๋ฆฌ์ง.
ํด๊ฒฐ์ฑ
:
์ ์ญ ์ํ๋ "์ ๋ง๋ก ์ฑ์ ๋ชจ๋ ๊ตฌ์์์(Header, Sidebar, Mypage ๋ฑ) ๋์ผํ๊ฒ ์ณ๋ค๋ด์ผ ํ๋ ๋ฐ์ดํฐ(์: ํ์ฌ ๋ก๊ทธ์ธํ ์ ์ ์ ๋ณด, ๋คํฌ ๋ชจ๋ ํ
๋ง, ์ธ์ด ์ค์ )" ์ ํํด์๋ง ์ ํ์ ์ผ๋ก ์จ์ผ ํด.
์
๋ ฅ ํผ์ ๋ชจ๋ฌ ํ์ฑํ ์ฌ๋ถ๋, ๊ฒ์๊ธ ํ๋์ ์ ๊ธฐ/ํผ์น๊ธฐ ๋ฒํผ ์ํ๋ ์ฒ ์ ํ๊ฒ ์ง์ญ ์ํ(useState)๋ก ๊ณ ๋ฆฝ(Isolate)์์ผ์ผ ํด.
๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
| ์ํ์ ์์น | โ ๋์ ์ค๊ณ ์์ | โ ์ข์ ์ค๊ณ ์์ |
|---|---|---|
| ๋ชจ๋ฌ์ฐฝ Open ์ํ | Redux ์คํ ์ด์ isModalOpen ๋ฐ๊ธฐ | <ModalWrap> ์ปดํฌ๋ํธ ๋ด๋ถ์ useState |
| ๋๊ธ ์ ๋ ฅ์ฐฝ ๋ด์ฉ | ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ text ์ํ ๋ง๋ค๊ณ ๋ด๋ฆฌ๊ธฐ | <CommentInput> ๋ด๋ถ์ useState |
| ๋คํฌ/๋ผ์ดํธ ํ ๋ง | <ThemeToggler> ์ง์ญ ์ํ | ์ฑ ์ต์์ Context/์ ์ญ ์ํ (์ด๊ฑด ๋์ด์ฌ๋ ค์ผ ํจ) |
๐ก ํ ์ค๋ก ๊ธฐ์ตํ๊ธฐ
์ต๋ํ ๋ฆ๊ฒ, ์ต๋ํ ๋ฎ๊ฒ(๋ฐฉ๊ตฌ์์) ์ํ๋ฅผ ์ ์ธํ๋ผ. ๊ทธ๊ฒ์ ํ์๋ก ํ๋ ์ปดํฌ๋ํธ๋ค๋ง์ '์ต์ ๊ณตํต ๋ถ๋ชจ'๊น์ง๋ง ์ํ๋ฅผ ๋์ด์ฌ๋ฆฌ๋ ๊ฒ์ด ํ๋ก ํธ์๋ ์ํคํ ์ฒ์ ์ ๋ถ๋ค.
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
๋ด๊ฐ ์ง ๋๊ธ ์ข์์ ๋ฒํผ ๋๋ฌธ์ ์ปค๋ฎค๋ํฐ ์ฌ์ดํธ ์ ์ฒด๊ฐ ์ฌ๋ ๋๋ง๋๊ณ ์์๋ค๋ ๋ถ๋๋ฌ์์ ์ฅ๊ตฌ๋ฉ์๋ผ๋ ์จ๊ณ ์ถ๋ค. ๋ฌด์กฐ๊ฑด ์๋ก ๋์ด์ฌ๋ฆฌ๋ผ๋ ์๋ ๋ธ๋ก๊ทธ ๊ธ๋ง ๋ฏฟ์๋ ๋ด ํ์ด๋ค.
๐ก "์ํ๋ ์ง์ง ํ์ํ ์ต๋ง๋จ ๋ฐฉ๊ตฌ์์ ๊ณ ๋ฆฝ(Colocation) ์ํค์. ๋ถํ์ํ ์ ์ญ ์ํ๋ ์ ์ง๋ณด์ ์คํ๊ฒํฐ์ ์ํ์ด๋ค!"
๊ฐ์กฑ ๋น์ ๋ฅผ ๋ค์ผ๋๊น ํ ์๋ฟ๋๋ค. ์๋ฌด๋ฆฌ Redux, Zustand๊ฐ ํธํด๋ ๋จ์ฉํ์ง ๋ง์์ผ๊ฒ ๋ค๋ ๋ค์ง์ ํด๋ณธ๋ค. ์ํ๋ ํ์ํ ๋ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ณตํต ๋ถ๋ชจ๊น์ง๋ง ์ฌ๋ฆฌ๋ ๊ฒ ์ง์ง ํ๋กํ์ ๋ํ ์ํคํ ์ฒ๊ตฌ๋. ์ง์ ๊ฐ์ ๋ด ์ทจ์ ์ฉ ํฌํด ์ฝ๋ ์ข ๊น๋ณด๊ณ ๋ถํ์ํ ์ ์ญ ์ํ ๋ ๋ ค๋ฒ๋ ค์ผ์ง. ๋ฟ๋ฏํ ํ๋ฃจ๋ค.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ์ฌ๋ฌ ๊ฐ์ ํผ์นจ ๋ฉ๋ด(Accordion)๋ฅผ ๋ง๋ค๊ณ ์์ต๋๋ค. ์กฐ๊ฑด: "๋จ ํ๋์ ๋ฉ๋ด๋ง ์ด๋ ค ์์ด์ผ ํ๋ฉฐ, ๋ค๋ฅธ ๋ฉ๋ด๋ฅผ ํด๋ฆญํ๋ฉด ๊ธฐ์กด ๊ฑด ๋ซํ์ผ ํ๋ค." ์ด ๊ฒฝ์ฐ isOpen ์ํ๋ ์ต์ ์ State Colocation ์์น์ ๋ฐ๋ผ ์ด๋์ ๋ฐฐ์นํด์ผ ํ ๊น์?
- A) ๊ฐ ๋จ์ผ
AccordionItem์ปดํฌ๋ํธ ๋ด๋ถ (useState(false)) - B) ์ฑ์ ์ต์๋จ ์ปดํฌ๋ํธ
App.tsx - C) ๋ชจ๋
AccordionItem์ ๊ฐ์ธ๊ณ ์๋ ๋ฐ๋ก ์ ๋ถ๋ชจ ์ปดํฌ๋ํธ (AccordionList) - D) Redux / Zustand ์คํ ์ด
โ ์ ๋ต: C
๐ก ์์ธ ํด์ค: ์์ฃผ ํ๋ฅญํ ๋๋ ๋ง์
๋๋ค! ๋ง์ฝ "๊ฐ๊ฐ์ ๋ฉ๋ด๊ฐ ์๋ก ๋
๋ฆฝ์ ์ผ๋ก ์ด๋ฆฌ๊ณ ๋ซํ ์ ์๋ค"๋ฉด ์ ๋ต์ A(๊ฐ๊ฐ์ ์์ดํ
๋ด๋ถ)์
๋๋ค. ํ์ง๋ง ๋ฌธ์ ์ ์กฐ๊ฑด์ "์๋ก๊ฐ ์๋ก์ ์ํฅ์ ๋ฐ์์ผ ํ๋ค(ํ๋๊ฐ ๋ซํ์ผ ํ๋๊ฐ ์ด๋ฆผ)" ์
๋๋ค. ํ์ ์ปดํฌ๋ํธ๋ผ๋ฆฌ ์ํตํด์ผ ํ๋ฏ๋ก, ์ด ์ํ๋ค์ ๋์์ ์ปจํธ๋กคํ ์ ์๋ ์ต์ ๊ณตํต ๋ถ๋ชจ์ธ AccordionList ๋ก ์ํ๋ฅผ ๋์ด์ฌ๋ฆฌ๋(Lifting State Up) ๊ฒ์ด ์๋ฒฝํ ์ ๋ต์
๋๋ค. ๋ถ๋ชจ์ activeItemIndex ๊ฐ์ ์ํ๋ฅผ ๋ฌ์ผ ํ์ฃ . (B, D๋ ๋ถํ์ํ๊ฒ ๋๋ฌด ๋ง์ด ๋์ด์ฌ๋ฆฐ ์ค๋ต์
๋๋ค.)
Q2. ์์ ์ปดํฌ๋ํธ A, B, C๋ฅผ ๊ฑฐ์ณ ์ ๋ฐ์ D ์ปดํฌ๋ํธ๋ก ํจ์์ ํ๋กญ์ค(Props Drilling)๋ฅผ 4๋จ๊ณ๋ ๋ซ๊ณ ๋๊ฒจ์ฃผ๊ณ ์์ต๋๋ค. A, B, C๋ ์ด ํ๋กญ์ค๋ฅผ ์ ํ ์ฐ์ง ์์ต๋๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๋ ์ปดํฌ๋ํธ ํฉ์ฑ(Composition) ์ ๋ต์ ํต์ฌ ๋ฌธ๋ฒ์ ๋ฌด์์ธ๊ฐ์?
- A)
React.memo์ฌ์ฉ - B)
childrenprop ์ฌ์ฉ (<A><B><C><D/></C></B></A>ํํ๋ก ์กฐ๋ฆฝ) - C)
useEffect์ฌ์ฉ - D)
useRef์ฌ์ฉ
โ ์ ๋ต: B
๐ก ์์ธ ํด์ค: ํ๋กญ์ค ๋๋ฆด๋ง์ ํด๊ฒฐํ๋ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ์
๋๋ค.
์ต์์ ๋ถ๋ชจ์์ ๊ตฌ๋ฉ์ ๋ซ์ด ๋ฐ์ดํฐ๋ฅผ ์ธต์ธต์ด ๋๊ฒจ์ฃผ๋ ๋์ , ์์ ์ต์์์์ D ์ปดํฌ๋ํธ๋ฅผ ์ง์ ์กฐ๋ฆฝํ ๋ค ์๋์์น์ ๋ด์ฉ๋ฌผ์ธ children์ผ๋ก ๊ฝ์ ๋ฃ๋ ๋ฐฉ์์
๋๋ค.
์ค๊ฐ์ A, B, C ์ปดํฌ๋ํธ๋ ์์ ์ด ์ด๋ค children ์ปดํฌ๋ํธ๋ฅผ ๋ฐ์๋์ง ์ ํ์๊ฐ ์์ผ๋ฏ๋ก ํ๋กญ์ค๋ฅผ ํจ์คํ ํ์๋ ์ฌ๋ผ์ง๋๋ค.
(10๋ฒ ์งธ ๊ฐ์ด๋์์ ์ง์ค์ ์ผ๋ก ํํค์น ์์ ์
๋๋ค!)
Q3. ์์ฒ ์ด๊ฐ ๋ฒํผ์ ๋๋ฅด๋ฉด ์ฆ์ ์ฑ์ ์ธ์ด๊ฐ 'ํ๊ตญ์ด'์์ '์์ด'๋ก ๋ฐ๋๊ฒ ๋ง๋ค๊ณ ์ถ์ด ํฉ๋๋ค. ์์ฒ ์ด๋ State Colocation ์์น์ ๋งน์ ํ์ฌ, ์ธ์ด ๋ฒํผ ์ปดํฌ๋ํธ ์์๋ง ์ง์ญ ์ํ const [lang, setLang] = useState('ko')๋ฅผ ๋์์ต๋๋ค. ํ๋ฉด ์ ์ฒด์ ๊ธ์๋ค์ด ์์ด๋ก ๋ฐ๋์์๊น์? ์๋ฆฌ์ ํจ๊ป ์ค๋ช
ํด ๋ณด์ธ์.
โ ์ ๋ต ๋ฐ ์ฃผ๊ด์ ํด์ค:
์ ๋ ๋ฐ๋์ง ์์ต๋๋ค.
์ธ์ด ์ค์ (๋ค๊ตญ์ด) ๋ฐ์ดํฐ๋ ๋ฒํผ ํ๋๋ง ํ์ํ ๊ฒ ์๋๋ผ, ํ๋ฉด์ ์กด์ฌํ๋ Header, Footer, ์ฝํ
์ธ ์์ญ ๋ฑ ์ฑ ๋ด์ ๊ฑฐ์ ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋์์ ๊ตฌ๋
ํ๊ณ ๊ณต์ ํด์ผ ํ๋ ์ฒ ์ ํ '์ ์ญ ์ํ(Global State)' ์
๋๋ค.
์์ฒ ์ด๊ฐ ๋ฒํผ ๋ด๋ถ์ ์ง์ญ ๋ณ์๋ก ๊ณ ๋ฆฝ์์ผ ๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์, ๋ฒํผ๋ง ์์ด๊ฐ ๋์์ ๋ฟ ์ธ๋ถ์ ์๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ค์ ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋ณํ ์ฌ์ค์กฐ์ฐจ ์์ง ๋ชปํฉ๋๋ค
(์ํ๋ฅผ ๋๊ฒจ๋ฐ์ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฏ๋ก ๋ฆฌ๋ ๋๋ง๋ ํธ๋ฆฌ๊ฑฐ๋์ง ์์).
- ๊ฒฐ๋ก : ์ด๋ฐ ์ฑ๊ฒฉ์ ํ ๋ง, ์ธ์ด์ค์ , ์ ์ ๋ก๊ทธ์ธ ์ ๋ณด ๋ฑ์ ์์ธ์ ์ผ๋ก ์ต์๋จ(Context Provider๋ ์ ์ญ ์คํ ์ด)์ผ๋ก ๊ณผ๊ฐํ๊ฒ ๋์ด์ฌ๋ ค์ผ ํ๋ ๋ฐ์ดํฐ ์ ๋๋ค. Colocation์ ์์ธ ์ผ์ด์ค์ธ ์ ์ด์ฃ .