1. React Component
REST API ์ GraphQL
REST API ๋ ๋ฌด์์ธ๊ฐ
GraphQL์ ์ ๋ฑ์ฅํ๋๊ฐ?
REST API vs GraphQL
JSON
DSL(Domain-Specific Language)
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ
SRP(๋จ์ผ ์ฑ ์ ์์น)
Atomic Design
React component ์ props
๊ฐ์ ์ ๋ฆฌ
React๋ก ์ฌ๊ณ ํ๊ธฐ
๋ฆฌ์กํธ๋ก ์นํ์ด์ง๋ฅผ ๊ฐ๋ฐํ๋ ์ฌ๊ณ ๋ฐฉ์, ์์๋ฅผ ์์๋ณผ ๊ฒ. ๊ณต์๋ฌธ์์ Thinking in React ํํธ๋ฅผ ํ๋ํ๋ ์์ธํ๊ฒ ์ดํด๋ณผ ๊ฒ์ด๋ค. ์ด ์ฌ๊ณ ๋ฐฉ์์ ์๋ฌด๋ฆฌ ๋ณต์กํ ์ฑ์ ๋ง๋ค๋๋ผ๋ ๋๊น์ง ์ ์ฉ๋๋ ์์น์ด๋ค. ์์์ ์ผ๋ก ํ๋ จ์ ํด์ผ ํ๋ค. ํญ์ ๋ฆฌ์กํธ์ฒ๋ผ ์ฌ๊ณ ํ๋ฉด์ ๊ฐ๋ฐํ๊ธฐ
Step 1: Break the UI into a component hierarchy
๋ฆฌ์กํธ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ชผ๊ฐ๊ธฐ, DOM tree๋ฅผ ๋ง๋ค๋ฏ์ด Component tree๋ฅผ ๋ง๋๋ ๊ฒ.
์ปดํฌ๋ํธ ํ๋์ JSX๋ฅผ ๋ชจ๋ ์์ฑํ๋ค ๋ณด๋ฉด ์ปดํฌ๋ํธ๊ฐ ๋น๋ํด์ง๊ณ , ๋ค์ํ UI๊ฐ ํ๋์ ์ปดํฌ๋ํธ์ ์กด์ฌํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ญํ ์ ๋ง๊ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํด์ค์ผ ํ๋ค.
๋ฆฌ์กํธ๋ฅผ ์ฒ์ ๊ณต๋ถํ ๋๋ ๋์ฒด ์ปดํฌ๋ํธ๋ฅผ ์ด๋๊น์ง ๋๋ ์ผ์ง?
, ํ๊ทธ ํ๋ํ๋๋ฅผ ๋ค ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํด์ผ ํ๋?
๋ผ๋ ์๊ฐ์ด ์์๋ค.
์ด๋ค ๊ฐ๋ฐ์๋ค์๊ฒ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ์ ๋ํ ์ง๋ฌธ์ ํ๋ฉด ๋ช
ํํ๊ฒ ๋ต์ ๋ชปํ๊ฑฐ๋, ํ๋ค๋ณด๋ฉด ๋๋์ด ์จ๋ค๋ผ๋ ๋ต๋ณ๋ ๋ค์ด๋ดค๋๋ฐ ์ฌ์ค ์ด ์ฌ๋๋ค์ ๋ณธ์ธ๋ค๋ ๋ชจ๋ฅด๊ณ ์์๋ ๊ฒ ์๋๊ฐ ์ถ๋ค.
๋ถ๋ฆฌ์ ๊ธฐ์ค์ SRP, SSOT๋ก ์๊ฐํ๋ ์ดํดํ๊ธฐ ์ข์๋ค.
๋ atomic design์ฒ๋ผ button
, input
ํ๊ทธ๋ค๋ ๋ฐ๋ก ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ์ฌ ์ฑ์ ๊ฐ๋ฐํ๋ ๋ฐฉ์๋ ๊ด์ฐฎ์ ๊ฒ ๊ฐ๋ค.
๋์์ธ ์์คํ
์ ๋ง๋ค์ด ๋๊ฐ๋ ๊ณผ์ ๋ ์ฌ๋ฏธ์๊ณ ๋ฐฐ์ธ ๊ฒ ๋ง์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
~๋ ํ๋์ ์ผ๋ง ํด์ผํ๋ค
๋ผ๋ ๋ง์ ์ ๋ง๋ก ์ํํธ์จ์ด ๊ณตํ ์ ๋ฐ์ ๋ชจ๋ ์ ์ฉ๋๋ ๊ฒ ๊ฐ๋ค.
๊ณ์ํด์ ํ์ตํ๊ณ ํ๋ จํ์.
JSON Data์ mockup์ ๊ฐ์ง๊ณ ์์ํ๋ค. mockup์ ๋์์ด๋๊ฐ ์ ๋ฌํด์ฃผ๋ ๊ฒ์ธ๋ฐ, ์ฌ๊ธฐ์ ์คํ์ผ๋ง์ ์ ํ ๊ฒ์ด์ง๋ง, ์์ฑ๋ ๊ฒฐ๊ณผ์ ๋น๊ตํ์ ๋ ํฐ ํ์์๋ ์ฐจ์ด๊ฐ ํฌ์ง ์๋ค. ์ค์ ๋ก ๊ฐ๋ฐ ์ผ์ ์ด๋ผ๋๊ฒ ์ด์์ ์ผ๋ก ๋์์ธ์ด ๋์ค๊ณ , API๊ฐ ๋ชจ๋ ์์ฑ๋ ์ํฉ์์ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์์ํ๋ ๊ฒ์ ๋งค์ฐ ๋๋ฌผ๊ธฐ ๋๋ฌธ์ ์ ํ๋ ์ ๋ณด๋ง์ผ๋ก๋ ๊ฐ๋ฐ์ ํ ์ ์๋ ์ญ๋๋ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค. ๋์์ธ์ ๊ทธ๋๋ mockup์ฒ๋ผ ์ด๋ ์ ๋๋ ๋์์ผ ํ๊ฒ ์ง๋ง, API ๊ด๋ จํด์๋ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๊ฑฐ๋, msw๋ฅผ ์ด์ฉํ๋ ๋ฑ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค. msw๋ฅผ ์ด์ฉํ๋ฉด ์ค์ API๊ฐ ์์ฑ๋์์ ๋ ์ฝ๊ฒ ๊ฐ์๋ ์ ์๋์ ์ด ์ฅ์ ์ธ ๊ฒ ๊ฐ๋ค.
์ผ๋จ์ ๋ฐฑ์๋์์ JSON ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋๋ ค์ฃผ๋ API๋ฅผ ์ ๊ณตํ๋ค๊ณ ๊ฐ์ ํ๋ค. ๋๋ถ๋ถ์ REST API ๋๋ GraphQL์ ์ฌ์ฉํ๋ค. gRPC, tRPC๋ฑ๋ ๋ค์ด๋ดค๋ค.
REST API
fetch API -> GET, POST, PUT/PATCH, DELETE (CRUD)
Resource ์ค์ฌ
GraphQL
Graph๋ผ๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ค.
Query์์ ์ป๊ณ ์ ํ๋ ๊ฑธ ์คํค๋ง ์ฒ๋ผ ๋ฃ์ด์ค๋ค, ์ง์ ํด์ค๋ค. Post๋ง ์ป์ ๊ฒ์ธ์ง, Post์ ๋ธ๋ ค์๋ Comment๊น์ง ์ป์ ๊ฒ์ธ์ง ์ฟผ๋ฆฌ์์ ๊ฒฐ์ ํด์ค๋ค.
Query(Read)
Mutation(Command: Create, Update, Delete): ์กฐ์ํ๋ ๊ฒ
Subscription(Event๋ฅผ ์ธ์งํ๋ ์ฉ๋): ์ฟผ๋ฆฌ์ ๋ํด์ ์ธ์ง๋ฅผ ํ์ง๋ ์๋๋ค. Mutation์ ๋ํด์ ์ธ์ง๋ฅผ ํ๋ค.
์ฃผ๋ก Query์ Mutation์ด ์ค์ฌ์ด ๋๋ค.
Command๊ฐ Create, Update, Delete๋ฅผ ๋ํ๋ด๋ ๊ฒ์ธ์ง ์ฒ์ ์์๋ค. ๊ทธ๋์ CQRS์ C๊ฐ Command์๊ตฌ๋ ๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
JSON์ 2009๋ ์ ๋๊ธ๋ผ์ค ํฌ๋กํฌ๋๊ฐ ์ฒ์์ผ๋ก ๊ท์ ํ๋ค. JSON(JavaScript Object Notation)์ ๋ฐ์ดํฐ๋ฅผ ํ๋ก ํธ์๋์ ๋ฐฑ์๋๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ธฐ ์ํด ๋ง๋ค์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก JSON์ string์ด๋ค.
JSON.stringify: ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ด๋ ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ณํํ๋ค.
JSON.parse: ๋ฌธ์์ด์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ค๋ค.
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋๋ก UI๋ฅผ ๊ตฌ์ฑํ๋ค. React๋ ์ ์ธํ(HTML๊ณผ ์ ์ฌํ ๋ชจ์์ DSL์ ์ฌ์ฉ)์ผ๋ก UI๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค. ์ ํํ๊ฒ๋ XML์ด๋ค. DSL์ ๋๋ฉ์ธ ํนํ ์ธ์ด๋ผ๊ณ ํด์ ํน์ ๋๋ฉ์ธ์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด ์ฌ์ฉํ๋ ์ธ์ด. ์ฌ๊ธฐ์ ๋ฌธ์ ๋, 2์ฃผ์ฐจ ๊ณผ์ ์์๋ ๊ฒฝํํ๋ ๊ฒ ์ฒ๋ผ React.createElement๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ฆฌ์กํธ ์ฑ์ ๋ง๋ค์ด ๋๊ฐ๋ ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐ์ด ๋ค์๋ค. ์ฑ์ด ๋ณต์กํด์ง์๋ก JS๋ก๋ง ๊ฐ๋ฐ์ ํ๋ค๋ฉด ๋์ฑ ์์ฐ์ฑ์ด ์ข์ง ์์ ๊ฒ ๊ฐ๋ค. ๊ทธ๋์ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์ JSX๋ฅผ ๊ฐ๋ฐํ์ ๊ฒ ๊ฐ๋ค.
์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ
๋ฆฌ์กํธ ๊ณต์๋ฌธ์๋ฅผ ๊ฐ๋ณด๋ฉด Declarative(์ ์ธ์ ), Component-Based(์ปดํฌ๋ํธ ๊ธฐ๋ฐ), Learn Once, Write Anywhere(ํ๋ฒ ๋ฐฐ์์ ์ด๋์๋ ์ฐ์)๋ผ๋ ์ค๋ช ์ด ์๋ค. React์ ๊ฐ๋ ฅํ ํน์ง์ค์ ํ๋๋ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก UI๋ฅผ ์์ฑํ๋ ๊ฒ์ด๋ค. ๊ทผ๋ฐ ์ฌ์ค ๋ค๋ฅธ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ๋ ๋๊ฐ์ง ์๋? ๋ผ๋ ์๊ฐ์ ๋ ๋ค. Vue, Angular, Svelte ๋ฑ๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ํ์ผ์ ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐ์ ํ๋.. ๋ฆฌ์กํธ๋ฅผ ๊ฐ์ธ๊ณ ์๋ Next, Remix๋ฑ๋ ๋ฌผ๋ก ์ด๋ค. ๋ฆฌ์กํธ๋ง์ ์ฅ์ ์ด๋ผ๊ธฐ ๋ณด๋ค๋, ํ๋ก ํธ ํ๋ ์์ํฌ๋ค์ ๊ณตํต์ ์ธ ์ฅ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค. Build encapsulated components that manage their own state, then compose them to make complex UIs. ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ค์ ๋ชจ์์ ๋ณต์กํ UI๋ฅผ ๋ง๋ค์ด๋ด์ผ ํ๋ค. ๋ณต์กํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์์ผ๋ฉด ๋ฆฌ์กํธ์ ์ฅ์ ์ ์ด๋ฆฌ์ง ๋ชปํ๋ ๊ฒ์ด๋ค. ๋ง์น ํ ์คํธ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ค์ฐ๋ฉด, ํจ์์ ์ค๊ณ ์์ฒด๊ฐ ์๋ชป๋ ๊ฒ์ธ์ง ์์ฌํด๋ด์ผ ํ๋ ๊ฒ์ฒ๋ผ ์ปดํฌ๋ํธ ๋ํ ๋๊ฐ์ด ๋ด์ผํ ๊ฒ ๊ฐ๋ค. ์บก์ํํ๊ณ ์๋ ์ปดํฌ๋ํธ๋ค์ ๋ชจ์์ ์กฐ๋ฆฝ์ ํ๋ ๊ฒ. ์๋์ฐจ๋ฅผ ๋ถํ์ ์กฐ๋ฆฝํ๋ฉด์ ๋ง๋ค์ด๋๊ฐ๋ ๊ฒ์ฒ๋ผ ๋ฆฌ์กํธ๋ ๋๊ฐ์ด ์ปดํฌ๋ํธ๋ฅผ ์กฐ๋ฆฝํ๋ฉด์ ๋ง๋ ๋ค. CDD(Component Driven Development), ์ปดํฌ๋ํธ ์ฃผ๋ ๊ฐ๋ฐ๋ ๋ ๊ณ ๋ฅผ ๋ง์ถ๋ฏ์ด, ์ปดํฌ๋ํธ๋ค์ ํ๋์ฉ ๋ผ์๊ฐ๋ฉฐ ์ฑ์ ๋ง๋๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
์ปดํฌ๋ํธ๋ฅผ ๋๋๋ ๊ธฐ์ค ๊ฐ์ฒด์งํฅ์์ ๋งํ๋ 5๊ฐ์ง ์์น, SOLID
SRP
๋ชจ๋ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ง๋ฉฐ ์บก์ํํด์ผํ๋ค. (์บก์ํ๋ ์ปดํฌ๋ํธ)
ํ๋์ ์ปดํฌ๋ํธ๊ฐ ๋ณ๊ฒฝ๋๋ ์ด์ ๋ ๋จ ํ๋์ฌ์ผ ํ๋ค.
์ปดํฌ๋ํธ๋ฅผ ๋ดค๋๋ฐ ํ๋ ์ผ๋ ๋๋ฌด ๋ง๊ณ , ๋ณ๊ฒฝ์ด ์๊ธธ ๋ ๋ง์ ๋ถ๋ถ์ ๊ณ ์ณ์ผ ํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์ชผ๊ฐ์ผ ํ๋ค.
์ปดํฌ๋ํธ๋ html์ด ๊ธธ์ด์ง์๋ ์๊ณ , ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ๋ง์์ง์๋ ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ๋ง์์ง๋ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์์๋ณผ ๊ฒ. ์๋ง ์ปค์คํ ํ ์ ์๊ธฐํ์๋ ๊ฒ ๊ฐ๋ค.
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ view๋ง ๋ด๋นํ๋๊ฒ ์ญํ ์ ๋ง๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์, ์ปค์คํ ํ ์ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ๋ค.
CSS
html ์ฝ๋๊ฐ ๋ง์์ง๋ ๊ฒฝ์ฐ์๋ css๋ฅผ ์ํ class๋ฅผ ์ ํ์ฉํด์ผ ํ๋ค.
css๋ฅผ ๋ง๋ค์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ ๋ ์ฐ๋ฆฌ๋ ๋จธ๋ฆฌ์์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์ชผ๊ฐ ๋ค.
์๊ฒ ๋ชจ๋ฅด๊ฒ css๋ฅผ ์์ฑํ ๋๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ๊ณ ์๋ ๊ฒ์ด๋ค.
Design's Layer
๋์์ธ์ ๋ง๋ค๋๋ถํฐ ๋ ์ด์ด๋ฅผ ๋๋ ๋๊ณ ์๋ค. ์ด๊ฒ๋ ๊ทธ๋๋ก ์ปดํฌ๋ํธ ๊ตฌ์กฐ๋ก ํ์ฉํ ์ ์๋ค.
๋ฆฌ์กํธ ๊ณต์๋ฌธ์์์ hierarchy๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ์์ฌ๋์ ๋์์ธ์ ๊ฐ๊น๋ค๊ณ ํ์ จ๋ค.
Information Architecture (JSON Schema์ ์ํฅ)
JSON ๊ตฌ์กฐ๊ฐ ์ฒด๊ณ์ ์ผ๋ก ์ ๋์ด ์๋ค๋ฉด JSON ๊ตฌ์กฐ๋ฅผ ํ์ฉํ ์๋ ์๋ค.
JSON ๊ตฌ์กฐ๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ์ฃผ๊ธฐ์ ์กฐ๊ธ ์ ๋งคํ๋ค๋ฉด ํ๋ก ํธ ๋จ์์ ๊ฐ๊ณต์ ํด์ ํ๋ฉด์ ๋ฟ๋ ค์ค ์๋ ์๊ณ , ๋ฐฑ์๋์ ์์ฒญํด์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํด๋ฌ๋ผ๊ณ ํ ์๋ ์๋ค.
์ค์ ๋ก ์์ฌ๋์ ์ด ๋ฐฉ๋ฒ์ ์์ฒญ ๋ง์ด ์ฐ๊ฒ ๋๋ค, ๋ง์ฝ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ข์ง ์์ผ๋ฉด ๋ฐฑ์๋์์ ์์ ํ๋ ํธ์ด๋ผ๊ณ ํ์ จ๋ค.
๋ญ๊ฐ BFF๊ฐ ์๊ฐ๋๊ธฐ๋ ํ๋ค. BFF๊ฐ ์ด๋ฌํ ์ญํ ๋ ํ ์ ์์ ๊ฒ ๊ฐ๋ค.
Redux๋ฅผ ๋นก์ธ๊ฒ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ Normalize๋ฅผ ๋ง์ด ํ๊ฒ ๋๋ค. ๋ฐ์ดํฐ ์ค๋ ๊ฒ๋ค์ ์ด๋ป๊ฒ ํ ์ง, ์บ์ ๊ด๋ จ๋ ๊ฒ๋ค์ ์ด๋ป๊ฒ ํ ์ง. gql์ ์บ์ฑ์ ์์์ ํด์ค๋ค.
์์ฐ์ค๋ฌ์ด SRP๊ฐ ๋๋ค, ์ฌ์ค์ ๊ฐ์ ๊ฐ ๋๋ค. product ํ๋๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค.
์์ ์ปดํฌ๋ํธ, ๋ถํ์ ๋ง๋ค์ด์ ์กฐ๋ฆฝ์ ํ ๊ฒ์ด๋ค. ๋์๊ฒ ์๊ธฐํ๋ฉด ์กฐํฉ์ ๊ฐ์ง์๊ฐ ๋ง์์ ํญ๋ฐ์ ์ผ๋ก ์์ด ๋์ด๋์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ธ์๋ ์์ง๋ง, ๊ด๋ฆฌ๋ง ์ํ๋ฉด ์ ์ ๋ถํ๋ง์ผ๋ก ์ฌ๋ฌ๊ฐ์ง๋ฅผ ๋ค ๋ง๋ค ์ ์๋ค. ์ฐ๋ฆฌ๊ฐ ์ํ๋ UI๋ฅผ ๋ง๋ค๋ ค๊ณ ํ ๋ ์ปดํฌ๋ํธ๋ฅผ ์กฐ๋ฆฝํด์ ๋ง๋ค๋ฉด ๋งค์ฐ ํธํ๋ค. ํ๋๋ง ์์ ํ๊ฑฐ๋, ํ๋๋ง ์ถ๊ฐํด์ ์๋ก์ด ๊ฒ์ ๋ง๋ค์ด๋ผ ์ ์๋ค. ์ปดํฌ๋ํธ๋ฅผ ์ ๋ง๋ค์ด ๋๋๋ค๋ฉด, ์์ฐ์ฑ๋ ๋งค์ฐ ์ข๊ณ ๋ผ์ ๋ง์ถ๋ ๊ณผ์ ์ด ์ฌ๋ฐ์ ๊ฒ ๊ฐ๋ค.
Atomic Design ์ํ ๋ฏน ๋์์ธ์ ๊ทธ๋๋ก ์ฌ์ฉํ๋ผ๋ ๊ฒ์ด ์๋๋ค. ๋ง๋ ์ฌ๋๋ ์ด๋ฏธ ์ฐ๋ฆฌ๊ฐ ์ฐ๊ณ ์๋๊ฑฐ๊ณ ์ด๋๋ก ํด์ผํ๋๊ฒ ์๋๋ค. ๊ฐ๋ ์ ์ธ ๊ฒ์ด๋ค. ์ด๋ ๊ฒ ์ ์กฐํฉ์ ํด์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ชจ๋ ๊ฒ์ ๋ง๋ค์๋ ์์ด๋์ด. ์ํ ๋ฏน ๋์์ธ์ ๊ทธ๋๋ก ์ด์ฉํด์ ๊ฐ๋ฐ์ ํ๋ ๊ฒ์ ๋ฐ๋ํ๋ ์๊ฒฌ๋ ๋ดค์๋๋ฐ ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ค์ ๋ก ํด๋ณด๊ณ ๋๊ปด๋ณด๋๊ฒ ์ค์ํ ๊ฒ ๊ฐ๋ค.
ATOMS
MOLECULES
ORGANISMS
TEMPLATES
PAGES
์ค์ ๋ก Thinking in React์ ๋์ค๋ ์์ ๋ฅผ ๋ง๋ค์ด ๋ณผ ๊ฒ.
JSX๋ XML์ด๊ธฐ ๋๋ฌธ์ input
, br
๊ฐ์ ํ๊ทธ๋ฅผ ๋ซ์์ค ๋๋ Self-Closing ๋ฌธ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋ค.
input
label
์ ์ฐ๋ ๋ฐฉ์์ ๋ ๋ค ๋๊ฐ๋ค.
์์ฌ๋์ 1๋ฒ ์คํ์ผ์ ์ ํธ. ํ์์ ์ด๋ป๊ฒ ํ๋์ง๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด ๋๋ค. ๋๋ ๊ฐ์ธ์ ์ผ๋ก 1๋ฒ ์คํ์ผ์ด ์ข๋ค.
// 1๋ฒ
<div>
<input type="checkbox" id="only-stock" />
<label htmlFor="only-stock">Only show products in stock</label>
</div>
// 2๋ฒ
<div>
<label>
<input type="checkbox" />
Only show products in stock
</label>
</div>
๋ฆฌ์คํธ๋ฅผ ๋ ๋๋ง ํ ๋ key๋ฅผ ์ก์์ค์ผ ํ๋ ์ด์ ๋ ๋ฐ์ดํฐ์ ๋ณํ๊ฐ ์๊ฒผ๋์ง ๋ฐ๋ก ์ ์ ์๊ธฐ ์ํจ์ด๋ค. ์ด ๋ด์ฉ์ 2์ฃผ์ฐจ VDOM, ์ฌ์กฐ์ ์ ํด๋นํ๋ ๋ด์ฉ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก๋ ๋ฐ์ดํฐ์ id๊ฐ์ผ๋ก ํ๊ณ , id ๊ฐ์ด ์๋ค๋ฉด uniqueํ key๊ฐ์ ๋ง๋ค์ด์ผ ํ๋ค.
๊ณ ์ฐจํจ์ reduce๋ฅผ ์ฌ์ฉํ ๋ ํ์ ์ก์์ฃผ๋ ๋ฐฉ์. ์์ฌ๋์ ์ ๋งํ๋ฉด type alias๋ฅผ ์ฌ์ฉํ์๋๋ฐ ํ์ฌ product์ ๊ฐ์ ๊ฒฝ์ฐ์๋ interface๋ฅผ ์ฌ์ฉํ์ ๋ค. ํด๋น ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ class๋ก ๋ง๋ค ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์๋ค. ์๋ง ๋๋ฏธ๋ฐ์ดํฐ๊ฐ ์๋๋ผ ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ๋ class๋ก store๋ฅผ ๋ง๋ค์ด์ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ๋ค. ํ๋งจ๋์ FE Conf ๋ฐํ๊ฐ ์๊ฐ๋ฌ๋ค.
const categories = products.reduce(
(acc: string[], product: Product) =>
acc.includes(product.category) ? acc : [...acc, product.category],
[],
);
์ปดํฌ๋ํธ๋ ๋น์ทํ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ณต๋๋ฉด ๊ทธ๋ ๋ถ๋ฆฌ๋ฅผ ํ๋ค. ์ฒ์๋ถํฐ ์ปดํฌ๋ํธ ํ์ผ๋ก ๋ถ๋ฆฌํ ํ์๋ ์๋ค. YAGNI. ๋๋ ์ฒ์๋ถํฐ ๋ถ๋ฆฌํ๊ธฐ ๋ณด๋ค๋ ๊ฐ๊น์ด ๊ณณ์ ๋๊ณ , ๋ฐ๋ณต๋๊ฑฐ๋(DRY) ๋น๋ํด์ง๋ค ์ถ์ผ๋ฉด ๊ทธ๋ ๊ฐ์ ๋ถ๋ฆฌํด์ฃผ๋ ๊ฒ ์ข๋ค๊ณ ์๊ฐํ๋ค. ์ปดํฌ๋ํธ ์๋จ์ ๋ถ๋ฆฌํ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํด์ค๋ค.
๋๋ฌด ๊ธธ์ด์ง๊ฑฐ๋ ๋ณดํธ์ ์ผ๋ก ์ธ ์ ์๊ฒ๋ ๋๋ฉด ๊ทธ๋ ๋ถ๋ฆฌ๋ฅผ ํด์ค๋ค.
ํ๋์ ์ปดํฌ๋ํธ ์์์ ๋ณ์๋ช ์ด ๊ฒน์น๋ฉด, ๋ค๋ฅธ ํ์ผ๋ก ๋ถ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด ๋๋ค. ์คํ๋ ค ๋ถ๋ฆฌ๋ฅผ ํด์ผํ๋ค๋ ๊ฒ์ ์๋ ค์ฃผ๋ ์ข์ ์ ํธ์ธ ๊ฒ ๊ฐ๋ค.
์๋ ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋ props์ ํ์ ์ ์ก์์ค ๋, ์ปดํฌ๋ํธ ์ด๋ฆ์ ์๊ด์์ด ์ผ๊ด๋๊ฒ Props๋ก ์ก์์๋๋ฐ ์ปดํฌ๋ํธ๋ช + Props๋ฅผ ๋ถ์ด๋ ๊ฒ ๋ ์ข์ ๊ฒ ๊ฐ๋ค๋ ์๊ฐ์ด ๋ค์ด์ ๋ฐ๊ฟจ๋ค.
์์ฌ๋์ ์ฝ๋๋ฅผ ์์ฑํ์ค ๋ ์ฌ์ฉํ๋ ์ชฝ(ํธ์ถํ๋ ์ชฝ)์ ๋จผ์ ์์ฑํ์ ๋ค. ๊ทธ ๋ค์์ ๋น์ฐํ ๋นจ๊ฐ์ค์ด ๋จ๊ฒ ๋ ๊ฒ์ด๊ณ ์ ์ธ๋ถ๋ฅผ ์์ฑํ์๋๋ฐ ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋๊ฒ ์ข๋ค๋ ๊ฒ์ ๋ง์ด ๋ค์๊ณ ๋๋ ์์์ ์ผ๋ก ํธ์ถํ๋ ์ชฝ์ ๋จผ์ ์์ฑํด์ผ๊ฒ ๋ค. ๋ง์น ์์ฃผ ์ด์ํ์ TDD ๊ฐ์ ๋๋๋ ๋ ๋ค.
์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ณผ์ ์ ์ฃ๋ถ๋ฆฌ ๋ถ๋ฆฌ๋ฅผ ํ๋ ค๊ณ ํด์ ์ด๋ ค์์ ๊ฒช๋ ๊ฒ ๊ฐ๋ค. ์์ฌ๋์ฒ๋ผ ์ฐ์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ ์ ์ธ ํ์ด์ง๋ฅผ ์์ฑํ๊ณ , ์ค๋ณต๋๋ ๋ถ๋ถ๋ค์ ํ๋์ฉ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํด๋๊ฐ๋ ๊ณผ์ ์ด ์ข์ ๊ฒ ๊ฐ๋ค. ๋์ค์ ๊ฐ๊ฐ์ด ๋์ด๋๋ฉด ์ด๋์ ๋ ๋ฏธ๋ฆฌ ์ค๊ณ๋ฅผ ํ ์ ์๊ฒ ์ง๋ง ์ง๊ธ์ ์ฒ์ฒํ ํด๋๊ฐ๋ ๊ฒ ๋ ์ค์ํ ๊ฒ ๊ฐ๋ค.
Props๋ Destructuringํด์ ์ฌ์ฉํ๋๊ฒ ์ข๋ค. ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ธ ๋๋ Props๋ฅผ ๋๊ธธ ๋ product.name, product.price ์ฒ๋ผ ์๊ฒ ์ชผ๊ฐ์ ๋๊ธฐ๊ธฐ ๋ณด๋ค๋ product ํ๋๋ฅผ ๋๊ธฐ๋๊ฒ๋ ์ข๋ค. ์๋์์ฑ์ด ๊ฐ๋ ฅํ๊ธฐ ๋๋ฌธ์ ์๊ด์ด ์๋ค.
๋ง์ฝ ์ฝ๋๊ฐ ๊ธธ์ด์ง๋ฉด ๋ค์ฌ์ฐ๊ธฐ๋ฅผ ํตํด์ ๊น๋ํ๊ฒ ์ ์ ๋ฆฌํ์.
Props๋ฅผ ์ด๋ป๊ฒ ํ๋ฉด ์ ์ก์์ง ๊ณ ๋ฏผํด๋ณด๋๊ฒ ์ค์ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์์ผํ๋ ๊ฒ ์์ผ๋ฉด type์์ &๋ก ์ก์์ฃผ๊ธฐ.
์ปดํฌ๋ํธ๋ ํน์ํ ๊ฒ ์๊ณ ๋ณดํธ์ ์ธ ๊ฒ ์๋ค. ์ชผ๊ฐ๋ ๊ธฐ์ค์ ์ค์ค๋ก ์ก์๋ณด๋ฉด ์ข๋ค.
Last updated