1. React Component
1. Thinking in React
๐ Thinking in React ๋ฆฌ์กํธ๋ฅผ ์ด์ฉํ๋ ๊ธฐ์ด
Start with the mockup
JSON API
๋์์ด๋์ ๋ชฉ์ - ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ ์๋์ง๋ง ๋ผ๋๊ฐ ๋๋ ํ
BE์์ JSON ํํ์ ๋ฐ์ดํฐ๋ฅผ ๋๋ ค์ฃผ๋ API๋ฅผ ์ ๊ณตํ๋ค๊ณ ๊ฐ์ (๋๋ถ๋ถ์ REST API ๋๋ GraphQL) FE๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋๋ก UI๋ฅผ ๊ตฌ์ฑ React๋ ์ ์ธํ(HTML๊ณผ ์ ์ฌํ ๋ชจ์์ DSL์ ์ฌ์ฉ)์ผ๋ก UI๋ฅผ ๊ตฌ์ฑํ ์ ์์
Step 1: Break the UI into a component hierarchy
UI๋ฅผ ์ปดํฌ๋ํธ ๊ณ์ธต ๊ตฌ์กฐ๋ก ๋๋๊ธฐ
Step 2: Build a static version in React
React์์ ์ ์ ๋ฒ์ ๋น๋
2. REST API ์ GraphQL
REST API๋ ๋ฌด์์ธ๊ฐ?
GET, POST, PUT/PATCH, DELETE (CRUD - ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ)
Resource ์ค์ฌ์ผ๋ก ์กฐ์
GraphQL์ ์ ๋ฑ์ฅํ๋๊ฐ?
GraphQL raphQL is the better REST GraphQL Playground
ํ์ด์ค๋ถ ๊ฐ๋ฐ - ํ์ด์ค๋ถ์์ ๋ฐ์ํ๋ ์๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํจ ๋ถํ์ํ ๋ฐ์ดํฐ๊น์ง ์ ๋ถ ๋ฐ์์์ ์ฒ๋ฆฌํด์ผ ํ๋ REST API์ ๋ฌ๋ฆฌ, ํ์ํ ๋ฐ์ดํฐ๋ง ์ง์ ํด์ ์์ฒญํ ์ ์๊ธฐ ๋๋ฌธ์ ๋น์ฉ์ด ์ ๊ฐ ๐ธ facebook, airbnb, github ๋ฑ ์ ๋ช ํ ์ฌ์ดํธ์์ ์ฌ์ฉ ์ค
Graph ์๋ฃ ๊ตฌ์กฐ
Query์์ ์ป๊ณ ์ ํ๋ ํญ๋ชฉ์ ์ง์
Graphql์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ ๋ฌด์ ๋ฐ๋ผ Query, Mutation์ ๊ตฌ๋ถ
Query(Read), Mutation(Command: Create, Update, Delete), Subscription(Event)
โ ์ง์์ด(query language)
์ง์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด ์์คํ ์ ์ง์๋ฅผ ํ ์ ์๊ฒ ํ๋ ๊ณ ๊ธ ์ปดํจํฐ ์ธ์ด Ex. GraphQL, SQL
REST API vs GraphQL
๊ณตํต์
HTTP ํต์
HTTP : ํ ์คํธ, html์ ์ ์กํ๋ ๋๊ตฌ โ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด์ ํ ์คํธ๋ก ํ๊ธฐ (JSON)
JSON : ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด ํ๊ธฐ๋ฒ
๊ตฌ์ฑ
ํค๋ : ์์ฝ ์ ๋ณด (โ๏ธํธ์ง๋ดํฌ)
๋ณด๋ด๋ ์ด, ๋ณด๋ด๋ ๋ด์ฉ ํํ
๋ฐ๋ : ์ฃผ๊ณ ๋ฐ์ ๊ฐ์ฒด๊ฐ ๋ค์ด์์
์ฐจ์ด์
๋๊ท๋ชจ ์ ์์ ์ฒ๋ฆฌ
์ด๋ ค์
์ฌ์
ํํ
์ฃผ์ https://naver.com/board/1
ํจ์ board(1)
์๋ต ๋ฐ์ดํฐ
๋ชจ๋ ๋ฐ์ดํฐ
ํ์ํ ๋ฐ์ดํฐ๋ง ๊ณจ๋ผ์ ์๋ต โ ๋น์ฉ์ ๊ฐ
API์ ์ ์ก์ ์์ฒญํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
axios
apollo-client
API ํ ์คํธ
API ๋ช ์ธ์
GraphQL์ ํ ์คํธ์ ๋ช ์ธ์๊ฐ ํฉ์ณ์ ธ ์์ด์ ํธ๋ฆฌ
3. JSON
JSON
JSON(JavaScript Object Notation)
Javascript ๊ฐ์ฒด ๋ฌธ๋ฒ์ผ๋ก ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ํํํ๊ธฐ ์ํ ํ์ค ํฌ๋งท ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ ํฌ๋งท ์ค ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ํธํ์ฑ์ด ์ข์ ๋๊ธ๋ผ์ค ํฌ๋กํฌ๋๊ฐ ๋ง๋ฆ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ํ์ ์ธ ๋ฌธ์์ด, ์ซ์, ๋ฐฐ์ด, ๋ถ๋ฆฌ์ธ, ๋ค๋ฅธ ๊ฐ์ฒด, null ํฌํจ ๊ฐ๋ฅ
์ฅ์
ํ ์คํธ๋ก ๊ตฌ์ฑ๋์ด, ์ฌ๋๊ณผ ์ปดํจํฐ ๋ชจ๋ ์ฝ๊ณ ์ฐ๊ธฐ ์ฌ์
ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํ๋ซํผ์ ๋ ๋ฆฝ์ โ ์๋ก ๋ค๋ฅธ ์์คํ ๊ฐ ๊ฐ์ฒด๋ฅผ ๊ตํํ๊ธฐ ์ฉ์ด (์ธ์ด๊ฐ ๋ฌ๋ผ๋ ์ํต ๊ฐ๋ฅ)
api, config ํ์ผ์ ํ์ฉ
๊ฐ๋ฒผ์
์ฃผ์์
key - value ๋ง ๋ด์ ์ ์์
"ํฐ ๋ฐ์ดํ๋ง ์ฌ์ฉ"
undefined ๋ถ๊ฐ
๋ฉ์๋ ๋ถ๊ฐ
XML
XML(Extensible Markup Language)
๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋ ๊ท์น์ ์ ๊ณตํ๋ ๋งํฌ์ ์ธ์ด ๋ฐ์ดํฐ๋ฅผ ๋ํ๋ด๋ ํฌ๋งท ์ค ํ๋ <> ํ๊ทธ ๊ธฐ๋ฐ </>
JSON vs XML
XML์ด ๋ ๋ฌด๊ฑฐ์ (๊ธ์ ์๊ฐ ๋ง์)
XML์ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ธ์ ํธ๋ก ๋ณํํ๊ธฐ ๋ณต์ก
JSON์ ๊ฒฝ์ฐ, JSON.parse ์ด์ฉ
XML์ ํ๊ทธ๋ ์ด๋ฆ์ด ์ ํด์ ธ ์์ง ์์ (HTML๊ณผ์ ์ฐจ์ด์ )
๋ฌด๊ฒ
๊ฐ๋ฒผ์
๋ฌด๊ฑฐ์
JS ํธํ์ฑ
์ข์ JSON.parse
๋์จ ์ค๋ธ์ ํธ๋ก ๋ณํํ๊ธฐ ๋ณต์ก
ํ๊ทธ ์ด๋ฆ
์ด๋ฆ์ด ์ ํด์ ธ ์์
์ด๋ฆ์ด ์ ํด์ ธ ์์ง ์์
4. DSL(Domain-Specific Language)
๋๋ฉ์ธ ํนํ ์ธ์ด(Domain-specific language) ํน์ ํ ๋๋ฉ์ธ์ ์ ์ฉํ๋๋ฐ ํนํ๋ ์ปดํจํฐ ์ธ์ด Ex. HTML(Web)
FE๋ BE์์ ๋๊ฒจ์ค ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋๋ก UI๋ฅผ ๊ตฌ์ฑ React๋ ์ ์ธํ(HTML๊ณผ ์ ์ฌํ ๋ชจ์์ DSL์ ์ฌ์ฉ)์ผ๋ก UI๋ฅผ ๊ตฌ์ฑํ ์ ์์
๐ก ์ ์ธํ์ผ๋ก ๋ง๋ค ์ ์์ โ ๋ด๋ถ ๋ด์ฉ์ด ๋ฐ๋์์ ๋ ์๋์ผ๋ก ์ ๋ฐ์ดํธ
5. ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
๋ฐ๋ก ๋ชฉ์ ์์ , ๋ชฉํ๋ฅผ ๋ช ์ โ ์์ธก ๊ฐ๋ฅํ๊ณ ๋๋ฒ๊น ์ฉ์ด
Ex. React
โ React์ ํน์ง ์ค ํ๋ React๋ ์ ์ธ์ API๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ฐฑ์ ์ด ๋ ๋๋ง๋ค ๋งค๋ฒ ๋ฌด์์ด ๋ฐ๋์๋์ง๋ฅผ ๊ฑฑ์ ํ ํ์๊ฐ ์์ ์ผ์ผ์ด ๋ณํ๋ ๋ถ๋ถ์ ์ง์ ํด ๋ฐ๊ฟ์ฃผ๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ๋ ๊ฒ ๋๋๋ก ์ ์ธ โ ์ปดํฌ๋ํธ์ ๊ฐฑ์ ์ด ์์ธก ๊ฐ๋ฅํด์ง๊ณ , ๋น ๋ฅธ ์ฑ์ ๋ง๋ค ์ ์์
React์ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
JSX๋ React.createElement๋ฅผ ์ฌ์ฉํ๋๋ก ์๋ฐ์คํธ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ณํ ๋ณํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ Virtual DOM ํธ๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ฃผ๊ณ , VDOM๊ณผ ํ๋ฉด์ ๋น๊ตํด์ ๋ฐ๋ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธํ๋ ์ฌ์กฐ์ ๊ณผ์ ์ด ๋ฐ์ React ๋ด๋ถ์์๋ ๋น๊ต (diffing) ์๊ณ ๋ฆฌ์ฆ์ ํตํด ๋ฌด์์ด ๋ณ๊ฒฝ๋์๋์ง ๊ณ์ฐ์ด ์ผ์ด๋จ ์ด๋ฌํ ์ ๊ทผ๋ฐฉ์์ ํตํด React์ ์ ์ธ์ API๊ฐ ๊ฐ๋ฅํด์ง
6. ๋ช
๋ นํ ํ๋ก๊ทธ๋๋ฐ
์ ์ฐจ๋ฅผ ์ผ์ผ์ด ๋์ด, ์คํํ ์๊ณ ๋ฆฌ์ฆ์ ๋ช ์
Ex. jQuery, C, JAVA
7. React component ์ props
Component-Based
โ React์ ํน์ง ์ค ํ๋
Build encapsulated components that manage their own state, then compose them to make complex UIs. ์ค์ค๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ์บก์ํ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋์ธ์. ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์กฐํฉํด ๋ณต์กํ UI๋ฅผ ๋ง๋ค์ด๋ณด์ธ์. โ ๊ฐ๋จํ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ์์ ๋ณต์กํ UI๋ฅผ ์กฐ๋ฆฝ
์์ ์ปดํฌ๋ํธ=๋ถํ์ ๋ง๋ค์ด์ ์กฐ๋ฆฝ ์กฐํฉ์ ๊ฐ์ง์๋ฅผ ํญ๋ฐ์ ์ผ๋ก ๋๋ฆด ์ ์๋ ๊ฐ์ฅ ์ ํ์ ์ธ ๋ฐฉ๋ฒ โ๏ธ ์กฐํฉํ๋ ๋ฐฉ์์ ๋ฐ๋ผ ์ ์ ๋ถํ๋ง ๊ฐ์ง๊ณ ๋ ๋ค์ํ๊ฒ ๋ง๋ค ์ ์์
์ปดํฌ๋ํธ๋ฅผ ๋๋๋ ๊ธฐ์ค
SRP (Single Responsibility Principle)
์ปดํฌ๋ํธ๊ฐ ๋๋ฌด ์ปค์ง ๊ฒฝ์ฐ ๋ถ๋ฆฌ๊ฐ ํ์ (์ฑ ์์ด ๋ง๊ณ , ์ฝ๋๊ฐ ๊ธธ์ด์ง ๋)
CSS
์ด๋ฏธ ์๊ณ ์๋ ๊ธฐ์ค์ ์ฌํ์ฉ
Designโs Layer (๋์์ธ ์ธก๋ฉด)
๋ ์ด์ด๋ ํธ๋ฆฌ ํํ๋ก ์ด๋ฃจ์ด์ง
Information Architecture (JSON Schema์ ์ํฅ)
์ค์ ๋ก ์์ฒญ ๋ง์ด ์ฌ์ฉ
์์ฐ์ค๋ฌ์ด SRP๋ฅผ ์ํด์ ์ฌ์ค์ ๊ฐ์ ๋จ
Extract Function
๐ ๋งํด ํ์ธ๋ฌ <๋ฆฌํฉํ ๋ง>
๋ฆฌํฉํ ๋ง์์ ์ธ ์ ์๋ ๊ธฐ๋ฒ
ํจ์ ์ถ์ถ์ SRP๋ฅผ ์ํด ์์ฃผ ์ฐ์ด๋ ๋ฐฉ๋ฒ ์ค ํ๋ ๋ณํ์ ํฌ๊ธฐ(์ํฅ ๋ฒ์)๋ฅผ ์ ์ฝ
์ผ๋จ ๊ธธ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ์ ์ ํ ์๋ฅผ ์ ์๋ ๋ถ๋ถ์ด ๋ณด์ผ ๋ ํจ์๋ก ์ถ์ถ
์ฝ๋๋ฅผ ์์ฑํ๊ธฐ ์ด๋ ค์ด ์ํฉ์ ์ง๋ฉดํ์ ๋ ํจ์๋ก ์ถ์ถ
๐ก ๋ฐ๋ก ๋ค๋ฅธ ํ์ผ์ ๋ง๋ค์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์๋ ๋จ ์ปดํฌ๋ํธ๋ฅผ ๋๋๋ ๊ธฐ์ค์ด ์ ๋งคํ๋ฉด ๋ค์ ํ๋์ ์ปดํฌ๋ํธ๋ก ํฉ์ณค๋ค๊ฐ(Inline Method) ๋ค์ ๋๋ ์ค๋ ๋จ
Props
Passing Props to a Component Components์ Props
๋ชจ๋ React ์ปดํฌ๋ํธ๋ ์์ ์ props๋ฅผ ๋ค๋ฃฐ ๋ ๋ฐ๋์ ์์ ํจ์์ฒ๋ผ ๋์ํด์ผ ํ๋ค.
์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ, ๋๋ ์ง ์ปดํฌ๋ํธ๋ฅผ ์๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ ์ปดํฌ๋ํธ์ ์์ฒด props๋ฅผ ์์ ํ๋ฉด ์๋จ โ ๏ธ TypeScript๋ฅผ ์ ์ฐ๊ฑฐ๋ ์๋ชป ์ฐ๊ฒ ๋๋ ํฌ์ธํธ ์ค ํ๋ ์ ์ ํ ๊ท ํ์ ์ ์ก๋ ๊ฒ์ด ์ค์
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ์ ์ ๋ฌ
๊ฐ์ ์ด๋ฆ์ ๋ถ์ฌ์ ์ ๋ฌ
properties์ ์ค์๋ง
์ ์ , ๋์ ๋ฐ์ดํฐ(state), ์ปดํฌ๋ํธ ์ ๋ฌ ๊ฐ๋ฅ
์์ ์ปดํฌ๋ํธ์ props๊ฐ ๋ฐ๋ ๋๋ง๋ค, ๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ re-render ๋ ๋๋ง๋ค re-render๋จ
โ๏ธ ์์ ํจ์
๋์ผํ Input์ ๋ฐ์์ ๋, ํญ์ ๋์ผํ Output์ ๋ฐํํ๋ ํจ์
ํจ์ ์ฌ์ฉ ์, ํจ์ ๋ด์ ์ฌ์ด๋์ดํํธ๊ฐ ์์ด์ผ ํจ
8. SRP(๋จ์ผ ์ฑ
์ ์์น)
SRP (Single Responsibility Principle)
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๋จ์ผ ์ฑ ์ ์์น์ด๋ ๋ชจ๋ ํด๋์ค(React๋ ์ปดํฌ๋ํธ)๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ง๋ฉฐ, ํด๋์ค๋ ๊ทธ ์ฑ ์์ ์์ ํ ์บก์ํํด์ผ ํ๋ค๋ ์๋ฏธ ํ ํด๋์ค๋ฅผ ํ ๊ด์ฌ์ฌ์ ์ง์คํ๋๋ก ์ ์งํ๋ ๊ฒ์ ํด๋์ค๋ฅผ ๋์ฑ ํผํผํ๊ฒ ๋ง๋ฆ
์ฑ ์(Responsibility)์ ๋ณ๊ฒฝํ๋ ค๋ ์ด์ ๋ก ์ ์ํ๊ณ , ์ด๋ค ํด๋์ค๋ ๋ชจ๋์ ๋ณ๊ฒฝํ๋ ค๋ ๋จ ํ๋ ์ด์ ๋ง์ ๊ฐ์ ธ์ผ ํ๋ค.
ํด๋์ค : ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ ์ธ์ด์์ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ ์ ์๋ ๊ธฐ์ ์ค ํ๋
๊ด์ฌ์ฌ ๋ถ๋ฆฌ
๊ด์ฌ์ฌ ๋ถ๋ฆฌ(separation of concerns, SoC)๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ์ ๊ตฌ๋ณ๋ ๋ถ๋ถ์ผ๋ก ๋ถ๋ฆฌ์ํค๋ ๋์์ธ ์์น ๊ด์ฌ์ฌ๋ ํ๋ก๊ทธ๋จ ์ฝ๋์ ์ํฅ์ ๋ฏธ์น๋ ์ ๋ณด์ ์งํฉ์ด๋ฉฐ, ๊ฐ ๋ถ๋ฌธ์ ๊ฐ๊ฐ์ ๊ด์ฌ์ฌ๋ฅผ ํด๊ฒฐ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ ์ ๋ณด๋ฅผ ์ ์ ์๋ ์ธํฐํ์ด์ค๊ฐ ์๋ ์ฝ๋ ๋ถ๋ถ ์์ ์บก์ํ(์ ๋ณด ์จ๊ธฐ๊ธฐ์ ํ ์๋จ) ์ํด์ผ๋ก์จ ๋ฌ์ฑ ๊ณ์ธตํ๋ ๋์์ธ์ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ์ ๋ค๋ฅธ ๊ตฌํ (Ex. ํํ ๊ณ์ธต, ๋น์ฆ๋์ค ๋ก์ง ๊ณ์ธต, ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต, ํผ์์คํด์ค ๊ณ์ธต) ๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ ์ถ์ํ์ ์ผ์ข
์ฅ์
์ฝ๋์ ๋จ์ํ ๋ฐ ์ ์ง๋ณด์๊ฐ ์ฉ์ด (์ฌ์ฌ์ฉํ๊ธฐ ์ข์)
๋ค๋ฅธ ๋ถ๋ถ์ ์ธ์ธํ ์ฌํญ์ ๋ชจ๋ฅด๋๋ผ๋, ํ๋์ ๊ด์ฌ์ฌ์ ์ฝ๋ ๋ถ๋ถ์ ๊ฐ์ ํ๊ฑฐ๋ ์์ ํ ์ ์์
9. Atomic Design
์ฐ๋ฆฌ๊ฐ ์ ์๊ณ ์๋ ๊ณ์ธตํ ๊ตฌ์กฐ๋ฅผ ๋ช ๊ฐ์ง ์นดํ ๊ณ ๋ฆฌ๋ก ๋ฌถ์ ๋ฐฉ๋ฒ
์ด๋๋ก ํด์ผ ํ๋ค๊ฐ ์๋, ์ฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์ฌ์ฉํ๊ณ ์๋ ๋ฐฉ๋ฒ
๊ฐ๋ ์ ์ธ ๊ฒ
์์๋ค์ ๊ฐ์ง๊ณ ์ธ์์ ๊ตฌ์ฑํ๋ฏ ์ปดํฌ๋ํธ๋ฅผ ์ ์กฐํฉํด ์ํ๋ ๊ฒ์ ๋ง๋ค์๋ ์๋ฏธ
์ปดํฌ๋ํธ๋ฅผ ์๊ฒ ๋๋์๋ก atom์ ๊ฐ๊น์์ง
Last updated