์๋ง ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ผ๋ฉด "Reusable Component"์ด๋ ๋ง์ ๋ค์ด๋ดค์๊บผ๋ผ ์๊ฐ๋๋๋ฐ. (์๋ํ๋ฉด ๋๋ ๋ค์ด๋ดค์ผ๋๊น)
๊ทธ๋์ Reusable Component๋ฅผ ๋ง๋๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น ๊ณ ๋ฏผ์ ๋ง์ด ํ์ด.
Reusable์ด๋ ์ฌ์ฌ์ฉ์ฑ์ ๋ปํ๋๋ฐ, ๋ค์๋งํด ๋ด๊ฐ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๊ธฐ์๋ ์ฐ๊ณ ์ ๊ธฐ์๋ ์ฐ๊ณ ์ฌ๋ฌ๊ตฐ๋ฐ์์ ์ธ์ ์์ด์ผํ๋ค๋ ๊ฑฐ์ผ.
ํ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋๋ฐ์ ๊ฐ์ด ์์์๋ค. ์ฒ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ๋ค๋ ๊ฒ์ ์ค๋ณต๋๋ html, css ์ฝ๋๋ค์ ์ปดํฌ๋ํธ๋ก ๋ง๋ค์ด์ ์ฌ์ฌ์ฉํ๋ ค๊ณ ํ์ง. ๊ทธ๋ฐ๋ฐ ์ฌ์ฌ์ฉ์ฑ์ ์ด๋๊น์ง ๋์ฌ์ผํ๋์ง ๋ชฐ๋๋๊ฑฐ์ผ. ์ฌ์ฌ์ฉ์ฑ์ด ๋์ผ๋ ค๋ฉด ์ฌ์ค ๊ทธ๋ฅ library์ ์ปดํฌ๋ํธ์ฒ๋ผ ๋ง๋๋๊ฒ ๋ง์ง. ์คํ์ผ์ ๋ชจ๋ ์ ํด์ฃผ๊ณ ์์ ๋ค์ด๊ฐ๋ ์ปดํฌ๋ํธ๋ ์ ํด์ฃผ๋ ๊ฑฐ์ง. ๊ทผ๋ฐ ์ฌ์ฌ์ฉ์ฑ์ด ๋๋ฌด ๋์๋ฒ๋ฆฌ๋ฉด ๊ตณ์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋๊ฒ ์๋ฏธ๊ฐ ์์๊น ์ถ์์ด. ๊ฒฐ๊ตญ ๋ฐ๋ณต๋๋ ์ฌ๋ฌ์ค์ ์ฝ๋๊ฐ ๋ง์์ก๊ฑฐ๋ .
๊ทธ๋์ ๋ด๊ฐ ์ฒ์ ๋ง๋ ์ปดํฌ๋ํธ๋ค์ ์ ๋ง ๋ด๊ฐ ํ ์ฒซ ๊ธฐํ(UI/UX ๊ธฐํ ๋ฐ ๋์์ธ๋ ๋ด๊ฐ ํ๋คใ
)์ ๋ง์ถค์ผ๋ก ๋ง๋ค์์ด. ๊ทธ๋ฌ๋ค๋ณด๋ ์ปดํฌ๋ํธ๋ค์ด state๋ฅผ ๊ฐ์ง๊ณ ์์๊ณ ์์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ด๊ธด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ธฐ๋ ํ์ง. (์์ฐ, ์ต์
์ด์๋ค)
์๋ฅผ ๋ค์ด์ ๋ชจ๋ ์ํํธ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์์ ๋ฆฌ์คํธ๋ก ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ ๊ฑฐ์ง. ๊ทธ๋ผ ์ํํธ ๋ฆฌ์คํธ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ดํฐ ์ฝ๋ ํ๊ณ ์ฝํ๋๋์ ๋ก๋ฉ์ค์ด๋ฉด ์ค์ผ๋ ํค ui๋ ๋ณด์ฌ์ฃผ๊ณ ๊ทธ๋ฌ๋ค ๋ก๋ฉ์ด ๋๋๋ฉด ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์์ด์๋ ๊ฑฐ์ผ.
์ด๋ ๊ฒ ๋ง๋ค๋ค๋ณด๋ ๋น์ทํ UI๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ํ๋ ์ผ์ด ๋ฌ๋ผ์ ์๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ผ ํ ๊ฒฝ์ฐ๋ ์์๊ณ ๊ธฐ์กด ์ปดํฌ๋ํธ์ ์ฝ๋์ ์ฝ๋๋ฅผ ๋ํด์ผ ํ ๋๋ ์์์ด. ๋ก์ง๊ณผ UI๊ฐ ๋๋ ์ง์ง ์์์ ๋ด ์ฝ๋๋ฐญ์ ๋ค์ ธ๊ฐ๋ฉฐ ์ฐพ์์ผํ ๋๋ ์์์ด.
๋ด๊ฐ 100ํผ์ผํธ ์ง ์ฝ๋์ธ๋ฐ "์ด ์ปดํฌ๋ํธ๋ ๋ญํ๋ ์ ์์ง?", "์ด๊ฑด ๋ฌด์จ ๋ฐ์ดํฐ์ง?" ๋ฑ ๊ผญ ๋จ์ ์ฝ๋ ๋ณด๋ฏ์ด ๊ฐ๋ฐ์ ์งํํด ๋๊ฐ์ง.
์ด๋ ๊ฒ ๊ฐ๋ฐ์ ํ์ง ์ด์ธ 4๊ฐ์. ์ด๋์ ๋ UI๊ฐ ์์ฑ๋๊ณ ๋ด๊ฐ ์๊ฐํ ์ข์ ์ฝ๋์ ๊ธฐ์ค์ด ์กํ๊ฐ ์์ ์ ๋ ๋๊ปด๋ฒ๋ ธ์ด. ์ง๊ธ์ด ์๋๋ฉด ์ด ํผ๋์ ์นด์ค์ค์ธ ๋ด ์ฝ๋๋ค์ ์ ๋ฆฌํ ๊ธฐํ๊ฐ ์๊ฒ ๋ค ์ถ์์ง. ๊ทธ๋์ ์ฝ๋๋ฅผ ๋ค ๋ฏ์ด๊ณ ์น๊ธฐ๋ก ๋ง์๋จน์๋ค. ์ฌ์ค ์ปดํฌ๋ํธ ๋ง๊ณ ๋ ์ ๋ถ ๋ค ์ ๋ฆฌํด์ผ ํ๊ฑฐ๋ . interface๋ ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ ธ์๊ณ ๋ฐ์ดํฐ fetchingํ๋ ๊ฒ๋ ์ฌ๊ธฐ์ ๊ธฐ ํฉ์ด์ ธ์์๊ฑฐ๋ . ๊ฑฐ์ ์ฌํผ์ ๊ตฌ์ฌ ์กฐ๊ฐ ๋ชจ์ผ๋ ๋๋.
์ฝ๋๋ค์ ๋ฏ์ด๊ณ ์น๊ธฐ ์ , ์ผ๋จ ์ปดํฌ๋ํธ์ ๊ธฐ์ค์ ์ธ์ ์ด.
์ฒซ๋ฒ์งธ ๊ธฐ์ค์ ์ปดํฌ๋ํธ์ ์ ์์ ๋ง์ฐฌ๊ฐ์ง์ง.
๋๋ฒ์งธ๋ Layout๊น์ง๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋ ค๋ ์๋์ผ. ๋ด๊ฐ ํ๊ณ ์ถ์๋๊ฑฐ๋ (์ปจํ
์ด๋์ปดํฌ๋ํธ)X(๋ ์ด์์์ปดํฌ๋ํธ)X(๊ธฐ๋ณธ์ปดํฌ๋ํธ)์๊ฑฐ๋ . ์๋ฅผ ๋ค์ด
์์ ๊ทธ๋ฆผ์ ์๋ฅผ ๋ค๋ฉด ์นด๋์ธํ์ ๋งก๊ณ ์๋ ํฐ์ ๋ฅ๊ทผ ๋ถ๋ถ์ด ์ปจํ
์ด๋์ปดํฌ๋ํธ์ด๊ณ 1, 2, 3, 4๊ฐ ์ธ๋ก ํ์ค๋ก ๋ค์ด๊ฐ ์๋ ๋ ์ด์์์ด ๋ ์ด์์ ์ปดํฌ๋ํธ์ธ๊ฑฐ๊ณ 1,2,3,4๊ฐ ๊ธฐ๋ณธ์ปดํฌ๋ํธ์ธ๊ฑฐ์ง.
์ด๋ ๊ฒ ๊ธฐ์ค์ ์ธ์ฐ๊ณ ๋๋ Reusable Component๊ฐ ๋ฌด์์ธ์ง ๊ฐ์ด ์ค๋๋ผ๊ณ .
๊ณตํต๋์ด์ผ ํ ์คํ์ผ์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ง๊ณ ์๊ณ ๋ณํํ ์คํ์ผ์ ์ธ์๋ก ๋ฐ๋๊ฑฐ์ง.
๊ทธ๋ฆฌ๊ณ Next.js๋ React์์ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ์๊ฒ ๊ฐ์ ๋ฐ์์ผ ํ๊ฑฐ๋ . ๊ทผ๋ฐ ๋ง์ฝ ์ปดํฌ๋ํธ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ๊ทธ ์ปดํฌ๋ํธ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ์ด๋ ๊ฒ ๋์ค๊ฐ ๋ง์์ง๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ฆฌ๊ณ ๋ด๋ฆฌ๊ณ ๋ด๋ฆฌ๋๊ฒ ๋๋ฌด ๋นํจ์จ์ ์ด์์.
๊ทธ๋์ ๋๋ ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ปดํฌ๋ํธ๋ฅผ ์ปจํ
์ด๋ ์ปดํฌ๋ํธ์ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ๋ก ๋๋ด์ด.
์ปจํ
์ด๋ ์ปดํฌ๋ํธ๋ ๊ธฐ๋ณธ ์ปดํฌ๋ํธ๋ฅผ children์ prop์ผ๋ก ๋ฐ๋๊ฑฐ์ง. ๊ทธ๋ ๊ฒ ๋๋ฉด ๋ด๊ฐ ์ปจํ
์ด๋ ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ๊ทธ ์์ ์๋ ์ปดํฌ๋ํธ๋ก ์ ๋ฌํ๋๊ฒ ์๋๋ผ pages ๋จ์์ ๋ฐ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด์ ์ค ์ ์์ง.
์๋ฅผ ๋ค์ด ๋ด๊ฐ ์ ํ ๋ฉ์ธ color๊ฐ "indigo-500"์ด๋ผ๊ณ ๊ฐ์ ํ์๋, ๋ชจ๋ theme์ด๋ผ๋ ์์ ์ฐ๋ ์ปดํฌ๋ํธ์ indigo-500์ ์ ๋๊ฒ๋ณด๋ค๋ const themeColor = "indigo-500"
์ด๋ผ๊ณ ์ฐ๊ณ themeColor๋ฅผ ๊ฐ์ ธ์์ ์ฐ๋๊ฒ ๊ณ ๋ฏผ ์ํด๋๋๊ณ ํธ๋ฆฌํ๊ณ ์ข์์? ์์ ๋ฐ๊ฟ๋์๋ themeColor์ ๊ฐ๋ง ๋ฐ๊ฟ์ฃผ๋ฉด ํ๋ฒ์ ๋ฐ๋๋๊น ์ ์ง๋ณด์์๋ ์ข์๊บผ๊ณ . function๋ ๋ง์ฐฌ๊ฐ์ง์ผ๊บผ์ง.
๊ทธ๋์ ๋๋ Recoil์ ์ฐ๊ธฐ๋ก ๊ฒฐ์ ํ์ด. ์ผ๋จ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ฐฐ์ฐ๊ธฐ ์ฝ๊ธฐ๋๋ฌธ์ด์ผ. ๋ ์์ธํ ๋ด์ฉ์ ์ถํ์ ๋ด๊ฐ ์ง์ ์ฌ์ฉํด๋ณด๋ฉด์ ๋ค์ ์
๋ก๋ํ ๊ป.
์ด ๊ฐ๋ ์ ์์ง ์์ฑ๋ ๊ฐ๋ ์ ์๋๊ณ ์กฐ๊ธ ๋ ๊ณต๋ถ๋ ํ์ํ ๊ฐ๋ ์ธ๋ฐ, ๋ด๊ฐ ์ด ๊ฐ๋ ์ ๊ณ ๋ฏผํ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์.
์๋ฅผ ๋ค์ด์ ๋ฒํผ์ด๋ผ๋ ์ปดํฌ๋ํธ๊ฐ ์๋๋ฐ ์ด ๋ฒํผ์ ์์์ฌ์ด์ฆ, ์ค๊ฐ ์ฌ์ด์ฆ, ํฐ ์ฌ์ด์ฆ ์ธ๊ฐ์ง๋ฅผ prop์ผ๋ก ๋ฐ์. ๊ทผ๋ฐ ๋ฆฌ์คํธ ์นด๋๋ผ๋ ์ปจํ ์ด๋ ์นด๋ ์์ ๋ค์ด๊ฐ๋ ์ปดํฌ๋ํธ ์นด๋๋ ํญ์ ์์ ์ฌ์ด์ฆ์ ๋ฒํผ์ด ๋ค์ด๊ฐ. ๋ฒํผ์ด ์๋ค์ด๊ฐ ๋๋ ์๊ณ . ๊ทธ๋ด๊ฒฝ์ฐ class์ฒ๋ผ ๋ค์ ๋ฐฉ์์ฒ๋ผ ์ฐ๊ณ ์ถ์๊ฑฐ์ง.
<Card>
<Card.Layout type="์ธ๋ก">
<Card.Button onClick={doSomething}>
ํด๋ฆญํด์ฃผ์ธ์ฉ
</Card.Button>
</Card.Layout>
</Card>
๋น์ฐํ Card
์์๋ ๊ทธ๋ฅ ์ผ๋ฐ Layout
์ด๋ Button
์ปดํฌ๋ํธ๋ ๋ค์ด๊ฐ ์ ์์ง. ํ์ง๋ง ๊ทธ๋๋ง๋ค ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ ์ฐ๋ค๋ณด๋ฉด ๋์์ธ ํต์ผ์ฑ๋ ์ ์ด์ง ๊ฑฐ์์?
์ด๋ป๊ฒ ๋ณด๋ฉด default ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์ถ์๊ฑฐ์ง.
(+Headless UI๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฐ์์ผ๋ก ์ฐ๋ ๊ฒ ๊ฐ๋๋ผ๊ตฌ. ๊ทธ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ด๋ณด๋ ์ค์ด์ผ.)
์ด ๊ฐ๋
๋ ์์ฑ๋๋ฉด ์ถํ ์
๋ฐ์ดํธ ํ ๊ป. ์
๋ฐ์ดํธ ํ๋จ์!!
+๋ด์ฉ์ถ๊ฐ
์๊ฐ๋ณด๋ค ์ฝ๋๋ผ๊ณ !
์์ ์ฝ๋์ฒ๋ผ Card ์ ์ฉ Button์ด ํ์ํ ๋๋ Card ์ปดํฌ๋ํธ๊ฐ ์๋ ํ์ผ๋ก ๊ฐ์ ์ผ๋ฐ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํด์ฃผ๋ฏ์ด ๋ง๋ค์ด์ฃผ๋ฉด ๋๋๋ผ๊ณ . ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ Card.Button
ํ์ค์ ์ถ๊ฐํด์ฃผ๋ฉด ์์ ์์ฒ๋ผ Card.Button
์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ฑฐ์ง.
//Card.tsx
interface CardProps {
children: React.ReactNode;
}
export default Card({
children,
}: CardProps) {
return (
<div>
{children}
</div>
)
}
interface ButtonForCardProps {
clickEvent?: () => void;
children: React.ReactNode;
}
function ButtonForCard({
clickEvent,
children
}: ButtonProps) {
return (
<button onClick={clickEvent}>
{children}
</button>
)
}
Card.Button = ButtonForCard;
์ฌ๊ธฐ์์ ์ค์ํ ์ ์ ๋ค์๊ณผ ๊ฐ์.
์์์ export๋ฅผ ๋ฐ๋ก ํด์ฃผ์ง ์์๋ ์์ ์ปดํฌ๋ํธ๋ง importํด๋ ๊ทธ ์๋์ ๋ชจ๋ component๋ฅผ ์ฌ์ฉํ ์ ์์ง.
ํ์ง๋ง ํ์ ์ปดํฌ๋ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ง์์ง๋ฉด ๋น์ฐํ ๋ถํ์ํ ์ฝ๋๋ค๋ ๊ฐ์ด import ํด์ค๊ธฐ ๋๋ฌธ์ ์ฃผ์ํด์ผํ ๊ฒ ๊ฐ์.