posts

๐Ÿ“˜ ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ & ์Šคํƒ€์ผ ์„ค๊ณ„ ์ „๋žต์„œ

Oct 1, 2025 updated Oct 1, 2025 architecturecss

๐Ÿ“˜ ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ & ์Šคํƒ€์ผ ์„ค๊ณ„ ์ „๋žต์„œ

๐Ÿ“š ๋ชฉ์ฐจ

  1. ๊ฐœ์š” ์š”์•ฝ
  2. ๋ฌธ์ œ ์ •์˜ ๋ฐ ๋…ผ์˜ ๋ชฉ์ 
  3. ์‹ค๋ฌด์—์„œ ๋งˆ์ฃผ์นœ ์ฃผ์š” ๊ณผ์ œ๋“ค
  4. ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ „๋žต ์ •๋ฆฌ
    • 4.1 ์Šคํƒ€์ผ vs ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
    • 4.2 DDC ํด๋” ๊ตฌ์กฐ ์ œ์•ˆ (core/ui ๊ธฐ๋ฐ˜)
  5. ์ถ”์ฒœ ๋ฐฉ์•ˆ ์ •๋ฆฌ
  6. ์‹ค๋ฌด ์ ์šฉ ๊ธฐ์ค€ ์š”์•ฝ
  7. ๊ฒฐ๋ก  ๋ฐ ํ–ฅํ›„ ๋Œ€์‘

๐Ÿงญ 1. ๊ฐœ์š” ์š”์•ฝ

์ด ๋ฌธ์„œ๋Š” ๋‹จ๊ธฐ ๊ตฌ์ถ•ํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ค‘์‹ฌ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ์‹ค๋ฌด ์„ค๊ณ„ ์ „๋žต์„ ์ •๋ฆฌํ•œ ๊ฒƒ์ด๋‹ค:

  • UI ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ์™€ CSS์˜ ์ด์ƒ์  ๋ถ„๋ฆฌ ๊ธฐ์ค€
  • ํ˜„์‹ค์ ์ธ ํ”„๋กœ์ ํŠธ ์†๋„์™€ ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅ์„ฑ์„ ๊ณ ๋ คํ•œ ํด๋” ๊ตฌ์กฐ ๋ฐ ์„ค๊ณ„ ๋ฐฉ์•ˆ

๐ŸŽฏ 2. ๋ฌธ์ œ ์ •์˜ ๋ฐ ๋…ผ์˜ ๋ชฉ์ 

๐Ÿ“Œ ๋ชฉ์ 

  • ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ ์ด์ƒ์ ์ธ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋””๊นŒ์ง€ ์ถ”๊ตฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€?
  • ์Šคํƒ€์ผ์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ณผ์—ฐ ํ•ฉ๋ฆฌ์ ์ธ๊ฐ€?
  • ์Šคํƒ€์ผ์ด ์ปดํฌ๋„ŒํŠธ์™€ ๊ฒฐํ•ฉ๋  ๊ฒฝ์šฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ์€ ์–ด๋–ป๊ฒŒ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

โ— 3. ์‹ค๋ฌด์—์„œ ๋งˆ์ฃผ์นœ ์ฃผ์š” ๊ณผ์ œ๋“ค

๊ณ ๋ฏผ ์‚ฌ๋ก€ ์„ค๋ช… ๋ฐœ์ƒ ์›์ธ
์ƒํ’ˆ๋ฆฌ์ŠคํŠธ ์Šคํƒ€์ผ ์žฌ์‚ฌ์šฉ ์—ฌ๋Ÿฌ ํ™”๋ฉด์—์„œ ๊ฐ™์€ ๋ ˆ์ด์•„์›ƒ์„ ๋ณต๋ถ™, ํด๋ž˜์Šค ์ˆœ์„œ ๋ˆ„๋ฝ ์‹œ UI ๊นจ์ง CSS ๊ธฐ์–ต ์˜์กด, ๋ฌธ์„œ ๋ถ€์žฌ
์œ ํ‹ธ ๋ฒ„ํŠผ ์Šคํƒ€์ผ์„ ๋ณต๋ถ™ ์‚ฌ์šฉ btn-primary, btn-lg ๋“ฑ ์ถ”์ƒํ™”๋Š” ๋˜์–ด ์žˆ์œผ๋‚˜, hover ์‹œ๋งˆ๋‹ค ๋‹ค๋ฆ„ UI ์˜๋ฏธ์™€ ํด๋ž˜์Šค ๋ช…์ด ๋งคํ•‘๋˜์ง€ ์•Š์Œ
๊ฐœ๋ฐœ์ž๋งˆ๋‹ค DOM ๊ตฌ์กฐ ๊ตฌ์„ฑ ๋‹ค๋ฆ„ ๊ฐ™์€ ์นด๋“œ๋ผ๋„ ๋ˆ„๋ฝ/๊ณผ์ž‰ ๊ตฌ์กฐ๊ฐ€ ์ƒ๊น€ ๊ตฌ์กฐ ์บก์Аํ™” ๋ถ€์žฌ
๋ฆฌํŒฉํ† ๋ง ์‹œ ๊ตฌ์กฐ ๋ณ€๊ฒฝ ํŒŒ๊ธ‰ UI๊ฐ€ CSS ๊ธฐ๋ฐ˜์ผ ๊ฒฝ์šฐ DOM ๋ฐ”๋€Œ๋ฉด ์ „๋ฉด ์ˆ˜์ • ํ•„์š” ๊ตฌ์กฐ-์Šคํƒ€์ผ ๋ถ„๋ฆฌ ์‹คํŒจ
์Šคํƒ€์ผ๋งŒ ํ•„์š”ํ•˜์ง€๋งŒ ์ปดํฌ๋„ŒํŠธํ™”๋จ ๋‹จ์ˆœ ํƒ€์ดํ‹€/์„น์…˜์ธ๋ฐ๋„ ์ปดํฌ๋„ŒํŠธํ™” ๊ธฐ์ค€ ์—†๋Š” ๋ถ„๋ฆฌ
๊ธฐ์–ต ์˜์กด 3๊ฐœ์›” ๋’ค class ์กฐํ•ฉ, ์ˆœ์„œ, ๊ตฌ์กฐ ๋“ฑ ์žŠ์Œ ๋ฌธ์„œํ™” ๋ฏธํก, ์บก์Аํ™” ๋ถ€์กฑ

๐Ÿ›  4. ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ „๋žต ์ •๋ฆฌ

4.1 ์Šคํƒ€์ผ vs ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํ•ญ๋ชฉ CSS ์กฐ๋ฆฝ(์Šคํƒ€์ผ ๋ถ„๋ฆฌ) ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ
DOM ๊ตฌ์กฐ ๋ณต์žก๋„ ๋‹จ์ˆœ 3๋‹จ ์ด์ƒ ์ค‘์ฒฉ
์ƒํƒœ ์ œ์–ด ์—ฌ๋ถ€ ์—†์Œ ์žˆ์Œ (hover, loading, skeleton ๋“ฑ)
๋ฐ˜๋ณต ์žฌ์‚ฌ์šฉ ๋นˆ๋„ ๋‚ฎ์Œ ๋†’์Œ
์กฐ๋ฆฝ ์‹œ ์‹ค์ˆ˜ ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ (์ˆœ์„œ, ํด๋ž˜์Šค ๋ˆ„๋ฝ) ๋‚ฎ์Œ
๋ฌธ์„œํ™” ํ•„์š”์„ฑ ๋†’์Œ (class ๊ธฐ์–ต ํ•„์š”) ๋‚ฎ์Œ (์ปดํฌ๋„ŒํŠธ ์ถ”์ƒํ™”)
๋””์ž์ด๋„ˆ โ†’ ๊ฐœ๋ฐœ์ž ์ „๋‹ฌ ํšจ์œจ์„ฑ ๋‚ฎ์Œ ๋†’์Œ
๋””์ž์ธ ๋ณ€๊ฒฝ ์‹œ ์˜ํ–ฅ ๋ฒ”์œ„ ์ „์—ญ์  (ํด๋ž˜์Šค ์žฌ์ •์˜) ๊ตญ์ง€์  (์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€๋งŒ ์ˆ˜์ •)
๋‹จ๊ธฐ ๊ตฌ์ถ•์— ์ ํ•ฉ ๋ถ€๋ถ„์ ์œผ๋กœ ๊ตฌ์กฐ ๊ณ ์ • ์‹œ ์œ ๋ฆฌ

4.2 DDC ํด๋” ๊ตฌ์กฐ ์ œ์•ˆ (core/ui ๊ธฐ๋ฐ˜)

/src
  โ”œโ”€โ”€ components/
  โ”‚   โ”œโ”€โ”€ core/
  โ”‚   โ”‚   โ”œโ”€โ”€ Button/
  โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Button.tsx
  โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ Button.module.css
  โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ index.ts
  โ”‚   โ”‚   โ””โ”€โ”€ Input/
  โ”‚   โ”‚       โ”œโ”€โ”€ Input.tsx
  โ”‚   โ”‚       โ”œโ”€โ”€ Input.module.css
  โ”‚   โ”‚       โ””โ”€โ”€ index.ts
  โ”‚   โ””โ”€โ”€ ui/
  โ”‚       โ”œโ”€โ”€ ProductCard/
  โ”‚       โ”‚   โ”œโ”€โ”€ ProductCard.tsx
  โ”‚       โ”‚   โ”œโ”€โ”€ ProductCard.module.css
  โ”‚       โ”‚   โ””โ”€โ”€ index.ts
  โ”‚       โ””โ”€โ”€ ProductList/
  โ”‚           โ”œโ”€โ”€ ProductList.tsx
  โ”‚           โ””โ”€โ”€ ProductList.module.css
  โ””โ”€โ”€ styles/
      โ”œโ”€โ”€ tokens.css
      โ”œโ”€โ”€ mixins.css
      โ””โ”€โ”€ globals.css

๐Ÿฅ‡ 5. ์ถ”์ฒœ ๋ฐฉ์•ˆ ์ •๋ฆฌ

  • ์Šคํƒ€์ผ๋งŒ ์กด์žฌํ•˜๋Š” ๊ตฌ์กฐ๋Š” ์žฅ๊ธฐ์  ์‹ ๋ขฐ์„ฑ ํ™•๋ณด์— ์‹คํŒจํ•จ โ†’ ๊ตฌ์กฐ๋ฅผ ๋ชจ๋ฅด๋ฉด class๋ฅผ ์ž˜๋ชป ์กฐํ•ฉํ•  ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ
  • UI ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ์‚ฌ์šฉ ๋ชฉ์ ์ด ์•„๋‹Œ, "์กฐ๋ฆฝ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋ฌธ์„œํ™”๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋ชฉ์ "์œผ๋กœ ํ•„์š”
  • components/core์™€ components/ui๋Š” ๋ชฉ์ , ์žฌ์‚ฌ์šฉ ๋ฒ”์œ„, ์„ค๊ณ„ ์ˆ˜์ค€์ด ๋ช…ํ™•ํžˆ ๋‹ค๋ฅด๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋ถ„๋ฆฌ

โœ… 6. ์‹ค๋ฌด ์ ์šฉ ๊ธฐ์ค€ ์š”์•ฝ

๋ถ„๋ฅ˜ ์ ์šฉ ๊ธฐ์ค€ ์˜ˆ์‹œ
core ์ปดํฌ๋„ŒํŠธ ์—ฌ๋Ÿฌ ํ™”๋ฉด/๋„๋ฉ”์ธ์—์„œ ์žฌ์‚ฌ์šฉ, ๊ธฐ๋Šฅ ์ค‘์‹ฌ Button, Input, Icon, Modal
ui ์ปดํฌ๋„ŒํŠธ ํŠน์ • ๋„๋ฉ”์ธ ์ „์šฉ, ๊ตฌ์กฐ+์Šคํƒ€์ผ ์บก์Аํ™” ProductCard, SearchBox, FilterGroup
CSS ์™ธ๋ถ€ํ™” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ ์Šคํƒ€์ผ(๋ณ€์ˆ˜, ํ•จ์ˆ˜, ๋ฆฌ์…‹ ๋“ฑ)๋งŒ tokens, mixins
์Šคํƒ€์ผ ๋กœ์ปฌํ™” ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์— ์ข…์†๋œ ์Šคํƒ€์ผ์€ ๋กœ์ปฌ ์œ ์ง€ ProductCard.module.css
UI ์„ค๊ณ„ ์‹คํŒจ ์ง€์  class ์ˆœ์„œ ์˜ค๋ฅ˜, DOM ๋ˆ„๋ฝ, ๊ธฐ์–ต ์˜์กด ๋“ฑ ๋ณต๋ถ™์œผ๋กœ ๋™์ผ UI ๋ณต์› ๋ถˆ๊ฐ€

๐Ÿ”š 7. ๊ฒฐ๋ก  ๋ฐ ํ–ฅํ›„ ๋Œ€์‘

  • ๋‹จ๊ธฐ ๊ตฌ์ถ• ํ”„๋กœ์ ํŠธ๋ผ ํ•ด๋„ UI ์กฐ๋ฆฝ์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ๊ตฌ์กฐ ์ผ๊ด€์„ฑ ํ™•๋ณด๋ฅผ ์œ„ํ•ด ์ผ์ • ์ˆ˜์ค€์˜ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ๋Š” ํ•„์ˆ˜์ ์ด๋‹ค.
  • ์Šคํƒ€์ผ ์ถ”์ƒํ™”๋งŒ์œผ๋กœ๋Š” ์‹ค์ œ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์—์„œ ์‹ค์ˆ˜๋ฅผ ์œ ๋ฐœํ•˜๋ฉฐ, ํŠนํžˆ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž์™€์˜ ํ˜‘์—…์ด๋‚˜ ์žฅ๊ธฐ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ๋Š” ๋…์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ถ”์ฒœ ๊ตฌ์กฐ๋Š” components/core, components/ui, styles ์„ธ ๋ ˆ์ด์–ด๋ฅผ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ณ , โ€œ๊ธฐ์–ตํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์„ค๊ณ„โ€๋ฅผ ์ง€ํ–ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ดํ›„ ์šด์˜ ํ”„๋กœ์ ํŠธ๋กœ ์ „ํ™˜๋˜๊ฑฐ๋‚˜ ๋””์ž์ธ ์‹œ์Šคํ…œ ๊ตฌ์ถ•์œผ๋กœ ๋ฐœ์ „ํ•  ๊ฒฝ์šฐ, components/core๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ถ”์ถœ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ์ „์ œ๋กœ ์„ค๊ณ„ํ•ด๋‘๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค.