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