์ฒ์์๋ ๋จ์ํ ์ปดํฌ๋ํธ๋ฅผ "์ฌ์ฌ์ฉ ๊ฐ๋ฅํ 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๋ก ์ ๋ฌ๋ฐ์
๊ฒฐ๋ก ์ ์ผ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋์ผํ๊ฒ ๋์ํ ํ์๋ ์๋ค.
1. headleass UI๊ธฐ๋ฐ์ ์ถ์ํํ๊ธฐ
๋ณํ๋ ๊ฒ vs ์๋์ ์ผ๋ก ๋ณํ์ง ์๋ ๊ฒ
2. ํ๊ฐ์ง ์ญํ ๋ง ํ๊ธฐ
๋๋ ํ๊ฐ์ง ์ญํ ๋ง ํ๋ ์ปดํฌ๋ํธ์ ์กฐํฉ์ผ๋ก ๊ตฌ์ฑํ๊ธฐ
3. ๋๋ฉ์ธ ๋ถ๋ฆฌํ๊ธฐ
๋๋ฉ์ธ์ ํฌํจํ๋ ์ปดํฌ๋ํธ์ ๊ทธ๋ ์ง ์์ ์ปดํฌ๋ํธ ๋ถ๋ฆฌํ๊ธฐ
๐ฏ ๊ฐ๋
์์ฝ
๋๋ฉ์ธ ๋ฐ์ดํฐ์ UI๋ฅผ ๋ถ๋ฆฌํ๋ ํจํด์ด๋ค.

๋ฐ์ดํฐ ์ถ์ํ
ex) useCalendar ํ
์ฒ๋ผ ์ํ/๋ก์ง๋ง ๊ด๋ฆฌํ๊ณ , ์ค์ UI๋ ์ปดํฌ๋ํธ์์ ์ฑ
์์ง๋๋ก ๋ถ๋ฆฌํ๋ค.

๋์ ์ถ์ํ(์ฌ์ฉ์์ ์ํธ์์ฉ)
์๋ ๊ทธ๋ฆผ์ฒ๋ผ ํ ๊ฒฝ์ฐ, ๋งค์ฐ ๋ณต์กํจ.

์๋์ฒ๋ผ ์ถ์ํํด์ ์ด์ button ์ปดํฌ๋ํธ๋ ๋ณด์ฌ์ง๋๊ฑฐ์๋ง ์ง์คํ ์ ์๋ค.

๐ ํต์ฌ ํฌ์ธํธ
- ๋๋ฉ์ธ ๋ก์ง์ useCalendar ํ ์ ์์
- UI๋ ์ํ๋ฅผ ๋ชฐ๋ผ๋ ๋๊ณ , ๋จ์ํ ํ๋ฉด๋ง ๊ตฌ์ฑํจ (Headless)
- ๋ก์ง ๋ณ๊ฒฝ์ ํ ์์, ๋์์ธ ๋ณ๊ฒฝ์ UI์์ โ ์ญํ ๋ถ๋ฆฌ๋ก ์ ์ง๋ณด์ ์ฌ์
hooks๋ก ๋ชจ๋ํํ๊ธฐ โ ๋ณ๊ฒฝ์ ์ ์ฐํด์ง๋ ค๋ฉด ๊ฐ ๋ชจ๋์ด ํ๊ฐ์ง ์ผ๋ง ํด์ผํ๋ค.! (ํต์ฌ)
์๋ ์ด๋ฏธ์ง๋ InputButton์ด๋ผ๋ ์ปดํฌ๋ํธ๋ง ๋ด๋ ๋ณ๊ฒฝ์ ์ ์ฐํ์ง ๋ชปํ๋ค.!

์ด๋ฐ ์์ ์ค๊ณ๋ UI๊ฐ ๋ฐ๋๊ฑฐ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ๋ฌ๋ผ์ง ๋ ๋์์ด ์ด๋ ต๋ค. ์ปดํฌ๋ํธ๊ฐ ๋๋ฌด ๋ง์ ์ฑ
์์ ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
โ
๊ฐ์ ๋ ๊ตฌ์กฐ

๋ณ๊ฒฝ๋ ์ปดํฌ๋ํธ ์ฝ๋

๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํ ์ปดํฌ๋ํธ๋ ๋๋ฉ์ธ์ ์์์ผ ํ๋ค.
ํ์ง๋ง, ๋ชจ๋ ์ปดํฌ๋ํธ๊ฐ ๋๋ฉ์ธ์ ์ ํ์๋ ์๋ค.

๋๋ฉ์ธ ๊ฑท์ด๋ด๊ธฐ
์ปดํฌ๋ํธ์ ์ธํฐํ์ด์ค๊ฐ ํ์ค์ ๊ฐ๊น์์ง์๋ก ๋ง์ ์ฌ๋๋ค์ด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
์ด์ ์ด๋ ์์ ๋๋ฉ์ธ์ ๋ชจ๋ฅด๊ฒ๋๋ฉด์ ์ผ๋ฐ์ ์ธ ์ด๋ฆ์ ๊ฐ๊ฒ ๋์๋ค.

frameworkSelect๋ ๋๋ฉ์ธ์ ์๋ค. container๊ฐ ์๋์ง๋ง, ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค. ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ๋, ์์จ์ ์ธ ์ปดํฌ๋ํธ๊ฐ ๋๋ค. ์ธ๋ถ์์กด์ฑ์ด ์๋คx
๋น์ฆ๋์ค๋ก์ง์ ๋ณธ์ธ์ด ์ฒ๋ฆฌํ๊ณ , ui๋ก์ง์ multiSelect ์ปดํฌ๋ํธํํ
์์ํ๋ ๋ฐฉ์์ด๋ค. (multiSelect์ปดํฌ๋ํธ๋ ๋๋ฉ์ธ์ ๋ชจ๋ฅธ๋ค.)



์ ๋ง๋ ์ปดํฌ๋ํธ๋ ์ผ์ ๋ฐ๋ณตํ๋ ์์ ์ ์์ ์ค๋ค. ๋ํ ๋๋ฃ์๊ฒ๋ ํฐ ๋์์ด ๋๋ค.