
์ต๊ทผ ํ๋ก์ ํธ์์ "์ฌ์ฉ์ ์ก์ ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง"๋ฅผ ๊ตฌํํ๊ฒ ๋์๋ค! ์ ๋ง ๊ฐ๋จํ UI์์ง๋ง, ์ด๊ธฐ๋ถํฐ ์ฌ๋ฌ ๊ฐ์ง ๊ฒ๋ค์ ๊ณ ๋ คํด ๋ง๋ค์ด ๋ณด๋ฉด ์ข์ง ์์๊น ์ถ์ด์ ์ปดํฌ๋ํธํ๋ฅผ ์งํํ๊ธฐ๋ก ํ๋ค. ์ด๋ฒ ๊ธ์์๋ ๊ฒฐ๋ก ์ ์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๊ณ , ๊ทธ ๊ณผ์ ์์ ๋ฐฐ์ด ์ ์ ์ ์ด๋ณด๋ ค๊ณ ํ๋ค ๐
โ ๋ ์ด์์์ ์ผ์ ํ๊ณ
์์ด์ฝ,์ ๋ชฉ,๋์คํฌ๋ฆฝ์ ๋ง ๋ฌ๋ผ์ง๋ ๊ตฌ์กฐ
โ ํฅํ UI ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ (ex. '๋ฉ์ธ์ผ๋ก ์ด๋ํ๊ธฐ' ๋ฒํผ ์ถ๊ฐ ๋ฑ)
โ ํ๋ฉด ๊ตฌ์ฑ ์ค ์ผ๋ถ๋ง ์ฐ์ด๋ ๊ฒฝ์ฐ (ex.๋์คํฌ๋ฆฝ์ ์์ด์์ด์ฝ๊ณผ์ ๋ชฉ๋ง ์ฐ์ด๋ ๊ฒฝ์ฐ)
์์ ๊ฐ์ ์๊ตฌ์ฌํญ ๋ฐ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ ๋, ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ํ์ํ๋ค๋ ๊ฑธ ์ ์ ์๊ฒ ๋ค.
โญ๏ธ ๋ ์ด์์์ ๊ณตํต + ๋ด์ฉ๋ง ๋ฌ๋ผ์ง๋ ๊ตฌ์กฐ ํ์
โญ๏ธ ๋ณ๊ฒฝ์ ์ฉ์ดํ ๊ตฌ์กฐ ํ์
โญ๏ธ ๊ฐ ์์๊ฐ ์๋ก ์์กด์ฑ์ด ์ ์ ๊ตฌ์กฐ ํ์
๊ฒฐ๋ก ์ ์ผ๋ก ๋๋ ์ด๋ฐ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ํจํด์ด ๐ก ํฉ์ฑ ์ปดํฌ๋ํธ๋ผ๊ณ ์๊ฐํ๊ณ , ํด๋น ํจํด์ ์ด์ฉํด์ UI๋ฅผ ๊ฐ๋ฐํ๊ฒ ๋์๋ค.
ํ๋ก ํธ์๋์์ ์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง ๊ณ ๋ฏผํ๋ค ๋ณด๋ฉด, "์ด๋ป๊ฒ ํ๋ฉด ๋ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ฌ์ด ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ์ ์์๊น?"๋ผ๋ ์ง๋ฌธ์ ์์ฃผ ํ๊ฒ ๋๋ค.
๊ทธ ๊ณ ๋ฏผ์ ํด๊ฒฐ์ฑ
์ค ํ๋๊ฐ ๋ฐ๋ก ํฉ์ฑ(Composition)์ด๋ค!
React๋ ์ ํต์ ์ธ ํด๋์ค ๊ธฐ๋ฐ ์ธ์ด์์ ๋ง์ด ์ฐ์ด๋ ์์(Inheritance)๋ณด๋ค๋, ํฉ์ฑ(Composition)์ ๋ ์ ํธํ๋ค. ํฉ์ฑ์ "์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ์กฐํฉํด์ ์๋ก์ด UI๋ฅผ ๋ง๋ค์ด๋ด๋ ๋ฐฉ์"์ผ๋ก, ์ปดํฌ๋ํธ ๊ฐ์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ๋ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์๊ฒ ํด์ค๋ค.
์์ : ๊ธฐ๋ฅ์ ์์๋ฐ์ ํ์ฅํ๋ ๋ฐฉ์. ์ปดํฌ๋ํธ ๊ฐ ๊ฐํ ์์กด์ด ์๊ธฐ๊ณ , ์ฌ์ฌ์ฉ์ด ์ด๋ ต๋ค.ํฉ์ฑ : ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ฅผ ์กฐํฉํด ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌ์ฑํ๋ ๋ฐฉ์. ๋
๋ฆฝ์ฑ๊ณผ ํ์ฅ์ฑ์ด ์ข๋ค.React ๊ณต์ ๋ฌธ์์์๋ ์๋์ ๊ฐ์ด ๋งํ๊ณ ์๋ค ๐
"React๋ ๊ฐ๋ ฅํ ํฉ์ฑ ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์์ ๋์ ํฉ์ฑ์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค."
"Facebook์์๋ ์์ฒ ๊ฐ์ React ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง๋ง, ์ปดํฌ๋ํธ๋ฅผ ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ก ์์ฑ์ ๊ถ์ฅํ ๋งํ ์ฌ๋ก๋ฅผ ์์ง ์ฐพ์ง ๋ชปํ์ต๋๋ค."
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํฉ์ฑ ๋ฐฉ์์ children์ ํตํด ํ์ ์์๋ฅผ ์ฃผ์ ๋ฐ๋ ๋ฐฉ์์ด๋ค.
function Card({ children }: { children: React.ReactNode }) {
return <div className="p-4 border rounded-md">{children}</div>;
}
<Card>
<h2>๊ณต์ง์ฌํญ</h2>
<p>์ค๋์ ์คํ 6์์ ์ ๊ฒ์ด ์์ต๋๋ค.</p>
</Card>
์ด ์์ ์์ Card๋ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ณ ์ ํ์ง ์๊ณ , ๋ถ๋ชจ๊ฐ ๋๊ธด ๋ด์ฉ์ ๊ทธ๋๋ก ๊ฐ์ธ์ ๋ณด์ฌ์ค๋ค. ์ด๋ฐ ๋ฐฉ์์ ๋ ์ด์์, ๋ชจ๋ฌ, ํดํ ๋ฑ ๋ค์ํ UI ์์์ ์ธ ์ ์๋ค.
React์์๋ ํฉ์ฑ์ ๊ตฌํํ๋ ๋ฐฉ์์ด ๊ฝค ๋ค์ํ๋ค. ๊ทธ์ค ์์ฃผ ์ฐ์ด๋ ๋ํ์ ์ธ ํจํด์ ์๋์ ๊ฐ๋ค.
1๏ธโฃ Slot ํจํด
์ปดํฌ๋ํธ ๋ด๋ถ์ ํน์ ์์ญ์ ๋ด์ฉ์ ๋ช
ํํ๊ฒ ์ฃผ์
ํ๊ณ ์ถ์ ๋ ์ฐ๋ ๋ฐฉ์์ด๋ค.
์๋ฅผ ๋ค์ด ์ ๋ชฉ, ๋ณธ๋ฌธ, ํธํฐ๋ฅผ ๊ฐ๊ฐ ๋ค๋ฅธ ์ฌ๋กฏ์ผ๋ก ๊ตฌ์ฑํ ์ ์๋ค.
function Dialog({ title, body, footer }: Props) {
return (
<div className="dialog">
<div className="dialog-title">{title}</div>
<div className="dialog-body">{body}</div>
<div className="dialog-footer">{footer}</div>
</div>
);
}
<Dialog
title={<h2>ํ์๊ฐ์
</h2>}
body={<SignUpForm />}
footer={<Button>ํ์ธ</Button>}
/>
2๏ธโฃ Compound Component ํจํด
ํ์ ์ปดํฌ๋ํธ๋ฅผ ๋
ผ๋ฆฌ์ ์ผ๋ก ๋ฌถ์ด์ ์ฌ์ฉํ๋ ๋ฐฉ์์ด๋ค.
๋ณดํต Tabs, Accordion, Select ๊ฐ์ ๊ตฌ์กฐ์์ ๋ง์ด ์ด๋ค.
const Tabs = ({ children }) => <div>{children}</div>;
Tabs.TabList = ({ children }) => <div className="tab-list">{children}</div>;
Tabs.TabPanel = ({ children }) => <div className="tab-panel">{children}</div>;
<Tabs>
<Tabs.TabList>
<button>ํญ 1</button>
<button>ํญ 2</button>
</Tabs.TabList>
<Tabs.TabPanel>
<p>ํญ 1์ ๋ด์ฉ</p>
</Tabs.TabPanel>
</Tabs>
์ด๋ฐ ๋ฐฉ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ ์์ ๋จ์๋ก ์ชผ๊ฐ๊ณ , ๊ฐ ๋ถ๋ถ์ ๋ํ ์ฑ ์์ ๋ถ๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค. ๋์์ ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉ ์์ ์์ ์ด๋ค ๊ตฌ์กฐ๋ก ์ฌ์ฉํ ์ง ๋ ๋ช ํํ๊ฒ ์ ์ํ ์๋ ์๋ค.
๋ ํจํด์ ํ๋ก ๋น๊ตํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
| ํญ๋ชฉ | Slot ํจํด | Compound Component ํจํด |
|---|---|---|
| ๊ตฌ์ฑ ๋ฐฉ์ | ๋ช ์์ ์ธ prop์ผ๋ก ์์ญ๋ณ ๋ด์ฉ์ ์ ๋ฌํจ | ํ์ ์ปดํฌ๋ํธ๋ฅผ ๋ ผ๋ฆฌ์ ์ผ๋ก ์กฐํฉํ์ฌ ๊ตฌ์ฑ |
| ์ปดํฌ๋ํธ ๊ตฌ์กฐ ์ ์ด ๋ฐฉ์ | ์์ ์ปดํฌ๋ํธ์์ ๊ตฌ์กฐ ์ ์ด | ์์ ์ปดํฌ๋ํธ๊ฐ ํ์ ์ปดํฌ๋ํธ ์งํฉ์ ์ ๊ณต |
| ์ ์ฐ์ฑ | prop ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ์ผ ํ๋ฏ๋ก ๋ค์ ๊ณ ์ ์ | children ์กฐํฉ์ผ๋ก ์ ์ฐํ ๊ตฌ์ฑ ๊ฐ๋ฅ |
| ํ์ฅ์ฑ | ์๋ก์ด ์ฌ๋กฏ์ ์ถ๊ฐํ๋ ค๋ฉด props ์์ ํ์ | ์ปดํฌ๋ํธ๋ง ์ถ๊ฐํ๋ฉด ๋๋ฏ๋ก ํ์ฅ์ ์ ๋ฆฌํจ |
| ์ค์ ์ฌ์ฉ ์ | Dialog, Modal, Card ๋ฑ ๊ตฌ์ฑ ์์๊ฐ ๋ช
ํํ ๊ตฌ๋ถ๋๋ ์ปดํฌ๋ํธ | Tabs, Accordion, Select, Menu ๋ฑ ๋ณต์กํ ๊ตฌ์ฑ์ UI ์ปดํฌ๋ํธ |
๊ทธ๋ฌ๋ฏ๋ก ๋๋ ์์ ์๊ธฐํ๋ "๋ณ๊ฒฝ์ ์ฉ์ดํ ๊ตฌ์กฐ", "์๋ก ์์กด์ฑ์ด ์ ์ ๊ตฌ์กฐ"๋ผ๋ ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ค๋ฉด, Slot ํจํด๋ณด๋ค๋ Compound Component ํจํด์ด ๋ณด๋ค ์ ํฉํ ๊ฑฐ๋ผ๊ณ ํ๋จํ๊ณ , ํด๋น ํจํด์ ๋ง์ถฐ ๊ตฌํ์ ์งํํ๊ธฐ๋ก ํ๋ค ๐
๊ตฌ์กฐํ๋ ๋ค์๊ณผ ๊ฐ์ด ์งํํ๋ค. ์ฌ๊ธฐ์ ์ถ๊ฐ๋ก Icon์ ์์ ๋๊ฐ ๋๊ธฐ๋ณด๋ค๋, ์ํฉ์ ๋ง๋ ์์ด์ฝ์ด ๋ช
์์ ์ผ๋ก ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋ ๋๊ธฐ ๋๋ฌธ์, Result.Image ๋ถ๋ถ์์๋ type์ ์ข ๋ ํ์ฉํด ๋ณด๊ธฐ๋ก ํ๋ค.
์ต์ข ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
import Image from "next/image";
import { RESULT_IMG_MAP } from "@/constants/result/resultImg";
export type ImgKind = "letter";
function ResultImage({ kind }: { kind: ImgKind }) {
return (
<Image
src={RESULT_IMG_MAP[kind]}
alt="๊ฒฐ๊ณผ ์ด๋ฏธ์ง"
width={80}
height={80}
/>
);
}
function ResultTitle({ children }: { children: React.ReactNode }) {
return <h1 className="mt-6 text-2xl font-bold text-gray-900">{children}</h1>;
}
function ResultDescription({ children }: { children: React.ReactNode }) {
return (
<p className="mt-2 whitespace-pre font-medium text-gray-400">{children}</p>
);
}
function ResultMain({ children }: { children: React.ReactNode }) {
return (
<div className="flex flex-col items-center justify-center text-center">
{children}
</div>
);
}
export const Result = Object.assign(ResultMain, {
Image: ResultImage,
Title: ResultTitle,
Description: ResultDescription,
});
๊ตฌํ๋ถ์์๋ ๊ฐ ํ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ , Object.assign()์ ์ด์ฉํด ์ปดํฌ๋ํธ๋ฅผ ์กฐํฉํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ Result ์ปดํฌ๋ํธ์ด๋ค. Object.assign()์ "์ถ์ฒ ๊ฐ์ฒด๋ค์ ๋ชจ๋ ์ด๊ฑฐ ๊ฐ๋ฅํ ์์ฑ์ ๋ณต์ฌํด ๋์ ๊ฐ์ฒด์ ๋ถ์ฌ๋ฃ๋" ๋ฉ์๋์ธ๋ฐ, ์ด ๊ณผ์ ์ด ํ์ํ ์ด์ ๋ ํฉ์ฑ ์ปดํฌ๋ํธ ํจํด์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด "ํ์ ์ปดํฌ๋ํธ๋ค์ ์์ ์ปดํฌ๋ํธ์ ์์ฑ์ผ๋ก ๋ถ์ฌ์ผ ํ๊ธฐ ๋๋ฌธ"์ด๋ค. ReactMain์ ํ์ ์ปดํฌ๋ํธ๋ค์ ๋ถ์ฌ ํฉ์ฑ ์ปดํฌ๋ํธ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ๋์ ์ผ๋ก ์์ฑ์ ๋ถ์ฌํ๋ ๊ณผ์ ์ด๋ค.
TypeScript์์๋ ์๋์ ๊ฐ์ด ๋ช ์์ ์ผ๋ก ์ง์ ํ ์๋ ์๋ค.
type ResultComponent = typeof ResultMain & {
Image: typeof ResultImage;
Title: typeof ResultTitle;
Description: typeof ResultDescription;
};
const Result = ResultMain as ResultComponent;
Result.Image = ResultImage;
Result.Title = ResultTitle;
Result.Description = ResultDescription;
Object.assign() ๋ฐฉ์์ด ์ข ๋ ์ฝ๋๊ฐ ์งง์์ง๊ณ ์ง๊ด์ ์ด๋ผ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฑธ ๊ถ์ฅํ๋ท...!!
+) ์์ฃผ ์ค์ํ ๋ถ๋ถ์ ์๋์ง๋ง ์ฐธ๊ณ ๋ก RESULT_IMG_MAP์ ์์ด์ฝ ์ข
๋ฅ๋ณ๋ก ์ด๋ค ์ด๋ฏธ์ง๋ฅผ ์ธ ๊ฑด์ง ์ง์ ํด๋์ ์์์ด๋ค.
import { Result } from "@/ui/Result";
function NotifyResultPage() {
return (
<div className="flex h-screen w-full items-center justify-center">
<Result>
<Result.Image kind="letter" />
<Result.Title>๋งค์นญ ์ ์ฒญ์ด ์๋ฃ๋์ด์!</Result.Title>
<Result.Description>
{`๋งค์นญ์ด ์ฑ์ฌ๋๋ฉด\n์นดํก์ผ๋ก ์๋ ค๋๋ฆด๊ฒ์`}
</Result.Description>
</Result>
</div>
);
}
export default NotifyResultPage;
์ฌ์ฉ๋ถ์์๋ ์ด๋ฐ ์์ผ๋ก ์กฐํฉํด์ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค! ๐
import Image from "next/image";
import { RESULT_IMG_MAP } from "@/constants/result/resultImg";
export type ImgKind = "letter";
interface ResultProps {
kind: ImgKind;
title: React.ReactNode;
description: React.ReactNode;
}
export function Result({ kind, title, description }: ResultProps) {
return (
<div className="flex flex-col items-center justify-center text-center">
<Image
src={RESULT_IMG_MAP[kind]}
alt="์๋ฃ ์ด๋ฏธ์ง"
width={80}
height={80}
/>
<h1 className="mt-6 text-2xl font-bold text-gray-900">{title}</h1>
<p className="mt-2 whitespace-pre font-medium text-gray-400">{description}</p>
</div>
);
}
์ด๋ฌํ ๋ฐฉ์์ ์ฝ๋๊ฐ ๋ ์งง์์ง ์ ์๊ฒ ์ง๋ง, ๋ณด๋ค ๋น์ง๊ด์ ์ด๊ณ ์ปจํ ์ธ ์ ์์น๊ฐ ๊ณ ์ ์ ์ด๋ผ์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค๋ ๋จ์ ์ด ์์ ๊ฒ ๊ฐ๋ค.

๋น์ฐํ ๊ทธ๋ ์ง ์๋ค๊ณ ์๊ฐํ๋ค. ์ค์ ๋ก ์ก์ ๊ฒฐ๊ณผ ํ์ด์ง๋ฅผ ํฉ์ฑ ์ปดํฌ๋ํธ๋ก ๊ตฌํํ๊ฒ ๋ค๋ ํ ํฌ์คํ์ ์์ฑํ์ ๋, ํ์๋ถ๊ป์ ์ง๊ธ ์์ ์์๋ ์ค๋ฒ์คํ์ผ ์๋ ์๊ฒ ๋ค๋ ํผ๋๋ฐฑ์ ์ฃผ์ จ๊ณ , ๋๋ ์ด์ ์ด๋ ์ ๋๋ ๊ณต๊ฐํ๊ณ ์๋ค๐ ์ต์ข ์ ์ผ๋ก ํฉ์ฑ ์ปดํฌ๋ํธ๋ก ๊ตฌํํ ์ ์์๋ ์ด์ ๋, ์๊ฐ ์ฌ์ ๊ฐ ์กฐ๊ธ ์๋ ์ํ์ด๊ธฐ๋ ํ๊ณ , ํด๋น ํ์ด์ง๊ฐ ์์ผ๋ก ๋ง์ ๊ณณ์์ ์ด์ฉ๋ ํ์ด์ง๋ผ๊ณ ์๊ฐ๋์ด์์๋ค.
์๋ฅผ ๋ค์ด ๋จ์ํ ๋ฒํผ์ด๋ ๋ผ๋ฒจ, ๋ ์ด์์์ด ๊ฑฐ์ ๊ณ ์ ๋ ํ์ ๋ฑ์ children์ด๋ ์ฌ๋ฌ ํ์ ์ปดํฌ๋ํธ๋ฅผ ํตํ ํฉ์ฑ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ๋ณด๋ค๋ ๋จ์ํ prop ๊ธฐ๋ฐ ์ปดํฌ๋ํธ๋ก ์ค๊ณํ๋ ๊ฒ์ด ๋ ๋์ ์ ํ์ง๊ฐ ๋ ์ ์๋ค.
โ ์ ์ข์ ์์
<Button.Root>
<Button.Label>ํ์ธ</Button.Label>
<Button.Icon src="check.svg" />
</Button.Root>
โ ์ค์ ๋ก๋ ๊ทธ๋ฅ <Button icon="check.svg">ํ์ธ</Button>์ผ๋ก๋ ์ถฉ๋ถํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๋ถํ์ํ ํฉ์ฑ ๊ตฌ์กฐ๋ ์ฝ๋๋์ ๋๋ฆฌ๊ณ , ํ์๋ค์ด ํด๋น ๊ตฌ์กฐ๋ฅผ ํ์ตํด์ผ ํ๋ ๋ถ๋ด๋ ํจ๊ป ์๊ธด๋ค ๐
1. ์ปดํฌ๋ํธ๊ฐ ๋ค์ํ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ ๋
ex) Dialog, Form, Card์ฒ๋ผ ๋ณธ๋ฌธ, ์ ๋ชฉ, ํธํฐ ๋ฑ์ ์ ๋์ ์ผ๋ก ์กฐํฉํ๊ณ ์ถ์ ๊ฒฝ์ฐ
ex) ์ปดํฌ๋ํธ ๊ตฌ์ฑ ์ค ์ผ๋ถ๋ง ์ฐ์ด๋ ๊ฒฝ์ฐ๋ ์กด์ฌํ ๋
2. ํ์ ํ๋ ๊ฐ๋ฐ์์๊ฒ ๋ช ํํ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ ์ถ์ ๋
ex) Tabs.TabList, Tabs.TabPanel์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์ง๊ด์ ์ผ๋ก ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ์จ์ผ ํ๋์ง ์ ์ ์์
3. ๋ณต์กํ UI ๋ก์ง์ Context๋ฅผ ํตํด ๊ณต์ ํ ํ์๊ฐ ์์ ๋
ex) ํญ ์ ํ, ์ ํ ์ํ ๋ฑ ์ฌ๋ฌ ํ์ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ ์ํ๋ฅผ ๊ณต์ ํ ๊ฒฝ์ฐ
์ฆ, ํฉ์ฑ ์ปดํฌ๋ํธ๋ (1) UI ๊ตฌ์กฐ์ ์ ์ฐ์ฑ์ด ํ์ํ๊ณ (2) ํ์ ์ปดํฌ๋ํธ๋ค์ด ๋ ผ๋ฆฌ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์์ ๋(๋๋ ์ํ๋ฅผ ๊ณต์ ํ ๋) ์ ์ฉํ ํจํด์ด๋ผ๊ณ ์๊ฐํ๋ค!
์์ ์ ์ธํดํ ๋์๋ ํฉ์ฑ ์ปดํฌ๋ํธ๋ก UI๋ฅผ ๊ตฌ์ฑํด ๋ณธ ์ ์๋๋๋ ์ฌ์๋์ ์ง๋ฌธ์ ํด ๋ณธ ์ ์ด ์๋ค๊ณ ๋๋ตํ์๋๋ฐ ์ด์ ๋ ์๋ค๊ณ ๋๋ตํ ์ ์๋ ์ฌ๋์ด ๋์๋ค(ใ ใ ) ๋์ ์ ํ๋ก ํฉ์ฑ ์ปดํฌ๋ํธ์ ๋ํด ์์ธํ ๊ณต๋ถํด ๋ณด์๋๋ฐ, ๋จ์ํ๋ฉด์๋ ๊ฐ๋ ฅํ ํจํด์ด๋ผ๋ ์๊ฐ์ด ๋ ๋ค. ์ปดํฌ๋ํธํ๋ฅผ ํ ๋ ์์ผ๋ก ๊ณ ๋ คํ ์ต์ ์ด ํ๋ ๋ ๋์ด๋ ๊ฒ ๊ฐ๋ค! ์ฌ์ฌ์ฉ์ฑ ์ข์ ์ปดํฌ๋ํธ์ ๋ํด ๋ ๊ณ ๋ฏผํ๊ณ ๋ฐ์ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ๋์ด์ผ๊ฒ ๋ค ๐ซ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
ํผ๋๋ฐฑ์ ์ธ์ ๋ ํ์ํฉ๋๋ค ๐ค
์ฌ์ค ์์ฆ์ ai๊ฐ ํด์ฃผ๊ธฐ๋๋ฌธ์ ๊ณผ์คํ์์๋๊ฒ ๊ฐ์์. ์คํ๋ ค aiํํ Ui๋งก๊ธฐ๋ฉด ์๋ฌด๋๋ ์ฌ์ฌ์ฉ์ฑ๋ฉด์์ ์์ฌ์ธ๋ฐ๋ ๋ง์๋ฐ compound๋ฅผํตํด ์ด๋ฐ๋ฉด์ด ํด๊ฒฐ๊ฐ๋ฅํ๊ฒ ๊ฐ์ต๋๋ค
์๊ทธ๋๋ ํด๋น ์ฃผ์ ๋ก ํ๋ค์ดํ๊ณ ์์๋๋ฐ ์ ์ฝ์์ต๋๋ค!!