๐ŸŽจย React Design Pattern  and StoryBook Basic

๐ŸŽจย React Design Pattern and StoryBook Basic

๋ฆฌ์•กํŠธ ๋””์ž์ธ ํŒจํ„ด์— ๋Œ€ํ•œ ์ด๋ก ์ ์ธ ๋‚ด์šฉ๊ณผ ์Šคํ† ๋ฆฌ๋ถ ์ฐ๋จน ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.

ยท

12 min read


์ง€๊ธˆ๊นŒ์ง€ ๊ฐœ๋ฐœ์„ ํ•ด์˜ค๋ฉฐ ์–ด๋–ค ์‹์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ๋ฅผ ๊ณ„์† ๊ณ ๋ฏผํ•ด์™”๋Š”๋ฐ, ์‹ค์€ ์•„์ง ๋‹ต์„ ์ฐพ์ง€๋Š” ๋ชปํ–ˆ๋‹ค. ์ค‘๊ฐ„์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•ด์„œ ์ฃผ๋ณ€ React ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค๊ป˜ ์—ฌ์ญค๋ณด๋ฉฐ ๊ทธ๋“ค์˜ ๊ธฐ์ค€์„ ์•Œ์•„๋ณด๋ ค๋„ ํ•ด๋ดค๊ณ , ๊ตฌ๊ธ€๋ง์ด๋‚˜ ๋‹ค๋ฅธ ๋ถ„๋“ค ์ฝ”๋“œ๋ฅผ ๋งŽ์ด ์‚ดํŽด๋ณด๊ณ ๋„ ํ–ˆ๋Š”๋ฐ ์ •๋‹ต์€ ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

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


๐Ÿงฉ Good Component ?

์ง€๊ธˆ๊นŒ์ง€ ํšŒ์‚ฌ์—์„œ๋‚˜, ์ง‘์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋‹ค๋ณด๋ฉด ๋ถˆ๋งŒ์กฑ ์Šค๋Ÿฌ์šด ๋ถ€๋ถ„์ด ๊ฝค ๋งŽ์•˜๋Š”๋ฐ, ๊ทธ๋Ÿฐ ์ ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด์—ˆ๋‹ค.

  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋‹ค๋ณด๋‹ˆ props ๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๊ณ  ์กฐ๊ฑด๋ฌธ์ด ๋งŽ์•„์ง„๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ๋กœ์ง์ด ์ง€๋‚˜์น˜๊ฒŒ ๋งŽ์•„์ง„๋‹ค.

  • ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ๋น„์Šทํ•œ UI๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ์–ด๋””์žˆ๋Š”์ง€ ์ž˜ ์•Œ์ง€ ๋ชปํ•œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ์˜ ๋‹จ์œ„๊ฐ€ ๋…๋ฆฝ์ ์ด์ง€ ๋ชปํ•˜๋‹ค.


๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•ด๋ณด์ž.

๐Ÿค• ์•„์‰ฌ์›€๋งŒ ์Œ“์ด๊ฒŒ ๊ทธ๋ƒฅ ๋‘˜๊ฑด๊ฐ€.

๋”์ด์ƒ์€ ์•„์‰ฝ๊ธฐ๋งŒ ํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ์ƒ๊ฐ์— ์œ„์˜ ์•„์‰ฌ์›€๋“ค์„ ํ•ด์†Œ์‹œํ‚จ ์ปดํฌ๋„ŒํŠธ ์ž‘์„ฑ์„ ์œ„ํ•ด ๊ณต๋ถ€ํ•  ๊ฒƒ๋“ค์„ ์ถ”๋ ค๋ดค๋‹ค.

  • Data Binding

  • Design Pattern

    • Data ๊ด€์ ์—์„œ์˜ Design Pattern

      • MVC

      • MVVM

      • MVP

      • Flux

    • UI ๊ด€์ ์—์„œ์˜ Design Pattern

      • Presentation Component & Container Component

      • Custom Hooks

      • Atomic design

      • Compound Component Pattern

  • Story Book

Data Binding

Data Binding ์ด๋ž€ ํ™”๋ฉด์ƒ์— ๋ณด์—ฌ์ง€๋Š” ๋ฐ์ดํ„ฐ(View) ์™€ Browser Memory์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ(Model)์„ ๋ฌถ์–ด์„œ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. HTML ์—์„œ server ๋˜๋Š” script ์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํ™”๋ฉด์— ๊ทธ๋ ค์ค€๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ, ์ด ๊ฐ’์ด ๋ณ€๊ฒฝ ๋œ ๊ฒฝ์šฐ ๋‹ค์‹œ HTML ์— ๋ณ€๊ฒฝ๋œ ๊ฐ’์„ ๋งž์ถ”์–ด ๊ทธ๋ ค์ฃผ๋Š” ๋™์ž‘์„ Data Binding ์ด๋ผ ํ•œ๋‹ค.

์–‘๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ

Component ์—์„œ ๋‹จ๋ฐฉํ–ฅ Data Binding ์€ Model(JavaScript) ๊ณผ View(HTML) ์‚ฌ์ด์— ViewModel ์ด ์กด์žฌํ•ด์„œ ํ•˜๋‚˜๋กœ ๋ฌถ์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ชจ๋‘ ํ•จ๊ป˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚œ๋‹ค.

Component ์‚ฌ์ด์—์„œ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ Props ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ž์‹์—์„œ ๋ถ€๋ชจ๋กœ๋Š” Emit Event ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

์–‘๋ฐฉํ–ฅ Data Binding ์€ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์„ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ฐ์ง€ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‹œ์ ์— DOM ๊ฐ์ฒด์— ๋ Œ๋”๋ง์„ ํ•ด์ฃผ๊ฑฐ๋‚˜, ํŽ˜์ด์ง€ ๋‚ด์—์„œ Model ์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•ด JavaScript ์‹คํ–‰๋ถ€์—์„œ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. ์ž…๋ ฅ ๊ฐ’์ด๋‚˜ ๋ณ€๊ฒฝ ๊ฐ’์— ๋”ฐ๋ผ ๋‚ด์šฉ์ด ๋ฐ”๋กœ ๋ฐ”๋€Œ๋ฏ€๋กœ ๋”ฐ๋กœ ์ฒดํฌ๋ฅผ ํ•ด์ค„ ํ•„์š”๋Š” ์—†๋‹ค.

์ด ๋ฐ”์ธ๋”ฉ ๋ฐฉ์‹์€, ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์—ฌ์ฃผ๊ณ  ์œ ์ง€๋ณด์ˆ˜๋‚˜ ์ฝ”๋“œ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜๋ก ๊ทธ ์žฅ์ ์ด ์ปค์ง„๋‹ค. ๋‹ค๋งŒ ๋ณ€ํ™”์— ๋”ฐ๋ผ DOM ๊ฐ์ฒด ์ „์ฒด๋ฅผ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊ฟ”์ฃผ๊ธฐ์— ๊ทธ ์„ฑ๋Šฅ์ด ๊ฐ์†Œ๋˜๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ

Component ์—์„œ ๋‹จ๋ฐฉํ–ฅ Data Binding ์€ Model(JavaScript) ์—์„œ View(HTML) ๋ฅผ ํ–ฅํ•ด์„œ๋งŒ data ๋™๊ธฐํ™”๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— View ์—์„œ Model ๋กœ์˜ ์ง์ ‘์ ์ธ data ๋ณ€๊ฒฝ์€ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

Component ์‚ฌ์ด์—์„œ๋„ Data Binding ์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋‹จ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋ค„์ง„๋‹ค.

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

Data Binding์—์„œ์˜ ๋ณ€ํ™” ๊ฐ์ง€

  • DOM event (Mouse Click, Keyboard Press, Mouse Move โ€ฆ etc)

  • Timer ํ•จ์ˆ˜ (setTimeout, setInterval)

  • ๋น„๋™๊ธฐ ํ†ต์‹ , Promise


๐Ÿ—„ Data ๊ด€์ ์—์„œ์˜ Design Pattern

1๏ธโƒฃ MVC , ModelViewController

  • Model : data ์˜ ๋ชจ์ž„ (state or store)

  • View : JSX

  • Controller : ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ ๋กœ์ง

View ๋Š” State ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ™”๋ฉด์— ๊ทธ์ณ์ง€๊ณ , ์œ ์ €๋Š” View ๋ฅผ ๋ฐ”๋ผ๋ณด๋ฉฐ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•œ๋‹ค. ๋งŒ์•ฝ JSX ์— ์ด๋ฒคํŠธ๊ฐ€ binding ๋˜์–ด์žˆ๋‹ค๋ฉด Controller ์‹คํ–‰์ด ๋˜๊ณ , state ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉฐ JSX์˜ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚œ๋‹ค. ์ฆ‰, Contoller ๋Š” Model ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ / ์กฐํšŒ / ์ˆ˜์ • / ์‚ญ์ œ (CRUD) ํ•˜๊ณ  ํ•ด๋‹นํ•˜๋Š” Model์˜ ๋ฐ์ดํ„ฐ๋Š” View ์—๋ฐ˜์˜๋˜์–ด ๋‚˜ํƒ€๋‚œ๋‹ค.

MVC ํŒจํ„ด์€ ์ฃผ๋กœ Server-Side์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • Spring Framework

  • Python Django

  • PHP Laravel

  • .NEW Framework

  • Ruby On Rails

React ๊ณต์‹ ๋ฌธ์„œ์™€ ๋ฒจ๋กœํผํŠธ๋‹˜์˜ ๊ธ€์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์™€์žˆ๋‹ค. ์•„๋ž˜๋ฅผ ๋ณด๋ฉด ๋Š๋‚Œ์ด ์˜ค๋“ฏ React ๋ณด๋‹ค๋Š” SSR(Server Side Rendering) ๋ฐฉ์‹์˜ ์›น์— ๋” ์ ํ•ฉํ•œ๋“ฏ ํ•˜๋‹ค.

๋ฆฌ์•กํŠธ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ๊ฐ€ MVC, MVW ๋“ฑ์ธ ํ”„๋ ˆ์ธ์›Œํฌ์™€ ๋‹ฌ๋ฆฌ, ์˜ค์ง V(View) ๋งŒ ์‹ ๊ฒฝ์“ฐ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

2๏ธโƒฃ MVVM , ModelViewViewModel

  • Model, View : MVC ์—์„œ ๋™์ผ

  • ViewModel : Controller ์—์„œ ์กฐ๊ธˆ ๋” UI ์ธก๋ฉด์œผ๋กœ ๋ฐœ์ „ํ•œ ๊ฒƒ์œผ๋กœ, Model ์— ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ  ๊ฐ€๊ณต

MVVM ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง๊ณผ, ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ๋กœ์ง์„ UI ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋กœ์ง๊ณผ UI ๋กœ์ง์„ ๊น”๋”ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ–ˆ์„ ๋•Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ…Œ์ŠคํŠธํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๋„ ํฌ๊ฒŒ ๊ฐœ์„ ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž์™€ UI ๋””์ž์ด๋„ˆ๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ ๋ถ€๋ถ„์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ๋Š” ๋””์ž์ธ ํŒจํ„ด์ด ๋œ๋‹ค.

3๏ธโƒฃ MVP , ModelViewPresenter

React์˜ Classํ˜• ์ปดํฌ๋„ŒํŠธ์— ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํŒจํ„ด์ธ ๊ฒƒ ๊ฐ™๋‹ค.

  • ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

    • Model : data ์˜ ๋ชจ์ž„ (server๋ฅผ ๋‹ด๋‹น)

    • Selection : Model ๋ฐ์ดํ„ฐ์˜ ์—ฌ๋Ÿฌ ํ•˜์œ„ ์„ธํŠธ๋ฅผ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ถ”์ƒํ™”๋ฅผ ํ•จ

    • Command : Model ์˜ Selection ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ถ”์ƒํ™”๋ฅผ ํ•จ

  • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค

    • View : ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œ

    • Interactor : ์ด๋ฒคํŠธ์— ๋”ฐ๋ฅธ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์š”์ฒญํ•จ

    • Presenter : Interactor ์— ๋”ฐ๋ฅธ ์ ์ ˆํ•œ Command ๋ฅผ ๋งคํ•‘

Flux

๋Œ€ํ˜• MVC ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์˜์กด์„ฑ๊ณผ ์—ฐ์‡„์ ์ธ ๊ฐฑ์‹ ์—์„œ ๋ฐœ์ƒ๋˜๋Š” ์˜ˆ์ธกํ•˜๊ธฐ ํž˜๋“  ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด ์ œ์ž‘๋œ ํŒจํ„ด์ด๋‹ค. ๊ธฐ์กด์˜ MVC ํŒจํ„ด์€ Model ์˜ ๋ฐ์ดํ„ฐ๋ฅผ View ์— ๋ฐ˜์˜ํ•˜๊ณ , View์˜ ์ž…๋ ฅ๊ณผ ๋ณ€ํ™”๊ฐ€ Model ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด์—ˆ์ง€๋งŒ Flux ํŒจํ„ด์€ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๊ฐ€์ง„๋‹ค. Flux ํŒจํ„ด์—์„œ๋Š” Store ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ View ๋ฅผ ๊ฐฑ์‹ ํ•œ๋‹ค.

  • Action : ๋ฐ์ดํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด ์ชฝ์ง€์™€ ๊ฐ™์€ ์—ญํ• 

  • Dispatcher : Store ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ์—ญํ• 

  • Store : ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๊ณ  Views๊ฐ€ ๋ณ€๊ฒฝ ๊ฐ์‹œ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณต


๐Ÿ–ผ๏ธ UI ๊ด€์ ์—์„œ์˜ Design Pattern

1๏ธโƒฃ Presentation Component - Container Component

๋ฆฌ์•กํŠธ์™€ ๋ฆฌ๋•์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. Dumb ์ปดํฌ๋„ŒํŠธ์™€ Smart ์ปดํฌ๋„ŒํŠธ๋กœ๋„ ์•Œ๋ ค์ ธ์žˆ๋‹ค.

  • Container Component

    • Presentation Component ๋“ค๊ณผ Container Component ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋‹ด๋‹นํ•œ๋‹ค.

    • ์ฃผ๋กœ ๋‚ด๋ถ€์— DOM element ๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

      • ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ๊ฐ์‹ธ๋Š” ์šฉ๋„์ผ ๋•Œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.
    • ์Šคํƒ€์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

    • ์ƒํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ๋ฆฌ๋•์Šค์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.

  • Presentation Component

    • ์˜ค์ง ๋ทฐ๋งŒ์„ ๋‹ด๋‹นํ•˜๋Š”, ์Šคํƒ€์ผ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

    • ์ƒํƒœ๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ€์ง€๊ณ  ์žˆ๋‹คํ•˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ์™€ ๊ด€๋ จํ•œ ๊ฒƒ์ด ์•„๋‹Œ UI ์— ๊ด€๋ จ๋œ ๊ฒƒ์ด์–ด์•ผ ํ•œ๋‹ค.

src
  |- components
  |- containers

์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ํด๋” ๊ตฌ์กฐ๋Š” ์ฃผ๋กœ ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋œ๋‹ค. UI ์™€ Data ๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์ ํŠธ ์ดํ•ด๊ฐ€ ์‰ฌ์šฐ๋ฉฐ ์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๋„ ๋†’์•„์ง„๋‹ค. ํ•˜์ง€๋งŒ, ์ง€๊ธˆ์€ ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํŒจํ„ด์ด๋‹ค. (Custom Hooks๊ฐ€ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ!)

2๏ธโƒฃ Custom hooks

๊ธฐ์กด Presentation Component - Container Component์˜ Container์˜ ๋กœ์ง๋งŒ hooks๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฉ”์ธ ๋กœ์ง์ด Container Component๊ฐ€ ์•„๋‹Œ, Custom Hooks ๋กœ ์ „๋‹ฌ๋˜๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ Hook์— ์ ‘๊ทผํ•ด์„œ ๋ฉ”์ธ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

์ด ํŒจํ„ด์˜ ์žฅ์ ์€ Hook์€ UI์™€ ๋กœ์ง์œผ๋กœ ๊ตฌ๋ถ„๋˜๊ธฐ ๋•Œ๋ฌธ์— UI, ๋กœ์ง ๋ชจ๋‘ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ ์šฉํ•˜๋‹ค๋Š” ์ ์ด๋‹ค. ๋˜ํ•œ, ์—ฌ๋Ÿฌ ๋‚ด๋ถ€ ๋กœ์ง (state, handlers) ๋ฅผ ํฌํ•จํ•ด Component์˜ ์ œ์–ด๊ฐ€ ์‰ฌ์šฐ๋ฉฐ, ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋งŽ์€ ํ†ต์ œ๊ถŒ์„ ์ค€๋‹ค. ํด๋”๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

src
  |- components
  |- hooks

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

3๏ธโƒฃ Atomic Pattern

๊ธฐ์กด์˜ Component ์กฐ๊ฐ์„ ๋ฅผ ์กฐ๊ธˆ ๋” ์„ธ๋ถ€์ ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ํ™”ํ•™์„ ๋– ์˜ฌ๋ฆฌ๋ฉด ๋” ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋‹ค. Atomic ํŒจํ„ด์€ UI์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์••๋„์ ์œผ๋กœ ๋›ฐ์–ด๋‚˜ ํ˜‘์—… ํ”„๋กœ์ ํŠธ์—์„œ ๋น ๋ฅด๊ฒŒ UI๋ฅผ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • Atoms : ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์˜ ์ปดํฌ๋„ŒํŠธ (button, p, input, โ€ฆ etc)

  • Molecule : Atom์„ ์—ฌ๋Ÿฌ ๊ฐœ ์กฐํ•ฉํ•œ ์ปดํฌ๋„ŒํŠธ

  • Oraganisms : Molecule๊ณผ Atom๋“ค์„ ์กฐํ•ฉํ•˜์—ฌ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ

  • Templates : Molecule๊ณผ Atom๋“ค์„ ์กฐํ•ฉํ•ด ๋„ฃ์„ ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ

  • Pages : Templates์— Oraganisms, Molecule, Atom๋“ค์„ ์กฐํ•ฉํ•œ ์ปดํฌ๋„ŒํŠธ

๊ทธ๋Ÿฌ๋‚˜ ์ด ํŒจํ„ด๋„ ๊ฒฐ๊ตญ์€ ๋‹จ์ ์€ ์žˆ๋‹ค. ์ดˆ๊ธฐ์— Atoms ๋‹จ์œ„์˜ ์ปดํฌ๋„ŒํŠธ๋ถ€ํ„ฐ ์ž‘์„ฑํ•ด๋‚˜๊ฐ€๋Š” ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ์˜ ์ดˆ๊ธฐ ์…‹ํŒ… ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋œ๋‹ค.

๋˜ํ•œ, page ๋‹จ์œ„์—์„œ state์„ props๋กœ ๋‚ด๋ ค์ค˜์•ผ ๋˜๊ธฐ ๋•Œ๋ฌธ์— props drilling ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋””์ž์ธ์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์ด๊ฑฐ๋‚˜ ์ •ํ•ด์ง„ ํŒจํ„ด์ด ์—†๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด ์กฐ๊ฑด์ด ๋„ˆ๋ฌด ๋งŽ์•„์ ธ์„œ ์˜คํžˆ๋ ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฌด๊ฑฐ์›Œ์ง€๊ณ  ๋น„ํšจ์œจ์ ์ด๊ฒŒ ๋  ์ˆ˜ ์žˆ๋‹ค.


๊ณต๋ถ€๋ฅผ ํ•ด๋„ ๋งŒ์กฑ์Šค๋Ÿฝ์ง€๊ฐ€ ์•Š๋‹ค.

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

ํšŒ์‚ฌ๋Š” ์•„์ง ์•ˆ์ •๋œ ๋‹จ๊ณ„๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹คํ—˜์ ์ธ ๋””์ž์ธ์„ ๋งŽ์ด ์‹œ๋„์ค‘์ด์‹œ๊ธฐ๋„ ํ•˜๊ณ , ์•„์ง ๋””์ž์ธ์‹œ์Šคํ…œ๋„ ๊ฐ–์ถฐ์ง€์ง€ ์•Š์•˜๋‹ค. ์˜คํžˆ๋ ค ์ง€๊ธˆ ์ด๋ ‡๊ฒŒ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ด ์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜์— ์žˆ์–ด์„œ ๋…์ด๋  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ๋ถˆ๊ธธํ•œ ๋Š๋‚Œ๋„ ๋“ค๊ณ ..?

ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ด์ƒ์ ์ธ ํŒจํ„ด์„ ์ฐพ์•„๊ฐ€๊ณ  ์‹ถ๋‹ค. ๋” ๋‚˜์€ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๊ณ  ์‹ถ๊ณ  ์ „๋ฐ˜์ ์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•œ ๊ฒƒ์„ ์•Œ๊ธฐ ๋•Œ๋ฌธ์—!

๐Ÿฑ Compound Component Pattern

ํšŒ์‚ฌ์—์„œ ๋ช‡ ๋‹ฌ ์ „, SUPER SEXY ํ•œ Componet ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ, ํŒ์—… ๋ชจ๋‹ฌ์— ๋Œ€ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•œ ์ ์ด ์žˆ๋‹ค. ์ž‘์„ฑ์„ ํ•˜๋ฉด์„œ ํž˜๋“ค์—ˆ๋˜ ์ ์€ ์™„์ „ํžˆ ํ†ต์ผ๋œ ๋””์ž์ธ์€ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ์•ฝ๊ฐ„ ๋‹ค๋ฅธ Oraganisms ๋“ค์ด ์กด์žฌํ•  ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋˜ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๊ฐ€ ์•„๋ฌด๋ฆฌ โ€œ์ž˜โ€ ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ๋ชจ๋“  ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ์žก๋Š” ๊ฒƒ์€ ์–ด๋ ค์› ๋‹ค.

์ด๋Ÿฐ ์ž”์ž”๋ฐ”๋ฆฌ ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ๋ชจ๋‘ ์žก์œผ๋ ค๋ฉด ๊ฒฐ๊ตญ์€ props ๋Š” ๋น„๋Œ€ํ•ด์งˆ ๊ฒƒ์ด๊ณ , JSX ๋‚ด์—์„œ ์ˆ˜๋งŽ์€ ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋“ค์ด ์™€๊ธ€์™€๊ธ€ ๊ฑฐ๋ฆฌ๊ฒŒ ๋  ๊ฒƒ์ด๋‹คโ€ฆ (๋”์ฐ) ์ด๋Ÿฐ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์„๊นŒ ๊ณ ๋ฏผ์„ ํ–ˆ๊ณ  Compound Component ํŒจํ„ด์„ ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด ํ•ด๊ฒฐํ•ด๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•ด๋ดค๋‹ค. (ํ•ด๊ฒฐ์ด ์•ˆ๋˜๋Š” ์ผ€์ด์Šค๋ผ๋ฉด ๊ตณ์ด ์žฌ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กญ๊ฒŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ด ์•„๋‹๊นŒ?)

*์‚ฌ์ง„์ถœ์ฒ˜ : https://patterns-dev-kr.github.io/

์„œ๋ก ์ด ๊ธธ์—ˆ๊ณ .. ์จ‹๋“  ์ปดํŒŒ์šด๋“œ ์ปดํฌ๋„ŒํŠธ ํŒจํ„ด์ด๋ž€ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์•”์‹œ์  ์ƒํƒœ ๊ณต์œ  ์ปดํฌ๋„ŒํŠธ API ์ง‘ํ•ฉ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฉฐ, ์œ ์—ฐํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค. ์ด ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด props drilling ์—†์ด ์„ ์–ธ์ ์ด๊ณ  ํ‘œํ˜„์ ์ธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ 

Comound Component ํŒจํ„ด์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ โ€œAPI์˜ ๋ณต์žก์„ฑ ๊ฐ์†Œโ€์ด๋‹ค. ํ•˜๋‚˜์˜ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— props ๋ฅผ ์ด์šฉํ•ด ํ•˜์œ„๋กœ ๋‚ด๋ ค๋ณด๋‚ด๋Š” ๋Œ€์‹ , ๊ฐ๊ฐ์˜ props๋Š” ๊ฐ€์žฅ ์ ํ•ฉํ•œ SubComponent ์— ์—ฐ๊ฒฐ๋˜๋„๋ก ๊ตฌ์„ฑ๋œ๋‹ค.

๋˜ํ•œ UI ๊ฐ€ ์œ ์—ฐ์„ฑ์ด ๋›ฐ์–ด๋‚˜๋ฏ€๋กœ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ๋‹ค์–‘ํ•œ ์ผ€์ด์Šค ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์‚ฌ์šฉ์ž๋Š” SubComponent ์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์ด ์ค‘์—์„œ ์–ด๋–ค ๊ฒƒ์„ ํ‘œ์‹œํ•  ์ง€๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

โ€œ๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌโ€์ ์ธ ๋ถ€๋ถ„๋„ ์ด ํŒจํ„ด์˜ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋กœ์ง์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ํฌํ•จ๋˜๋ฉฐ, React.Context ๋Š” ๋ชจ๋“  ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ states ์™€ handlers ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ์ด ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ฑ…์ž„์†Œ์žฌ๊ฐ€ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๊ฐ€ ๋œ๋‹ค.

๋‹จ์ 

UI ๊ฐ€ ์œ ์—ฐํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ๋Š” ๋งˆ์Œ์— ๋งŒ๋“ค์—ˆ์ง€๋งŒ, ์œ ์—ฐ์„ฑ์ด ๋„ˆ๋ฌด ๋†’์•„์ง€๋Š” ์ผ€์ด์Šค๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ ์ด ๋ฐœ์ƒํ–ˆ๊ณ  ์ด๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์ž‘์„ ์œ ๋ฐœ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋˜ํ•œ ์ด ํŒจํ„ด์„ ์ ์šฉํ–ˆ์„ ๋•Œ JSX ํ–‰ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜์—ฌ ๋„ˆ๋ฌด ๋ฌด๊ฑฐ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.

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

ETC

์ด์™ธ์—๋„ ์ •๋ง ๋‹ค์–‘ํ•œ ํŒจํ„ด๋“ค์ด ์žˆ๋‹ค. ๊ตฌ๊ธ€๋ง ๋„์ค‘์— ์ •๋ง ์ข‹์€ ์‚ฌ์ดํŠธ๋ฅผ ์ฐพ์•˜๋Š”๋ฐ, ๋””์ž์ธ ํŒจํ„ด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ Œ๋”๋ง ํŒจํ„ด ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฒƒ๋“ค์— ๋Œ€ํ•œ ์ตœ์‹  ์ •๋ณด๊ฐ€ ์˜ฌ๋ผ์˜ค๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋‹ˆ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.


๐Ÿ““ StoryBook

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

์ด์ „์— ๊ฐ„๋‹จํ•˜๊ฒŒ ํ”„๋กœ์ ํŠธ๋กœ ์‚ฌ์šฉํ•˜๊ธด ํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๋ฏธ ๋ผ์ด๋ธŒ ํ…œํ”Œ๋ฆฟ์ด ์„ค์ •๋œ ์ฑ„๋กœ ์‚ฌ์šฉํ–ˆ๋˜ ํ„ฐ๋ผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์„ค์ •ํ•˜๊ณ  ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์€ ์ž˜ ๋ชฐ๋ž๊ธฐ์—.. ์ด๋ฒˆ ๊ธฐํšŒ์— ๊ณต์‹๋ฌธ์„œ๋ฅผ ๋ณด๋ฉด์„œ ๊ณต๋ถ€ํ•ด๋ดค๋‹ค.

๐Ÿ’ก StoryBook ?

StoryBook ์€ ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ View ๋ฅผ ์œ„ํ•œ ๋…๋ฆฝ์ ์ธ UI ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด๋‹ค. ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ Story ์—์„œ ์กฐํ•ฉํ•ด ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ, ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๋ฌธ์„œํ™”๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ“ฆ Story ์˜ ์ฃผ์š” format

  • title : ์Šคํ† ๋ฆฌ๋ถ ํด๋” ๊ณ„์ธต ๊ตฌ์กฐ

  • component : (optional) ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ปดํฌ๋„ŒํŠธ

  • args : story ์˜ props

  • decorators : story ๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ์ถ”๊ฐ€ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ

  • parameters : story ์— ๋Œ€ํ•œ ์ •์  ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ •


๐Ÿ– Story ๋งŒ๋“ค๊ธฐ

Story ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์€ ์‰ฝ๋‹ค. ์•„๋ž˜ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋งŒ ๊ณต์‹๋ฌธ์„œ๊ฐ€ ์•Œ๋ ค์ฃผ๋Š”๋Œ€๋กœ ์ž˜ ๋”ฐ๋ผ๊ฐ€๋ฉด ํฌ๊ฒŒ ์–ด๋ ต์ง€ ์•Š๋‹ค. ๊ธฐ๋ณธ์ ์ธ ์ˆœ์„œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  1. Story ๋ฅผ ๋งŒ๋“ค ํด๋”์™€ Component์— ๋Œ€ํ•œ ์ •์˜

  2. Component ๊ฐ€ ๊ฐ€์ง€๋Š” args (props) ์— ๋Œ€ํ•œ ์ •์˜ ์ •๋ฆฌ

  3. Default Story ์ž‘์„ฑ & ๊ฐ ์ผ€์ด์Šค์— ๋”ฐ๋ฅธ Story ์ž‘์„ฑ

  4. Component test

1. Story ๋ฅผ ๋งŒ๋“ค ํด๋”์™€ Component์— ๋Œ€ํ•œ ์ •์˜

// Button.stories.tsx
const meta: Meta<typeof PrimitiveButton> = {
  title: "Material/Button", 
  component: PrimitiveButton,
};

export default meta;

์œ„์™€ ๊ฐ™์ด, Meta ํƒ€์ž…์œผ๋กœ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž‘์„ฑํ•˜๊ณ  default export ๋ฅผ ํ•˜๋ฉด, ์Šคํ† ๋ฆฌ๋ถ์—์„œ ํ•ด๋‹น ์ •๋ณด๋ฅผ ํŒŒ์‹ฑํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์•„๋ž˜ ์‚ฌ์ง„์„ ๋ณด๋ฉด title ์—์„œ ์ •์˜ํ•œ ํด๋”์™€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Component ๊ฐ€ ๊ฐ€์ง€๋Š” args (props) ์— ๋Œ€ํ•œ ์ •์˜ ์ •๋ฆฌ

๋งŒ๋“ค๊ณ ์žํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ props ๋ฅผ ์ •์˜ํ•  ์‹œ๊ฐ„์ด๋‹ค. args ์—๋Š” default Button Story ๊ฐ€ ๋ณด์—ฌ์ค„ ๊ฐ’๋“ค์„ ๋„ฃ๊ณ , argTypes ์—๋Š” ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์งˆ props ์™€ ๊ทธ์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‚˜ ์ปจํŠธ๋กค ๋ฐฉ๋ฒ• ๋“ฑ์— ๋Œ€ํ•ด ์ •์˜ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

type Story = StoryObj<typeof PrimitiveButton>;
export const DefaultStory: Story = {
  args: {
    theme: "primary",
  },
  argTypes: {
    theme: {
      description: "๋ฒ„ํŠผ ํƒ€์ž…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.",
    },
  },
};

์œ„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์„œ Story ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์Šคํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ, argsTypes ์— ๋Œ€ํ•ด์„œ๋„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. description ์„ ์ž˜ ์ž‘์„ฑํ•˜๋ฉด ํ•œ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด์„œ ๋ฌธ์„œํ™”๋„ ์‰ฝ๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

3. Default Story ์ž‘์„ฑ & ๊ฐ ์ผ€์ด์Šค์— ๋”ฐ๋ฅธ Story ์ž‘์„ฑ

์ด์ œ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์…‹ํŒ…์€ ๋งˆ์ณค์œผ๋‹ˆ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ๋จผ์ € ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ๋ณธ args ๋ฅผ ๊ฐ€์ง€๋Š” default Template ๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.

/* Story Default Format */
const Template: StoryFn<ButtonProps> = (args) => <PrimitiveButton {...args} />;

๊ทธ๋ฆฌ๊ณ  ์ถ”๊ฐ€์ ์ธ ์ผ€์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ์„ ๋ฐ”์ธ๋”ฉํ•ด์„œ ์ƒˆ๋กœ์šด ์Šคํ† ๋ฆฌ๋“ค์„ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹ค. ๋‚˜๋Š” ๋ฒ„ํŠผ ์ผ€์ด์Šค๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์ƒ์„ฑํ–ˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, Primary, Link, Ghost ๋“ฑ์— ๋Œ€ํ•œ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ดค๋‹ค.

/* New Types of Story - controlled by bind */
export const Primary = Template.bind({});
Primary.args = {
  theme: "primary",
  color: "black",
    ...
};

export const Link = Template.bind({});
Link.args = {
  theme: "link",
  color: "black",
    ...
};

์œ„์™€ ๊ฐ™์ด ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด, ์‚ฌ์ด๋“œ๋ฐ”์—๋Š” ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ์Šคํ† ๋ฆฌ๋“ค์ด ์ถ”๊ฐ€๋˜๋ฉฐ ์šฐ์ธก ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ์Šคํ† ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฌผ๋“ค๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์Šคํ† ๋ฆฌ๋ฅผ ํด๋ฆญํ•ด์„œ ๋“ค์–ด๊ฐ€๋ฉด ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

4. Component test

Component ์™€ Story ๋ฅผ ๋ชจ๋‘ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. UI ์ ์ธ ๋ถ€๋ถ„์ด๋‚˜ ๋™์ž‘์ ์ธ ๋ถ€๋ถ„ ๋ชจ๋‘์— ๋Œ€ํ•ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•œ๋ฐ, props ์— ๋”ฐ๋ฅธ UI ๋ณ€ํ™”๋Š” Controls ํƒญ์—์„œ ์กฐ๊ฑด์„ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๋ก  ์œ„์—์„œ ํ–ˆ๋“ฏ์ด ๊ฐ๊ฐ์˜ ์ผ€์ด์Šค์— ๋”ฐ๋ฅธ ์Šคํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ค˜๋„ ๊ดœ์ฐฎ๋‹ค.

์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘์ ์ธ ๋ถ€๋ถ„์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋Š” Actions ํƒญ์— ๋“ค์–ด๊ฐ€๋ฉด ํด๋ฆญ์ด๋ฒคํŠธ๋‚˜ mouseover ๋˜๋Š” ํ‚ค๋ณด๋“œ ์ด๋ฒคํŠธ ๊นŒ์ง€ ๋‹ค์–‘ํ•˜๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐ŸŒพ StoryBook ์ฐ๋จน ์†Œ๊ฐ

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

Story ์—์„œ ์ž‘์„ฑํ•œ args ์— ๋”ฐ๋ผ DOCS ๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋˜๋ฉฐ, ๊ฐ๊ฐ์˜ ์ผ€์ด์Šค์— ๋”ฐ๋ฅธ ํ…Œ์ŠคํŠธ๋„ ์ฆ‰๊ฐ์ ์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๋‹ˆ... ์ง„์งœ ๋„ˆ๋ฌด ์•„๋ฆ„๋‹ต๋‹คโ€ฆใ…Ž๊ธ“๊ทนโ€ฆ ์ค‘๋ณต์œผ๋กœ ๋งŒ๋“ค์–ด๋‚ด๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๋งŽ์•„์„œ ๋…ธ์…˜์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋‚˜ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๊ทธ๋Ÿด ํ•„์š” ์—†์ฅ..! ๊ทธ๋ฆฌ๊ณ  args ๋“ค์ด ํ•œ ๋ˆˆ์— ๋ณด์—ฌ์„œ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋น„๋Œ€ํ•ด์ง€๋Š” props ์˜ ์ƒ์„ฑ์„ ๊ฒฝ๊ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ๋  ๊ฒƒ ๊ฐ™๋‹ค. ์ •๋ง ํ•„์š”ํ•œ ๊ฒƒ๋“ค์— ๋Œ€ํ•ด์„œ๋งŒ ์—ฐ๊ตฌํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋ด์•ผ์ง€.


์—ฐ์Šตํ–ˆ๋˜ Source Code


๐Ÿ’ก ๋งˆ๋ฌด๋ฆฌ

๋Œ€์ถฉ ์•Œ๊ณ  ์žˆ๋˜ ๊ฐœ๋…๋“ค์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ฉด์„œ, ์•ž์œผ๋กœ ์–ด๋–ค ๊ฒƒ๋“ค์„ ์‹คํ—˜ํ•ด๋ณด๊ณ  ๋„์ž…ํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•œ ์กฐ๊ธˆ์˜ ๊ฐ€์ด๋“œ๋ฅผ ์–ป์€ ๊ฒƒ ๊ฐ™๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” Compound Component ํŒจํ„ด์„ ์ ์šฉํ•ด๋ณด๊ณ  ์‹ถ๊ธดํ•œ๋ฐ, ํšŒ์‚ฌ ๋™๋ฃŒ๋“ค๊ณผ์˜ ์ด์•ผ๊ธฐ๋„ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๊ณ  ์ „๋ฐ˜์ ์œผ๋กœ ๋นก๋นกํ•ด์งˆ ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œโ€ฆ ๋‹น์žฅ์˜ ๋„์ž…์€ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ๋„ ๋“ ๋‹ค. ๋‚˜์ค‘์— ํšŒ์‚ฌ์—์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ ๋“ค์–ด๊ฐˆ ๋•Œ ํ•ด๋ณด์ž๊ณ  ์ด์•ผ๊ธฐํ•ด๋ด์•ผํ•˜๋‚˜ ์‹ถ๊ธฐ๋„ ํ•˜๊ณ โ€ฆ!

๋””์ž์ธ ์‹œ์Šคํ…œ ๋„์ž…๊ฐ„์— ๊ณต๋ถ€ํ•  ๊ฒƒ๋“ค์ด ๋” ๋งŽ์€ ๊ฒƒ ๊ฐ™์€๋ฐ, ์šฐ์„  ๋งŽ์ด ์“ฐ์ด๊ณ  ์žˆ๋Š” antd ๋‚˜ radix, ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ๋“ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ตฌํ˜„ํ•œ ๊นƒํ—™๋“ค ๋ณด๋ฉด์„œ ์ฃผ๋กœ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” props ๋“ค์ด๋‚˜ ๊ตฌํ˜„ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋„ ์—ฐ๊ตฌ๋ฅผ ์ข€ ํ•ด๋ด์•ผ๊ฒ ๋‹ค. ์œผ์œผ์œผ ๋ฐ”์œ 4์›”์ด ๋˜๊ฒ ๊ตฌ๋‚˜

๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋ถ€๋”ชํžˆ๋Š” ๋ฌธ์ œ๋“ค์€ ๋งŽ๊ณ โ€ฆ ๊ทธ๋Ÿฐ๋ฐ ๋˜ ์ด๋ ‡๊ฒŒ ์†”๋ฃจ์…˜ ๋˜ํ•œ ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์–ด๋–ค ๊ฒƒ์ด ์ง€๊ธˆ ๋‚ด ์ƒํ™ฉ์— ์ ํ•ฉํ•œ์ง€์— ๋Œ€ํ•ด์„œ ์•Œ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‚ด๊ฐ€ ๋งŽ์ด ์•Œ์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ณต๋ถ€๋ฅผ ํ‰์ƒ ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด๊ฒ ์ฅ.. ํ‘ํ‘ ๋Š˜ ๋” ๋‚˜์€ ํŒ๋‹จ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์„๋Ÿฌ์ง€์ง€ ๋ง์•„์•ผ๊ฒ ๋‹ค. ํŒŒ์ดํŠ•!


๐Ÿ’พ ์ฐธ๊ณ 

ย