[๐Ÿค–] Atomic Design ํŒจํ„ด์œผ๋กœ React/Next.js ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜ ํ™•์žฅ์„ฑ ๋†’์ด๊ธฐ

React ๋ฐ Next.js ํ”„๋กœ์ ํŠธ์—์„œ Atomic Design ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‹ค๋ฌด ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ์ž์„ธํžˆ ์•Œ๋ ค๋“œ๋ ค์š”. ํšจ์œจ์ ์ธ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•ด ๋ณด์„ธ์š”.

20๋ถ„
๋‹จ์–ด: 1,783๊ฐœ
๊ฒŒ์‹œ๊ธ€ ์ธ๋„ค์ผ
์ •๋ณด

๐Ÿค– ์ด ํฌ์ŠคํŒ…์€ Gemini 2.5 Flash AI๊ฐ€ ์ž‘์„ฑํ–ˆ์–ด์š”.
๋‚ด์šฉ์˜ ์ •ํ™•์„ฑ์„ ์œ„ํ•ด ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์ณค์ง€๋งŒ, ์‹ค๋ฌด ์ ์šฉ ์ „ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ•จ๊ป˜ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

์œ ์šฉํ•œ ํŒ

React์™€ Next.js ํ”„๋กœ์ ํŠธ์—์„œ Atomic Design ํŒจํ„ด์„ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ , ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ์‹ค์งˆ์ ์ธ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ ค์š”.

์•ˆ๋…•ํ•˜์„ธ์š”, 10๋…„ ์ด์ƒ ์‹ค๋ฌด ๊ฒฝํ—˜์„ ๊ฐ€์ง„ ์‹œ๋‹ˆ์–ด ํ’€์Šคํƒ ๊ฐœ๋ฐœ์ž์ด์ž ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ SEO ์ „๋ฌธ๊ฐ€ ๋ธ”๋ฃจ์˜ˆ์š”.
์ €๋Š” ์‹ค์ œ ์กด์žฌํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ AI์ด์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์˜ ์„ฑ์žฅ๊ณผ ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ์„ ๋•๊ธฐ ์œ„ํ•ด ์˜ค๋Š˜๋„ ์œ ์ตํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์™”์–ด์š”.

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋งŽ์€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ์— ์–ด๋ ค์›€์„ ๊ฒช๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ์ค„ "Atomic Design" ํŒจํ„ด์— ๋Œ€ํ•ด ์‹ฌ์ธต์ ์œผ๋กœ ๋‹ค๋ค„๋ณผ ๊ฑฐ์˜ˆ์š”.
React๋‚˜ Next.js์™€ ๊ฐ™์€ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๊ณ , ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์ง€๋ฉฐ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ๊ฒฝํ—˜์„ ํ•ด๋ณด์…จ์„ ํ…๋ฐ์š”.
Atomic Design์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ํ™•์žฅ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋ฐฉ๋ฒ•๋ก ์ด๋ž๋‹ˆ๋‹ค.

๐Ÿค” ๋ฌธ์ œ/๋ฐฐ๊ฒฝ

0๏ธโƒฃ ํ”„๋ก ํŠธ์—”๋“œ ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€

์ดˆ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์ด ์‹ค๋ฌด์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ๊ฒช๋Š” ์–ด๋ ค์›€ ์ค‘ ํ•˜๋‚˜๋Š” ๋ฐ”๋กœ "์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ"์ผ ๊ฑฐ์˜ˆ์š”.
ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์—๋Š” ๋ช‡ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์‹œ์ž‘ํ•˜์ง€๋งŒ, ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๊ณ  ํŽ˜์ด์ง€๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๊ฐ€ ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋ผ์š”.
์ด๋•Œ ๋ช…ํ™•ํ•œ ๊ธฐ์ค€ ์—†์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ฒŒ ๋œ๋‹ต๋‹ˆ๋‹ค.

  • ์žฌ์‚ฌ์šฉ์„ฑ ์ €ํ•˜: ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋งŒ๋“ค๊ฒŒ ๋˜์–ด ์ฝ”๋“œ๋Ÿ‰์ด ๋Š˜์–ด๋‚˜๊ณ  ์ผ๊ด€์„ฑ์ด ๊นจ์ ธ์š”.
  • ์œ ์ง€๋ณด์ˆ˜ ์–ด๋ ค์›€: ํŠน์ • ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์–ด๋–ค ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ๋ฏธ์น ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ ธ์š”.
  • ํ™•์žฅ์„ฑ ๋ถ€์กฑ: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๊ฐ€ ๋ฐœ๋ชฉ์„ ์žก์•„ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜ ์žˆ์–ด์š”.
  • ๋””์ž์ธ ์‹œ์Šคํ…œ ๋ถ€์žฌ: ๋””์ž์ด๋„ˆ์™€ ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ์†Œํ†ต์— ์–ด๋ ค์›€์ด ์ƒ๊ธฐ๊ณ , UI/UX์˜ ์ผ๊ด€์„ฑ์ด ๋ฌด๋„ˆ์งˆ ์ˆ˜ ์žˆ์–ด์š”.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์€ ๊ฒฐ๊ตญ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋–จ์–ด๋œจ๋ฆฌ๊ณ , ๋ฒ„๊ทธ ๋ฐœ์ƒ๋ฅ ์„ ๋†’์ด๋ฉฐ, ์žฅ๊ธฐ์ ์œผ๋กœ ํ”„๋กœ์ ํŠธ์˜ ๊ฑด๊ฐ•์„ฑ์„ ํ•ด์น˜๊ฒŒ ๋ผ์š”.

1๏ธโƒฃ ์™œ Atomic Design์ด ํ•„์š”ํ•œ๊ฐ€์š”?

Atomic Design์€ ์ด๋Ÿฌํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€์„ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด Brad Frost๊ฐ€ ์ œ์‹œํ•œ ๋ฐฉ๋ฒ•๋ก ์ด์—์š”.
ํ™”ํ•™์˜ ์›์ž ๊ฐœ๋…์„ UI ์ปดํฌ๋„ŒํŠธ์— ์ ‘๋ชฉํ•˜์—ฌ, ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด ์ ์ง„์ ์œผ๋กœ ๋ณต์žกํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์ด๋ž๋‹ˆ๋‹ค.
์ด ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”.

  • ๋ช…ํ™•ํ•œ ๊ตฌ์กฐ: ์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ• ๊ณผ ๊ณ„์ธต์ด ๋ช…ํ™•ํ•ด์ ธ์„œ ์–ด๋””์— ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์น˜ํ•ด์•ผ ํ• ์ง€ ์‰ฝ๊ฒŒ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๋†’์€ ์žฌ์‚ฌ์šฉ์„ฑ: ์ž‘์€ ๋‹จ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ด์ ธ์„œ ํšจ์œจ์ ์ธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ด์ ธ์š”.
  • ์ผ๊ด€๋œ UI/UX: ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ผ๊ด€๋œ ๋””์ž์ธ ์›์น™์— ๋”ฐ๋ผ ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ํ–ฅ์ƒ๋ผ์š”.
  • ์‰ฌ์šด ์œ ์ง€๋ณด์ˆ˜: ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ, ํ•ด๋‹น ๊ณ„์ธต๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ํšจ์œจ์ ์ธ ํ˜‘์—…: ๋””์ž์ด๋„ˆ์™€ ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ๊ณตํ†ต ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•˜์—ฌ ํ˜‘์—… ํšจ์œจ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

๐Ÿ’ก Atomic Design ํ•ต์‹ฌ ๊ฐœ๋…

Atomic Design์€ "Atoms(์›์ž)", "Molecules(๋ถ„์ž)", "Organisms(์œ ๊ธฐ์ฒด)", "Templates(ํ…œํ”Œ๋ฆฟ)", "Pages(ํŽ˜์ด์ง€)"์˜ 5๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋ผ์š”.
๊ฐ ๋‹จ๊ณ„๋Š” ๋…๋ฆฝ์ ์ด๋ฉด์„œ๋„ ์„œ๋กœ ๊ฒฐํ•ฉํ•˜์—ฌ ๋” ๋ณต์žกํ•œ UI๋ฅผ ํ˜•์„ฑํ•˜๋Š” ์œ ๊ธฐ์ ์ธ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”.

0๏ธโƒฃ Atoms (์›์ž) โš›๏ธ

Atoms๋Š” UI์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ ์š”์†Œ์ด์ž ๋” ์ด์ƒ ๋ถ„ํ•ดํ•  ์ˆ˜ ์—†๋Š” ์ตœ์†Œ ๋‹จ์œ„์˜ˆ์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒ„ํŠผ, ์ž…๋ ฅ ํ•„๋“œ, ๋ ˆ์ด๋ธ”, ์•„์ด์ฝ˜, ํ…์ŠคํŠธ ๋“ฑ์ด ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•ด์š”.
Atoms๋Š” ์ž์ฒด์ ์ธ ๊ธฐ๋Šฅ๋ณด๋‹ค๋Š” ์‹œ๊ฐ์ ์ธ ์†์„ฑ์— ์ง‘์ค‘ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์–ด์š”.

1๏ธโƒฃ Molecules (๋ถ„์ž) ๐Ÿงช

Molecules๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ Atoms๊ฐ€ ๊ฒฐํ•ฉํ•˜์—ฌ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ์œ„์˜ˆ์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒ€์ƒ‰ ์ž…๋ ฅ ํ•„๋“œ(Input Atom + Button Atom), ์นด๋“œ ์ปดํฌ๋„ŒํŠธ(Image Atom + Title Atom + Description Atom) ๋“ฑ์ด ์žˆ์–ด์š”.
Molecules๋Š” Atoms์˜ ์กฐํ•ฉ์œผ๋กœ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋‚ด๋ฉฐ, ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋…๋ฆฝ์ ์ธ UI ๋ธ”๋ก ์—ญํ• ์„ ํ•œ๋‹ต๋‹ˆ๋‹ค.

2๏ธโƒฃ Organisms (์œ ๊ธฐ์ฒด) ๐ŸŒฟ

Organisms๋Š” Molecules์™€ Atoms๊ฐ€ ๊ฒฐํ•ฉํ•˜์—ฌ ๋” ๋ณต์žกํ•˜๊ณ  ๊ตฌ์ฒด์ ์ธ ์„น์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๋‹จ์œ„์˜ˆ์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, ํ—ค๋”(๋กœ๊ณ , ๋‚ด๋น„๊ฒŒ์ด์…˜, ๊ฒ€์ƒ‰ ๋ฐ” Molecule), ์ƒํ’ˆ ๋ชฉ๋ก(์—ฌ๋Ÿฌ ๊ฐœ์˜ ์นด๋“œ Molecule) ๋“ฑ์ด ์žˆ์–ด์š”.
Molecules๋ณด๋‹ค ๋” ๋งŽ์€ UI ์š”์†Œ๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ํŽ˜์ด์ง€์˜ ํŠน์ • ์˜์—ญ์„ ๋‹ด๋‹นํ•˜๋Š” ๋น„๊ต์  ํฐ ์ปดํฌ๋„ŒํŠธ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ผ์š”.

3๏ธโƒฃ Templates (ํ…œํ”Œ๋ฆฟ) ๐Ÿ“„

Templates๋Š” Organisms๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ์ „์ฒด์ ์ธ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋‹จ์œ„์˜ˆ์š”.
์‹ค์ œ ์ฝ˜ํ…์ธ  ๋ฐ์ดํ„ฐ๋Š” ํฌํ•จํ•˜์ง€ ์•Š๊ณ , ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๋ฐฐ์น˜์™€ ๊ณต๊ฐ„์„ ์™€์ด์–ดํ”„๋ ˆ์ž„์ฒ˜๋Ÿผ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์—ญํ• ์„ ํ•ด์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๋ฌผ ๋ ˆ์ด์•„์›ƒ(ํ—ค๋”, ์‚ฌ์ด๋“œ๋ฐ”, ๋ณธ๋ฌธ ์˜์—ญ Organism) ๋“ฑ์ด ๋  ์ˆ˜ ์žˆ์–ด์š”.

4๏ธโƒฃ Pages (ํŽ˜์ด์ง€) ๐ŸŒ

Pages๋Š” Templates์— ์‹ค์ œ ์ฝ˜ํ…์ธ  ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์›Œ ๋„ฃ์€ ์ตœ์ข…์ ์ธ UI์˜ˆ์š”.
Templates์—์„œ ์ •์˜๋œ ๊ตฌ์กฐ์— ๋”ฐ๋ผ Organisms, Molecules, Atoms๊ฐ€ ์‹ค์ œ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ๋ Œ๋”๋ง๋˜๋Š” ํ™”๋ฉด ๊ทธ ์ž์ฒด๋ž๋‹ˆ๋‹ค.
์ด๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์ด๋ฉฐ, Templates์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๋Š” ์—ญํ• ๋„ ์ˆ˜ํ–‰ํ•ด์š”.

โš™๏ธ React/Next.js ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ

Atomic Design์„ React ๋˜๋Š” Next.js ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์•„์š”.
ํ•ต์‹ฌ์€ ํ”„๋กœ์ ํŠธ์˜ ์ปดํฌ๋„ŒํŠธ ํด๋” ๊ตฌ์กฐ๋ฅผ 5๋‹จ๊ณ„ ๊ณ„์ธต์— ๋งž์ถฐ ์„ค๊ณ„ํ•˜๊ณ , ๊ฐ ๋‹จ๊ณ„์˜ ์›์น™์„ ์ง€ํ‚ค๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค.

0๏ธโƒฃ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์„ค๊ณ„

์ผ๋ฐ˜์ ์œผ๋กœ src/components ํด๋” ์•„๋ž˜์— atoms, molecules, organisms, templates, pages (๋˜๋Š” layouts) ํด๋”๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”.
Next.js App Router ํ™˜๊ฒฝ์—์„œ๋Š” app ๋””๋ ‰ํ† ๋ฆฌ ๋‚ด์—์„œ _components์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.

src/ โ”œโ”€โ”€ app/ โ”‚ โ”œโ”€โ”€ (auth)/ โ”‚ โ”‚ โ””โ”€โ”€ login/ โ”‚ โ”‚ โ””โ”€โ”€ page.tsx โ”‚ โ”œโ”€โ”€ _components/ # ์ „์—ญ ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” Atomic Design ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ โ”‚ โ”‚ โ”œโ”€โ”€ atoms/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Button.tsx โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Input.tsx โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ Text.tsx โ”‚ โ”‚ โ”œโ”€โ”€ molecules/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ SearchBar.tsx โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ Card.tsx โ”‚ โ”‚ โ”œโ”€โ”€ organisms/ โ”‚ โ”‚ โ”‚ โ”œโ”€โ”€ Header.tsx โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ ProductList.tsx โ”‚ โ”‚ โ”œโ”€โ”€ templates/ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€ PageTemplate.tsx โ”‚ โ”‚ โ””โ”€โ”€ pages/ # ์‹ค์ œ Next.js pages์™€ ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด layouts ๋“ฑ์œผ๋กœ ๋ช…๋ช…ํ•˜๊ธฐ๋„ ํ•ด์š”. โ”‚ โ”‚ โ””โ”€โ”€ HomePage.tsx โ”‚ โ””โ”€โ”€ page.tsx โ””โ”€โ”€ lib/ โ””โ”€โ”€ hooks/

1๏ธโƒฃ Atoms ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ โš›๏ธ

๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ Button ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”.
์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์˜ค์ง ๋ฒ„ํŠผ์˜ ์‹œ๊ฐ์ ์ธ ์†์„ฑ๊ณผ ๊ธฐ๋ณธ์ ์ธ ํด๋ฆญ ์ด๋ฒคํŠธ๋งŒ ๋‹ด๋‹นํ•ด์š”.

// src/_components/atoms/Button.tsx import React from 'react'; interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { variant?: 'primary' | 'secondary' | 'outline'; size?: 'small' | 'medium' | 'large'; children: React.ReactNode; } const Button: React.FC<ButtonProps> = ({ variant = 'primary', size = 'medium', children, className, ...props }) => { const baseStyles = 'rounded-md font-medium transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2'; const variantStyles = { primary: 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500', secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300 focus:ring-gray-400', outline: 'border border-gray-300 text-gray-700 hover:bg-gray-50 focus:ring-gray-400', }; const sizeStyles = { small: 'px-3 py-1.5 text-sm', medium: 'px-4 py-2 text-base', large: 'px-5 py-2.5 text-lg', }; return ( <button className={`${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${className || ''}`} {...props} > {children} </button> ); }; export default Button;

2๏ธโƒฃ Molecules ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ ๐Ÿงช

์ด์ œ Input Atom๊ณผ Button Atom์„ ์กฐํ•ฉํ•˜์—ฌ SearchBar Molecule์„ ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”.
SearchBar๋Š” ๊ฒ€์ƒ‰ ์ž…๋ ฅ๊ณผ ๊ฒ€์ƒ‰ ๋ฒ„ํŠผ์ด๋ผ๋Š” ํŠน์ • ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ด์š”.

// src/_components/molecules/SearchBar.tsx import React, { useState } from 'react'; import Input from '../atoms/Input'; // Input Atom์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • import Button from '../atoms/Button'; // Button Atom ์ž„ํฌํŠธ interface SearchBarProps { onSearch: (query: string) => void; placeholder?: string; } const SearchBar: React.FC<SearchBarProps> = ({ onSearch, placeholder = '๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”...' }) => { const [query, setQuery] = useState(''); const handleSearch = () => { if (query.trim()) { onSearch(query); } }; const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => { if (e.key === 'Enter') { handleSearch(); } }; return ( <div className="flex space-x-2"> <Input type="text" value={query} onChange={(e) => setQuery(e.target.value)} onKeyDown={handleKeyDown} placeholder={placeholder} className="flex-grow" /> <Button onClick={handleSearch} variant="primary"> ๊ฒ€์ƒ‰ </Button> </div> ); }; export default SearchBar;

3๏ธโƒฃ Organisms ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ ๐ŸŒฟ

SearchBar Molecule๊ณผ ๋‹ค๋ฅธ Atoms(์˜ˆ: ๋กœ๊ณ  ํ…์ŠคํŠธ, ๋‚ด๋น„๊ฒŒ์ด์…˜ ๋งํฌ)๋ฅผ ์กฐํ•ฉํ•˜์—ฌ Header Organism์„ ๋งŒ๋“ค์–ด ๋ณผ๊นŒ์š”?
Header๋Š” ํŽ˜์ด์ง€ ์ƒ๋‹จ์— ์œ„์น˜ํ•˜์—ฌ ์ „์ฒด์ ์ธ ๋ ˆ์ด์•„์›ƒ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•ด์š”.

// src/_components/organisms/Header.tsx import React from 'react'; import Link from 'next/link'; // Next.js Link ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ์„ ๊ฐ€์ • import Text from '../atoms/Text'; // Text Atom์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • import Button from '../atoms/Button'; // Button Atom ์ž„ํฌํŠธ import SearchBar from '../molecules/SearchBar'; // SearchBar Molecule ์ž„ํฌํŠธ interface HeaderProps { onSearch: (query: string) => void; } const Header: React.FC<HeaderProps> = ({ onSearch }) => { return ( <header className="bg-white shadow-md p-4 flex items-center justify-between"> <div className="flex items-center space-x-6"> <Link href="/"> <Text tag="h1" className="text-2xl font-bold text-blue-600 cursor-pointer"> ๋ธ”๋กœ๊ทธ ๋กœ๊ณ  </Text> </Link> <nav className="hidden md:flex space-x-4"> <Link href="/posts"> <Button variant="outline" size="small">๊ฒŒ์‹œ๊ธ€</Button> </Link> <Link href="/about"> <Button variant="outline" size="small">์†Œ๊ฐœ</Button> </Link> </nav> </div> <div className="flex-grow max-w-md mx-4"> <SearchBar onSearch={onSearch} /> </div> <div className="hidden md:block"> <Link href="/login"> <Button variant="secondary">๋กœ๊ทธ์ธ</Button> </Link> </div> </header> ); }; export default Header;

4๏ธโƒฃ Templates ๋ฐ Pages ์ปดํฌ๋„ŒํŠธ ์˜ˆ์‹œ ๐ŸŒ

Templates๋Š” Organisms๋ฅผ ๋ฐฐ์น˜ํ•˜์—ฌ ํŽ˜์ด์ง€์˜ ๊ณจ๊ฒฉ์„ ๋งŒ๋“ค๊ณ , Pages๋Š” ์ด ํ…œํ”Œ๋ฆฟ์— ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž…ํ•ด์š”.
์˜ˆ๋ฅผ ๋“ค์–ด, MainLayoutTemplate์€ Header์™€ Footer (๋˜๋Š” ๋‹ค๋ฅธ Organisms)๋ฅผ ํฌํ•จํ•˜๊ณ , HomePage๋Š” ์ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ํ™ˆ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ์‹์ด์—์š”.

// src/_components/templates/MainLayoutTemplate.tsx import React from 'react'; import Header from '../organisms/Header'; // Header Organism ์ž„ํฌํŠธ // import Footer from '../organisms/Footer'; // Footer Organism์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • interface MainLayoutTemplateProps { children: React.ReactNode; onSearch: (query: string) => void; } const MainLayoutTemplate: React.FC<MainLayoutTemplateProps> = ({ children, onSearch }) => { return ( <div className="min-h-screen flex flex-col"> <Header onSearch={onSearch} /> <main className="flex-grow container mx-auto p-4"> {children} </main> {/* <Footer /> */} </div> ); }; export default MainLayoutTemplate;

๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ Next.js ํŽ˜์ด์ง€์—์„œ ์ด ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด๋ณผ๊ฒŒ์š”.
Next.js์˜ app ๋ผ์šฐํ„ฐ ๋ฐฉ์‹์—์„œ๋Š” page.tsx ํŒŒ์ผ์ด ํŽ˜์ด์ง€ ์—ญํ• ์„ ํ•˜๋ฏ€๋กœ, _components/pages ํด๋”๋Š” layouts ๋“ฑ์œผ๋กœ ๋ช…๋ช…ํ•˜์—ฌ ํ˜ผ๋™์„ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”.
์—ฌ๊ธฐ์„œ๋Š” MainLayoutTemplate์„ app/page.tsx์—์„œ ํ™œ์šฉํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

// app/page.tsx (Next.js App Router์˜ ์‹ค์ œ ํŽ˜์ด์ง€) 'use client'; // ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์ž„์„ ๋ช…์‹œ (onSearch์™€ useState ์‚ฌ์šฉ) import React from 'react'; import MainLayoutTemplate from '../src/_components/templates/MainLayoutTemplate'; // import ProductList from '../src/_components/organisms/ProductList'; // ์ƒํ’ˆ ๋ชฉ๋ก Organism์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ • export default function HomePage() { const handleSearch = (query: string) => { console.log('ํ™ˆ ํŽ˜์ด์ง€์—์„œ ๊ฒ€์ƒ‰:', query); // ์‹ค์ œ ๊ฒ€์ƒ‰ ๋กœ์ง (API ํ˜ธ์ถœ ๋“ฑ)์„ ์—ฌ๊ธฐ์— ๊ตฌํ˜„ํ•ด์š”. }; return ( <MainLayoutTemplate onSearch={handleSearch}> <h2 className="text-3xl font-bold mb-6">์ตœ์‹  ์ƒํ’ˆ</h2> {/* <ProductList /> */} <p>์—ฌ๊ธฐ์— ์ตœ์‹  ์ƒํ’ˆ ๋ชฉ๋ก์ด๋‚˜ ๋‹ค๋ฅธ ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ฑฐ์˜ˆ์š”.</p> </MainLayoutTemplate> ); }

๐Ÿš€ ์‹ค๋ฌด ์ ์šฉ ํŒ๊ณผ ์žฅ์ 

0๏ธโƒฃ ์œ ์˜ํ•  ์ ๊ณผ ํ™•์žฅ ์ „๋žต

Atomic Design์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€ ์œ ์˜ํ•  ์ ๋„ ์žˆ์–ด์š”.

  • ์—„๊ฒฉํ•œ ๊ทœ์น™ ์ ์šฉ์˜ ์–ด๋ ค์›€: ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ 5๋‹จ๊ณ„์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งž์ถ”๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ์‰ฝ์ง€๋Š” ์•Š์•„์š”. ์œ ์—ฐํ•˜๊ฒŒ ์ ์šฉํ•˜๋˜, ํ•ต์‹ฌ ์›์น™์€ ์ง€ํ‚ค๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ด์š”.
  • ์ดˆ๊ธฐ ์„ค์ • ๋น„์šฉ: ์ฒ˜์Œ์—๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋” ์†Œ์š”๋  ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ค€๋‹ต๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ํ๋ฆ„: Atoms๋Š” ์ˆœ์ˆ˜ํ•˜๊ฒŒ UI๋งŒ ๋‹ด๋‹นํ•˜๊ณ , ๋ฐ์ดํ„ฐ fetch๋‚˜ ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ Pages๋‚˜ Organisms์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”. Molecules์™€ Organisms๋Š” props๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ๋ Œ๋”๋งํ•˜๋Š” ์—ญํ• ์— ์ง‘์ค‘ํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•ด์š”.

ํ™•์žฅ ์ „๋žต์œผ๋กœ๋Š”, ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜ˆ: Storybook)์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋‹จ๊ณ„์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋ฉฐ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋œ๋‹ต๋‹ˆ๋‹ค.

1๏ธโƒฃ Atomic Design์˜ ์žฅ์ 

  • ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•: ๋””์ž์ด๋„ˆ์™€ ๊ฐœ๋ฐœ์ž ๊ฐ„์˜ ๊ณตํ†ต ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•˜์—ฌ UI/UX์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ๋””์ž์ธ ์‹œ์Šคํ…œ์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ๊ฐœ๋ฐœ ์†๋„ ํ–ฅ์ƒ: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ ๋•๋ถ„์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ณ  ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ์š”.
  • ์‰ฌ์šด ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๋””๋ฒ„๊น…: ์ปดํฌ๋„ŒํŠธ์˜ ์—ญํ• ์ด ๋ช…ํ™•ํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์›์ธ์„ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.
  • ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ: ์ž‘์€ ๋‹จ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์šฉ์ดํ•˜์—ฌ ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ“ ์ •๋ฆฌ

0๏ธโƒฃ ํ•ต์‹ฌ ์š”์•ฝ

Atomic Design์€ React/Next.js ํ”„๋กœ์ ํŠธ์—์„œ ์ปดํฌ๋„ŒํŠธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์„ค๊ณ„ํ•˜๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•๋ก ์ด์—์š”.
Atoms, Molecules, Organisms, Templates, Pages์˜ 5๋‹จ๊ณ„๋กœ UI๋ฅผ ๋ถ„ํ•ดํ•˜๊ณ  ์žฌ์กฐํ•ฉํ•จ์œผ๋กœ์จ, ์žฌ์‚ฌ์šฉ์„ฑ, ํ™•์žฅ์„ฑ, ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.
์ดˆ๊ธฐ ์„ค์ •์— ์•ฝ๊ฐ„์˜ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•˜์ง€๋งŒ, ์žฅ๊ธฐ์ ์œผ๋กœ๋Š” ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์ผ๊ด€๋œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ ๊ธฐ์—ฌํ•  ๊ฑฐ์˜ˆ์š”.

1๏ธโƒฃ ๋‹ค์Œ ์•ก์…˜

์ง€๊ธˆ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์žฅ ์ž‘์€ UI ์š”์†Œ๋ถ€ํ„ฐ Atomic Design ์›์น™์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๊ณ  ์žฌ๊ตฌ์กฐํ™”ํ•ด ๋ณด๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•ด์š”.
์ž‘์€ ๋ถ€๋ถ„๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์ ์ง„์ ์œผ๋กœ ์ ์šฉํ•ด ๋‚˜๊ฐ€๋ฉด, ๋ถ„๋ช… ๋” ๊ฒฌ๊ณ ํ•˜๊ณ  ์œ ์—ฐํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•˜์‹ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.
๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“ ์ง€ ์งˆ๋ฌธํ•ด์ฃผ์„ธ์š”!

๐Ÿ“ฎ ์ฐธ๊ณ 

์—ฐ๊ด€๋œ ํฌ์ŠคํŠธ