Section3 Unit3 [React] Custom Component
๐ Chapter1. Component Driven Development
• Component Driven Development(CDD, ์ปดํฌ๋ํธ ์ฃผ๋ ๊ฐ๋ฐ)๋ ์ปดํฌ๋ํธ๋ถํฐ ์์ํ์ฌ ๋ง์ง๋ง ํ๋ฉด์ ์ด๋ฅด๊ธฐ๊น์ง ์ํฅ์ (bottom-up)์ผ๋ก UI๋ฅผ ๊ฐ๋ฐํ๋ ๊ณผ์ ์ผ๋ก, UI๋ฅผ ๊ตฌ์ถํ ๋ ์ง๋ฉดํ๊ฒ ๋๋ ๊ท๋ชจ์ ๋ณต์ก์ฑ์ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค๋ค.
6์ ์ํฐ๋ ํ๋ฆฌ์จ๋ณด๋ฉ์์ ๋ค์๋ ์ํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ๊ณผ ํํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ.
์ด๋ฒ๋ฌ ๊ฐ์๊ฐ ์ฐ์ฐํ๋ ๋ถํธ์บ ํ ์์ ๋ด์ฉ๊ณผ ๋ง์์ ์ปดํฌ๋ํธ ์ฃผ๋ ๊ฐ๋ฐ๊ณผ Storybook์ ๋ํ ๊ฐ์์๋ค.
ํ์ ์์ ์ผํ๋ ๋น๊ต์ ์ฐ์ฐจ๊ฐ ๋ฎ์(?) ๊ฐ๋ฐ์๋ค์ ๋๋์ด์ ๋ง์ถ ๋ฏํด์ ์์ง์ ์ด๋ ค์ด ๋ด์ฉ์ด ๋ง์ง๋ง, ๋ญ๊ฐ ๋ฃ๋ ๊ฒ ๋ง์ผ๋ก๋ ๋์์ด ๋ง์ด ๋์ด์ ๋งค์ ์ฌ๋ฐ๊ฒ ๋ฃ๊ณ ์๋ ์ค :)
(7์์ Next.js๋ผ ๊ฐ๋ฒผ์ด ๋ง์์ผ๋ก ๋ค์ด๋ณผ ์๊ฐ์ด๋ท..!!)
์ฌํผ ์ํฐ๋์์ ๋ค์๋ ๋ด์ฉ์ ์ ๋ฆฌํด๋ณด์๋ฉด,
<์ํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ๊ณผ ํํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ>
์ํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ (Bottom๐๐ปUp)
( ๐ฌ ์ฃผ๋ก ์ํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ๋ง์ด ํ๋ค๊ณ ํ๋ค.)
• ๊ฐ์ฅ ์์ ๋จ์์ ํ์ ์ปดํฌ๋ํธ๋ค์ ๋จผ์ ๊ฐ๋ฐ
• ์์ ํ์ ์ปดํฌ๋ํธ๋ค์ ์กฐํฉํ์ฌ ์ ์ฒด์ ์ธ ์ปดํฌ๋ํธ๋ฅผ ์์ฑ
• ์ผ๋ฐ ์ฌ์ฉ์๋ฟ๋ง ์๋๋ผ ๊ฐ๋ฐ์๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
• ์๋ ฅ๋๊ฐ ๋ถ์กฑํ๋ค๋ฉด YAGNI ์ ๋น ์ง๊ธฐ ์ฝ๋ค.
→ You Aren't Gonna Need It : ์ ๋ง ํ์ํ ๋๊น์ง ๊ทธ ๊ธฐ๋ฅ์ ๋ง๋ค์ง ๋ง๋ผ.
• Bottom Up ์์
- ์๊ณ ํ์ฐฎ์ ์ ๋๋ก ๊ท์ฌ์ด ์ปดํฌ๋ํธ โก๏ธ Next.js Page ๋ก
- Atomic ๋์์ธ ํจํด์ ์๋ก ๋ค์๋ฉด, Atom(์์) โก๏ธ Molecule(๋ถ์) โก๏ธ Organism(์ ๊ธฐ์ฒด) โก๏ธ Template(ํ ํ๋ฆฟ) โก๏ธ Page(ํ์ด์ง)
• ๋ง๋ถ์ฌ ์คํ ๋ฆฌ๋ถ๊ณผ ํจ๊ป ์ํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ํ๋ค๋ฉด, ์๋์ ๊ฐ์ ๊ณผ์ ์ ์ฐธ๊ณ ํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค ๐
1. ํ๋์ ์ธํธ ๊ตฌ์ฑ โก๏ธ ์ฌ์ฉ๋ ์ปดํฌ๋ํธ + CSS ์คํ์ผ๋ง + ์ฌ์ฉ๋ ์คํ ๋ฆฌ๋ถ
2. ์ฌ์ฉ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ณด๋ด๊ณ (export), ์คํ ๋ฆฌ์์ ์ฌ์ฉ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ ธ์จ๋ค(import)
→ ์ปดํฌ๋ํธ(Component.jsx) ๐งก ์คํ ๋ฆฌ(Component.stories.js)
3. ์ฌ์ฉ๋ ์ปดํฌ๋ํธ๋ค์ Storybook์ด ๋ฌด์์ธ์ง ๋ชจ๋ฅด๊ฒ ๋ง๋ค์ด ์ฃผ๋๊ฒ์ด ์ข๋ค.
4. ๋ค๋ฅธ ๊ฐ๋ฐ์์๊ฒ ๋ด ์ปดํฌ๋ํธ๊ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ๊น?๋ฅผ ์์ํ๋ฉฐ ๊ฐ๋ฐํ๊ฒ ๋๋ค.
ํํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ(Top๐๐ปDown)
• ํํฅ์ ์ปดํฌ๋ํธ ๊ฐ๋ฐ์ ์ ์ฒด ์์คํ ์ ํฐ ๊ตฌ์ฑ ์์๋ค์ ๋จผ์ ๊ฐ๋ฐ
• ์ดํ ์ค๋ณต๋๋ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ๊ฑฐ๋ ๊ณตํต ํน์ ๊ต์ฐจ๋๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌ
• ์ ์ฒด ์์คํ ์ ๋์์ธ๊ณผ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ๊ตฌ์ฑํ๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ธ๋ถ์ ์ธ ์์๋ค์ ๊ฐ๋ฐ
• ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๋๋ npm dev ์ฆ, ์ฌ์ฉ์๊ฐ ๋ณด๋ ๋์ผํ ํ๊ฒฝ์ผ๋ก ๊ฐ๋ฐํ๋ค.
→ ๊ฐ๋ฐ์๊ฐ ์๋ ์ ๋ง ์ถ์๋ ์ฌ์ฉ์๋ฅผ ์ํด ๊ฐ๋ฐ์ ํ๋ฉฐ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌ
• ๋ฅด๋ธ๋์ ๋ฒ์น (Leblance’s Law)
→ Later equals never. ๋์ค์ ๊ฒฐ์ฝ ์ค์ง ์๋๋ค. ํ๋ฒ ์์ฑํ ์ฐ๋ ๊ธฐ ์ฝ๋๋ฅผ ๋์ค์ ์์ ํ๋ ์ผ์ ๊ฒฐ์ฝ ์๋ค.
• Top Down ์์
- Next.js Page โก๏ธ ์๊ณ ํ์ฐฎ์ ์ ๋๋ก ๊ท์ฌ์ด ์ปดํฌ๋ํธ๋ก
- Atomic ๋์์ธ ํจํด์ ์๋ก ๋ค์๋ฉด, Page(ํ์ด์ง) โก๏ธ Template(ํ ํ๋ฆฟ) โก๏ธ Organism(์ ๊ธฐ์ฒด) โก๏ธ Molecule(๋ถ์) โก๏ธ Atom(์์)
๐ Chapter2. CDD ๊ฐ๋ฐ ๋๊ตฌ
• styled components๋ CSS in JS๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์คํ์ผ ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํน์ ์คํ์ผ์ด ์ฒจ๋ถ๋ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ ์ ์๋๋ก ๋์์ค๋ค. ์ด ์คํ์ผ์ ์ฒจ๋ถ๋๋ ์ปดํฌ๋ํธ์๋ง ์ํฅ์ ๋ฏธ์น๊ณ ๋ค๋ฅธ ์ปดํฌ๋ํธ์๋ ์ ํ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค๋ ์ฅ์ ์ด ์๋ค.
• Storybook์ UI ๊ฐ๋ฐ์ ์ํ ๋๊ตฌ์ด๋ค. ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ค์ ๋ฐ๋ก ๋ณผ ์ ์๊ฒ ๊ตฌ์ฑํด ์ฃผ์ด ํ ๋ฒ์ ํ๋์ ์ปดํฌ๋ํธ์์ ์์ ํ ์ ์๋ค. ๋ณต์กํ ๊ฐ๋ฐ ์คํ์ ์์ํ๊ฑฐ๋, ํน์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๊ฐ์ ์ด๋ํ๊ฑฐ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ํ ํ์ ์์ด ์ ์ฒด UI๋ฅผ ํ๋์ ๋ณด๊ณ ๊ฐ๋ฐํ ์ ์๋ค. Storybook์ ์ฌ์ฌ์ฉ์ฑ์ ํ๋ํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๋ฅผ ๋ฌธ์ํํ๊ณ , ์๋์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํํ์ฌ ์๋ฎฌ๋ ์ด์ ํ ์ ์๋ ๋ค์ํ ํ ์คํธ ์ํ๋ฅผ ํ์ธํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๋ฒ๊ทธ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์๋๋ก ๋์์ค๋ค. ๋ํ ํ ์คํธ ๋ฐ ๊ฐ๋ฐ ์๋๋ฅผ ํฅ์ํ๋ ์ฅ์ ์ด ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ๋ํ ์์กด์ฑ์ ๊ฑฑ์ ํ์ง ์๊ณ ๋น๋ํ ์ ์๋ค.
๐ Chapter3. useRef
• useRef๋ ์ปดํฌ๋ํธ๊ฐ ์ผ๋ถ ์ ๋ณด๋ฅผ ๊ธฐ์ตํ๊ณ ์ถ์ง๋ง, ํด๋น ์ ๋ณด๊ฐ ๋ ๋๋ง์ ์ ๋ฐํ์ง ์๋๋ก ํ ๋ ์ฌ์ฉํ ์ ์์ง๋ง ๋ง์ ๊ฒฝ์ฐ DOM ์์๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
React๋ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฌผ์ ๋ง์ถฐ DOM ๋ณ๊ฒฝ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ์์ ์์ฃผ DOM์ ์กฐ์ํด์ผ ํ ํ์๋ ์์ง๋ง ๊ฐ๋ ํน์ ๋ ธ๋์ ํฌ์ปค์ค๋ฅผ ์ฎ๊ธฐ๊ฑฐ๋, ์คํฌ๋กค ์์น๋ฅผ ์ฎ๊ธฐ๊ฑฐ๋, ์์น์ ํฌ๊ธฐ๋ฅผ ์ธก์ ํ๋ ๋ฑ DOM ์์์ ์ ๊ทผํด์ผ ํ ๋๊ฐ ์๋ค. React๋ ์ด๋ฌํ ์์ ์ ์ํํ๋ ๋ด์ฅ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์ DOM ๋ ธ๋์ ์ ๊ทผํ๊ธฐ ์ํด ref๊ฐ ํ์ํ๋ค.
useRef๋ ๋ฐ๋ก ์ ๋ฆฌํด์ ๊ธ์ ์ฐ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค..๐
๐ ์ค๋์ ํ๊ณ
CDD์ styled component, ์คํ ๋ฆฌ๋ถ์ ๋ํด์ ํ์ตํ๋ค. ์ฌํด ์ด๋ถํฐ ๋งค๋ฌ ๋ค์ด์จ ์ํฐ๋ ํ๋ฆฌ์จ๋ณด๋ฉ์ 6์ ์ฃผ์ ๊ฐ ์ฐ์ฐํ๋ <์คํ ๋ฆฌ๋ถ๊ณผ ํจ๊ปํ๋ ์ปดํฌ๋ํธ ์ฃผ๋ ๊ฐ๋ฐ> ์ด์๋ค. ์ด๋ฒ ํ ์์ผ๊น์ง๋ก 2์ฃผ ๋์์ ์ด 4๋ฒ์ ๊ฐ์๊ฐ ๋ง๋ฌด๋ฆฌ๋์๋๋ฐ, ์คํ ๋ฆฌ๋ถ์ ์ฒ์ ์ ํ๋๋ฐ๋ค๊ฐ vite๋ก ์์ ์ ํ๊ณ , ๋น์ฐํ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ด ๋ง์ด ๋์ ์ฝ์ง ์์์ง๋ง ์ ์ฒด์ ์ธ ํ๋ฆ์ ๋ณผ ์ ์์ด์ ๊ณต๋ถ๊ฐ ๋์๋ค๊ณ ์๊ฐํ๋ค. ์ฌํผ, ์ํฐ๋ ํ๋ฆฌ์จ๋ณด๋ฉ์์ ์คํ ๋ฆฌ๋ถ์ ์ ํด์ ๊ทธ๋ฐ์ง ์ด๋ฒ ์ ๋์์ ์คํ ๋ฆฌ๋ถ์ด ๋์ค๋ ๊ฒ์ ์๊ณ ๋ ์ ๊ธฐํ๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฆ์ด๋ผ๋ ํ ๋ฒ ๋ค์ด๋ณด๊ณ , ์ค์น๋ผ๋ ํด๋ด์ ๊ทธ๋ฐ์ง ์ข ๋ ํธ์ํ ๋๋์ ๋ค์๋ค.
๋ฆฌ์กํธ๊ฐ ์ ์ ๋ ํฅ๋ฏธ๋ก์์ง๊ณ ์๋ค. ๋ ๋ค์ํ ํด์ ํ์ฉํ๊ณ , ๋ ๋ง์ ๊ธฐ๋ฅ์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์๋๋ก ๋ ๋ง์ด ๊ณต๋ถํด์ผ๊ฒ ๋ค.
๐ 6.18 SUN
์คํ ๋ฆฌ๋ถ์ด ํฅ๋ฏธ๋ก์์ ์ผ์์ผ์ ์ฌ์ฉ๋ฒ์ ์ข ๋ ์ต์ํด์ง๊ณ ์ถ์ด ๊ณต๋ถ๋ฅผ ํ๋๋ฐ, ์์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค. ์คํ ๋ฆฌ๋ถ๊ณผ styled component๋ฅผ ์ฌ์ฉํ๋ ๊ณผ์ ๊ฐ ๋ด์ผ๋ถํฐ ์๋๋ฐ, ๋ฏธ๋ฆฌ ๊ตฌํํด๋ณด๋ styled component์ ํ์ฉ๋ ๋ด๊ฐ ์ ์ฌ์ฉํ์ง ๋ชปํ๋ ๋ฏ ํ๊ณ (Pure CSS ์ฒ๋ผ ๊ตฌํํ๊ฒ ๋๋ค..!!!), ์คํ ๋ฆฌ๋ถ์ ์์ ์ด๋ป๊ฒ ํด์ผํ ์ง ์ ๊ทผ์กฐ์ฐจ ์ฝ์ง ์์๋ค ๐ฅฒ ์ด๋ฒ ๊ณผ์ ๋ฅผ ํ๋ฉฐ ์ต์ํด์ ธ ๋ด์ผ์ง…