๐จย React Design Pattern and StoryBook Basic
๋ฆฌ์กํธ ๋์์ธ ํจํด์ ๋ํ ์ด๋ก ์ ์ธ ๋ด์ฉ๊ณผ ์คํ ๋ฆฌ๋ถ ์ฐ๋จน ๊ธฐ๋ก์ ๋๋ค.
์ง๊ธ๊น์ง ๊ฐ๋ฐ์ ํด์ค๋ฉฐ ์ด๋ค ์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ข์๊น๋ฅผ ๊ณ์ ๊ณ ๋ฏผํด์๋๋ฐ, ์ค์ ์์ง ๋ต์ ์ฐพ์ง๋ ๋ชปํ๋ค. ์ค๊ฐ์ค๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ๊ณผ ๊ด๋ จํด์ ์ฃผ๋ณ 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 ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ฝ๋ค. ์๋ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ง ๊ณต์๋ฌธ์๊ฐ ์๋ ค์ฃผ๋๋๋ก ์ ๋ฐ๋ผ๊ฐ๋ฉด ํฌ๊ฒ ์ด๋ ต์ง ์๋ค. ๊ธฐ๋ณธ์ ์ธ ์์๋ฅผ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค.
Story ๋ฅผ ๋ง๋ค ํด๋์ Component์ ๋ํ ์ ์
Component ๊ฐ ๊ฐ์ง๋ args (props) ์ ๋ํ ์ ์ ์ ๋ฆฌ
Default Story ์์ฑ & ๊ฐ ์ผ์ด์ค์ ๋ฐ๋ฅธ Story ์์ฑ
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์์ด ๋๊ฒ ๊ตฌ๋
๊ฐ๋ฐํ๋ฉด์ ๋ถ๋ชํ๋ ๋ฌธ์ ๋ค์ ๋ง๊ณ โฆ ๊ทธ๋ฐ๋ฐ ๋ ์ด๋ ๊ฒ ์๋ฃจ์ ๋ํ ๋ง๋ค. ํ์ง๋ง ์ด๋ค ๊ฒ์ด ์ง๊ธ ๋ด ์ํฉ์ ์ ํฉํ์ง์ ๋ํด์ ์๊ธฐ ์ํด์๋ ๋ด๊ฐ ๋ง์ด ์์์ผํ๋ค๊ณ ์๊ฐํ๋ค. ๊ทธ๋์ ๊ฐ๋ฐ์๋ค์ด ๊ณต๋ถ๋ฅผ ํ์ ํด์ผํ๋ ๊ฒ์ด๊ฒ ์ฅ.. ํํ ๋ ๋ ๋์ ํ๋จ์ ํ ์ ์๋ ๊ฐ๋ฐ์๊ฐ ๋๊ธฐ ์ํด ๊ฒ์๋ฌ์ง์ง ๋ง์์ผ๊ฒ ๋ค. ํ์ดํ!
๐พ ์ฐธ๊ณ
https://redux.vlpt.us/1-2-presentational-and-container-components.html
https://fe-developers.kakaoent.com/2022/220731-composition-component/
https://velog.io/@devstone/์คํ ๋ฆฌ๋ถ-์ ๋๋ก-ํ์ฉํ๊ธฐ
https://storybook.js.org/docs/react/api/csf#upgrading-from-csf-2-to-csf-3
https://velog.io/@juno7803/Storybook-Storybook-200-ํ์ฉํ๊ธฐ