๐Ÿ“ฆ ์ปดํฌ๋„ŒํŠธ๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

ํ˜ธ์ด์ดˆ์ดยท2025๋…„ 4์›” 11์ผ

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

๐ŸŽฏ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™œ ๋‚˜๋ˆ„๋Š”๊ฐ€?

React, Vue, Svelte, Angular ๋“ฑ ์ฃผ์š” ํ”„๋ ˆ์ž„์›Œํฌ๋“ค์€ ๋ชจ๋‘ ๊ณตํ†ต์ ์œผ๋กœ "์ปดํฌ๋„ŒํŠธ๋Š” UI์˜ ๊ตฌ์„ฑ ๋‹จ์œ„"๋ผ๊ณ  ๋งํ•œ๋‹ค.

"reusable UI elements for your app" - React
"UI๋ฅผ ๋…๋ฆฝ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ผ๋ถ€๋ถ„์œผ๋กœ ๋ถ„ํ• " - Vue
"Components are the building blocks of applications" - Svelte
"์ปดํฌ๋„ŒํŠธ๋Š” Angular ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„" - Angular

๊ฒฐ๊ตญ ์ค‘์š”ํ•œ ๊ฑด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž˜ ๋‚˜๋ˆ„๋Š” ๊ธฐ์ค€์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ 3๊ฐ€์ง€๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก์„ ์ˆ˜ ์žˆ๋‹ค:

  • ๋ช…ํ™•ํ•œ ํ•˜๋‚˜์˜ ์—ญํ• ์„ ๊ฐ–๋Š”๋‹ค
  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค
  • ์กฐ๋ฆฝํ•˜์—ฌ ํ™•์žฅํ•˜๊ธฐ ์‰ฝ๋‹ค

๐Ÿงฑ ์ ์‹ฌ ๋ญ๋จน์ง€ ๋ฏธ์…˜์—์„œ์˜ ๊ณ ๋ฏผ

์ฒ˜์Œ์—” ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฒ„ํŠผ ๋‘ ๊ฐœ๋ฅผ ๊ฐ์‹ธ๋Š” ButtonWrapper๋ฅผ ๋งŒ๋“ค ๋•Œ์—๋„, ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ๋ฒ„ํŠผ์„ importํ• ์ง€, ์™ธ๋ถ€์—์„œ props๋กœ ๋ฒ„ํŠผ์„ ์ฃผ์ž…๋ฐ›์„์ง€ ๋“ฑ์˜ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋งŽ์€ ๊ณ ๋ฏผ์„ ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด์„œ IoC (์ œ์–ด์˜ ์—ญ์ „) ๊ฐœ๋…๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋Š” ์Šค์Šค๋กœ ๋‚ด๋ถ€๋ฅผ ํ†ต์ œํ•˜๊ณ , ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋Š” ์™ธ๋ถ€์—์„œ ๋™์ž‘์„ ๋„˜๊ฒจ๋ฐ›๋Š” ๊ฒŒ ๋” ์ ์ ˆํ•˜๋‹ค.

์˜ˆ์‹œ:
ButtonWrapper์ฒ˜๋Ÿผ ๊ฐ•ํ•œ ์ข…์†์„ฑ์ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€์—์„œ ์ง์ ‘ import
Form์ฒ˜๋Ÿผ ๋‹ค์–‘ํ•œ ์กฐํ•ฉ์ด ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ์™ธ๋ถ€์—์„œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ props๋กœ ์ „๋‹ฌ๋ฐ›์Œ
๊ฒฐ๋ก ์ ์œผ๋กœ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•  ํ•„์š”๋Š” ์—†๋‹ค.


๐Ÿ’ก ์ปดํฌ๋„ŒํŠธ ์ž˜ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•œ 3๊ฐ€์ง€ ํ•ต์‹ฌ ์ „๋žต

1. headleass UI๊ธฐ๋ฐ˜์˜ ์ถ”์ƒํ™”ํ•˜๊ธฐ
๋ณ€ํ•˜๋Š” ๊ฒƒ vs ์ƒ๋Œ€์ ์œผ๋กœ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ
2. ํ•œ๊ฐ€์ง€ ์—ญํ• ๋งŒ ํ•˜๊ธฐ
๋˜๋Š” ํ•œ๊ฐ€์ง€ ์—ญํ• ๋งŒ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์กฐํ•ฉ์œผ๋กœ ๊ตฌ์„ฑํ•˜๊ธฐ
3. ๋„๋ฉ”์ธ ๋ถ„๋ฆฌํ•˜๊ธฐ
๋„๋ฉ”์ธ์„ ํฌํ•จํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์™€ ๊ทธ๋ ‡์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌํ•˜๊ธฐ

1. Headless UI ๊ธฐ๋ฐ˜์˜ ์ถ”์ƒํ™”

๐ŸŽฏ ๊ฐœ๋… ์š”์•ฝ
๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ์™€ UI๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” ํŒจํ„ด์ด๋‹ค.

๋ฐ์ดํ„ฐ ์ถ”์ƒํ™”
ex) useCalendar ํ›…์ฒ˜๋Ÿผ ์ƒํƒœ/๋กœ์ง๋งŒ ๊ด€๋ฆฌํ•˜๊ณ , ์‹ค์ œ UI๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์ฑ…์ž„์ง€๋„๋ก ๋ถ„๋ฆฌํ•œ๋‹ค.

๋™์ž‘ ์ถ”์ƒํ™”(์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ)
์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ•  ๊ฒฝ์šฐ, ๋งค์šฐ ๋ณต์žกํ•จ.

์•„๋ž˜์ฒ˜๋Ÿผ ์ถ”์ƒํ™”ํ•ด์„œ ์ด์ œ button ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณด์—ฌ์ง€๋Š”๊ฑฐ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“Œ ํ•ต์‹ฌ ํฌ์ธํŠธ

  • ๋„๋ฉ”์ธ ๋กœ์ง์€ useCalendar ํ›…์— ์žˆ์Œ
  • UI๋Š” ์ƒํƒœ๋ฅผ ๋ชฐ๋ผ๋„ ๋˜๊ณ , ๋‹จ์ˆœํžˆ ํ™”๋ฉด๋งŒ ๊ตฌ์„ฑํ•จ (Headless)
  • ๋กœ์ง ๋ณ€๊ฒฝ์€ ํ›…์—์„œ, ๋””์ž์ธ ๋ณ€๊ฒฝ์€ UI์—์„œ โ†’ ์—ญํ•  ๋ถ„๋ฆฌ๋กœ ์œ ์ง€๋ณด์ˆ˜ ์‰ฌ์›€

hooks๋กœ ๋ชจ๋“ˆํ™”ํ•˜๊ธฐ โ†’ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•ด์ง€๋ ค๋ฉด ๊ฐ ๋ชจ๋“ˆ์ด ํ•œ๊ฐ€์ง€ ์ผ๋งŒ ํ•ด์•ผํ•œ๋‹ค.! (ํ•ต์‹ฌ)


2. ํ•œ ๊ฐ€์ง€ ์—ญํ• ๋งŒ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์กฐํ•ฉ

์•„๋ž˜ ์ด๋ฏธ์ง€๋Š” InputButton์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋งŒ ๋ด๋„ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜์ง€ ๋ชปํ•˜๋‹ค.!

์ด๋Ÿฐ ์‹์˜ ์„ค๊ณ„๋Š” UI๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ๋‹ฌ๋ผ์งˆ ๋•Œ ๋Œ€์‘์ด ์–ด๋ ต๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โœ… ๊ฐœ์„ ๋œ ๊ตฌ์กฐ

๋ณ€๊ฒฝ๋œ ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ

3. ๋„๋ฉ”์ธ๊ณผ UI ๋ถ„๋ฆฌ

๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๋„๋ฉ”์ธ์„ ์•Œ์•„์•ผ ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ, ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋„๋ฉ”์ธ์„ ์•Œ ํ•„์š”๋Š” ์—†๋‹ค.

๋„๋ฉ”์ธ ๊ฑท์–ด๋‚ด๊ธฐ

์ปดํฌ๋„ŒํŠธ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ํ‘œ์ค€์— ๊ฐ€๊นŒ์›Œ์งˆ์ˆ˜๋ก ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ์ด๋…€์„์€ ๋„๋ฉ”์ธ์„ ๋ชจ๋ฅด๊ฒŒ๋˜๋ฉด์„œ ์ผ๋ฐ˜์ ์ธ ์ด๋ฆ„์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๋‹ค.

frameworkSelect๋Š” ๋„๋ฉ”์ธ์„ ์•ˆ๋‹ค. container๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•œ๋‹ค. ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ• ๋•Œ, ์ž์œจ์ ์ธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋œ๋‹ค. ์™ธ๋ถ€์˜์กด์„ฑ์ด ์—†๋‹คx

๋น„์ฆˆ๋‹ˆ์Šค๋กœ์ง์€ ๋ณธ์ธ์ด ์ฒ˜๋ฆฌํ•˜๊ณ , ui๋กœ์ง์€ multiSelect ์ปดํฌ๋„ŒํŠธํ•œํ…Œ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. (multiSelect์ปดํฌ๋„ŒํŠธ๋Š” ๋„๋ฉ”์ธ์„ ๋ชจ๋ฅธ๋‹ค.)


๊ฒฐ๋ก 


์ž˜ ๋งŒ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” ์ผ์„ ๋ฐ˜๋ณตํ•˜๋Š” ์ž‘์—…์„ ์—†์• ์ค€๋‹ค. ๋˜ํ•œ ๋™๋ฃŒ์—๊ฒŒ๋„ ํฐ ๋„์›€์ด ๋œ๋‹ค.

profile
์˜ ์„ฑ์žฅ์ผ์ง€

0๊ฐœ์˜ ๋Œ“๊ธ€