๐Ÿ‰๊ธฐ์ˆ  ์Šคํƒ ํšŒ์˜ - boostcampwm-2022/web33-Mildo GitHub Wiki

1. ๊ฐœ์š”

  1. ์ผ์‹œ ๋ฐ ์žฅ์†Œ : 11.14.(์›”) 14:00 ~ 18:00, ๊ฒŒ๋”ํƒ€์šด
  2. ์ฐธ์—ฌ์ž : ์ „์›
  3. ๋ชฉ์  : ๊ธฐ๋Šฅ ๊ตฌํ˜„ ์ „ ๊ธฐ์ˆ  ์Šคํƒ ๊ฒฐ์ •
  4. ํšŒ์˜ ์ค‘์š”๋„ : ์ƒ

2. ๊ณ ๋ ค ์‚ฌํ•ญ

2.1. ํ”„๋ก ํŠธ์—”๋“œ ์Šคํƒ

2.1.1 React.js vs ๋ฐ”๋‹๋ผjs โ†’ React.js

  • ๋ฐ”๋‹๋ผjs ์‚ฌ์šฉ ์‹œ ์ƒํƒœ ๊ด€๋ฆฌ์—์„œ ์–ด๋ ค์›€์„ ๊ฒช์Œ
    • ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ๋ Œ๋”๋ง์ด ์ „์ฒด์ ์œผ๋กœ ์ผ์–ด๋‚˜ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•˜์ง€ ๋ชปํ•จ
    • ๋ฐ”๋‹๋ผjs ์‚ฌ์šฉ ์‹œ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋ถˆํŽธํ–ˆ์Œ
      • Class constructer์—์„œ async, await๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•จ
  • ๋ฐ”๋‹๋ผjs ์‚ฌ์šฉ ์‹œ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์ด ์–ด๋ ค์› ์Œ
    • ์ฝ”๋“œ ์ค‘๋ณต์ด ๋งŽ์•„ ์ž‘์—… ์‹œ๊ฐ„์ด ๊ธธ์—ˆ์Œ
  • React.js๋Š” ์ด๋ฏธ ์‚ฌ์šฉํ•ด๋ดค๊ธฐ ๋•Œ๋ฌธ์— ๊นŠ์ด ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Œ
    • 4์ฃผ์ฐจ์—์„œ ๋ฐฐ์šฐ์ง€ ๋ชปํ•œ ๋ถ€๋ถ„์„ ๋” ํ•™์Šตํ•  ์ˆ˜ ์žˆ์Œ
  • ๋งค์šฐ ์งง์€ ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„(4์ฃผ)
    • ๋ Œ๋”๋ง ์„ฑ๋Šฅ ๋“ฑ์„ ์•Œ์•„์„œ ์ฑ™๊ฒจ์ฃผ๋ฉด ์ข‹์Œ

2.1.2. ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ โ†’ jotai

  • ์ƒ์ค€
    • Jotai(๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ): ๋งํฌ
      • ๋ฆฌ๋ทฐ์–ด(์ด๋ฏธ๋ฆผ)๋ถ„๊ป˜์„œ ์ถ”์ฒœํ•ด์ฃผ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • Recoil์— ๋น„ํ•ด์„œ ๋‹จ์ˆœํ•˜๊ณ  ์‰ฌ์›€
      • Redux๋ฅผ ์จ๋ณธ ๊ฒฝํ—˜์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ƒ๋‹นํžˆ ๋ณต์žกํ–ˆ์Œ
      • ๋‹จ์ : ๋”ฐ๋กœ ๋ฐฐ์šธ ์‹œ๊ฐ„์ด ํ•„์š”ํ•จ, ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ๋งŽ์ด ๋ถ€์กฑํ•จ
    • Recoil
      • ์ƒˆ๋กœ์šด ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Œ
      • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ด์Šˆ๊ฐ€ ์žˆ์Œ
      • ์•„์ง๋„ 0๋ฒˆ๋Œ€ ๋ฒ„์ „์œผ๋กœ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ์ ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ
    • Context API
      • ๋ฆฌ์•กํŠธ ๋‚ด์žฅ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
      • Context API ๋‹จ์  : ๋“œ๋ฆด๋ง, ํ•˜์ง€๋งŒ ๊ณผ์—ฐ ์ด๋Ÿฐ ๋‹จ์ ์ด ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—์„œ ํฌ๊ฒŒ ์ž‘์šฉํ• ๊นŒ?
      • ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์—๋Š” ๋ชจ๋‹ฌ์ด ๋งŽ์Œ
        • ๊ด€๋ฆฌํ•ด์•ผ ๋  ์ƒํƒœ๊ฐ€ ๋งŽ์Œ
  • ์œค์šฐ
    • ์ƒ์ค€ ์˜๊ฒฌ์— ๊นŠ์ด ๋™๊ฐ
    • React Query
      • ๋น„๋™๊ธฐ ๋กœ์ง๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
        • ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ํฌ๊ฒŒ ์–ด๋ ค์›€์€ ์—†์„ ๋“ฏ
        • ๋‚˜์ค‘์— ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , ์šฐ์„ ์€ recoil์ด๋‚˜ jotai ์„ ํ˜ธ
  • ํ•œ๋นˆ
    • Redux
      • ์ƒํƒœ, ์•ก์…˜, ๋ฆฌ๋“€์„œ, ์Šคํ† ์–ด ๋“ฑ์˜ ๊ฐœ๋…์„ ํ†ตํ•ด ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์ด๋ค„์ง€๋Š” ๊ณผ์ •์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Œ
      • ๋ถˆ๋ณ€์„ฑ ์œ ์ง€ ๋•Œ๋ฌธ์— ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์Œ
      • ๋ฆฌ๋“€์„œ๋ฅผ ์งœ๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ
      • ๋‹ค๋งŒ, ์‚ฌ์šฉ๋ฒ•๋Œ€๋กœ ์“ฐ๋ฉด ์ž˜ ๊ตด๋Ÿฌ๊ฐ
    • Recoil
      • ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ž‘์•„์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ด์Šˆ ๋“ฑ์ด ํฌ๊ฒŒ ๋ฌธ์ œ๋˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Œ
      • ์‚ฌ์šฉ๋ฒ•์ด ๊ฐ„๋‹จํ•ด์„œ ์งง์€ ๊ธฐ๊ฐ„์— ์ ํ•ฉํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž„
  • ํ˜„์ •
    • Redux
      • Redux๋Š” ์‚ฌ์šฉ์„ ์œ„ํ•ด ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋งค์šฐ ๋งŽ์Œ
        • ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์š”์ฆ˜ ์ถ”์„ธ๋ž‘ ๋งž์ง€ ์•Š์Œ
      • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹œ Saga๋‚˜ Thunk๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ
        • Mildo๋Š” API ์š”์ฒญ์ด ๋งŽ์€๋ฐ ์‚ฌ์šฉ๋ฒ•์ด ๋ณต์žกํ•˜๊ณ  ์ฝ”๋“œ๋Ÿ‰์ด ๋Š˜์–ด๋‚จ
      • ์ผ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ ๋ฆฌ์•กํŠธ์™€ ๊ถํ•ฉ์ด ์ข‹์€์ง€ ๋ชจ๋ฅด๊ฒ ์Œ
    • Context API
      • ์‚ฌ์šฉ๋ฒ•์ด Redux์™€ ๊ฑฐ์˜ ๋น„์Šทํ•˜์—ฌ ๋น„๊ต ์šฐ์œ„๊ฐ€ ์—†์Œ
      • recoil ๋Œ€๋น„ ์žฅ์ ์„ ๋ชจ๋ฅด๊ฒ ์Œ
    • Recoil
      • ๋น„๋™๊ธฐ ์ง€์›์ด ๋” ํŽธํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž„
    • Jotai
      • ํ•œ๋ฒˆ๋„ ์•ˆ ์จ๋ด์„œ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Œ
  • ์ตœ์ข… ๊ฒฐ์ •(๋ธ”๋กœ๊ทธ)
    • jotai โ†’ ์„ ์ •
      • TS๋กœ ๋งŒ๋“ค์–ด์ง
      • 1๋ฒˆ๋Œ€ ๋ฒ„์ „์ด ์ถœ์‹œ๋จ
      • jotai๋Š” ๋‹ค์šด๋กœ๋“œ ์ˆ˜๊ฐ€ ์ ๊ณ  ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ๋งŽ์ด ์—†์Œ
      • recoil๋ณด๋‹ค๋„ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•
      • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋” ์‰ฌ์›Œ ๋ณด์ž„
    • recoil
      • JS๋กœ ๋งŒ๋“ค์–ด์ง
      • ์•„์ง๋„ 0๋ฒˆ๋Œ€ ๋ฒ„์ „
      • ์บ์‹ฑ์ด ๊ฐ€๋Šฅํ•จ
      • ์„œ๋ฒ„ ์š”์ฒญ ๋กœ์ง๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์Œ
    • ๊ธฐํƒ€
      • jotai์™€ recoil์€ ๋ฌธ๋ฒ•์ด ๋น„์Šทํ•จ
      • jotai์™€ zustand๋Š” ๋กœ ์•„๋ฌด๊ฒƒ๋„ ๊ฐ์‹ธ์ง€ ์•Š์•„๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
      • bundle ํฌ๊ธฐ : zustand < jotai < recoil
      • jotai์—์„œ ๋ฌธ์ œ ์ƒ๊ธฐ๋ฉด recoil๋กœ ๋ฐ”๋กœ ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ์Œ(์ฐจ์„ ์ฑ…์ด ๋งˆ๋ จ๋˜์–ด ์žˆ์Œ)
  • react-query (์ถ”ํ›„ ๋…ผ์˜)
    • Mildo๋Š” ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๋งŽ์Œ
    • ์„œ๋ฒ„ ์š”์ฒญ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • ๊ทธ๋Ÿฌ๋‚˜ ์ธ๊ธฐ๊ฐ€ ๋งŽ๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ์‚ฌ์šฉํ•ด๋ณด๋Š” ๊ฒƒ์ด ๋งž๋Š”์ง€?

2.1.3. ์Šคํƒ€์ผ โ†’ Styled-Component

  • SASS/CSS
  • CSS in JS (Styled-Component, Emotion)
    • ์ต์ˆ™ํ•จ
    • SSR์—๋Š” Emotion์ด ๋” ์ ํ•ฉ
  • CSS module (A.jsx, A.module.css)
    • ํด๋ž˜์Šค๋ช…์ด ๊ธฐ์–ต์ด ์•ˆ๋‚จ
  • Tailwind CSS / Chakra UI
    • ๋ชป์ƒ๊ธด ์ฝ”๋“œ

2.2. ๋ฐฑ์—”๋“œ

2.2.1. DB โ†’ MongoDB

  • ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๊ฐ€ ๋А์Šจํ•  ๊ฒƒ ๊ฐ™์•„ NoSQL๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Œ
    • ๋„์‹œ ๋ฐ์ดํ„ฐ API๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งŽ์€๋ฐ RDBMS์˜ ํ…Œ์ด๋ธ”๋ณด๋‹ค JSON ํ˜•์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•  ์ˆ˜ ์žˆ์Œ
    • ๋˜ํ•œ, ๋„์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœ read ์†๋„๊ฐ€ ๋น ๋ฅธ NoSQL์ด ๋‚˜์„ ์ˆ˜ ์žˆ์Œ
  • SQL ์‚ฌ์šฉ ์‹œ ๋„์‹œ ๋ฐ์ดํ„ฐ๋Š” NoSQL, ์‚ฌ์šฉ์ž ์ •๋ณด๋‚˜ ์žฅ์†Œ ์ •๋ณด๋Š” SQL๋กœ ๊ด€๋ฆฌํ•˜๋ฉด ์ข‹์„ ๋“ฏ
  • MongoDB ์‚ฌ์šฉ ์‹œ odm์œผ๋กœ mongoose ์‚ฌ์šฉ
  • MongoDB๊ฐ€ node.js์™€ ๊ถํ•ฉ์ด ์ข‹์Œ
    • ๋‹จ์ˆœํ•œ I/O ์ž‘์—…์„ ๋นจ๋ฆฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ
    • Non-Blocking + Async + ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ ๋” ํšจ์œจ์ 
    • I/O์˜ ์ฒ˜๋ฆฌ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜๋ฉด RDBMS๋ฅผ ์‚ฌ์šฉ
  • ์œ ์ €, ์žฅ์†Œ โ†’ ๋ถ๋งˆํฌ, ๋‚ด์ผ ๊ฐˆ ๊ฑฐ์•ผ๋Š” ๊ด€๊ณ„ ์„ค์ •์ด ํ•„์š”ํ• ๊นŒ?
    • ์ผ๋‹จ ๊ตฌํ˜„ ๊ณผ์ •์—์„œ ํ™•์ธํ•˜์ž
    • ๊ด€๊ณ„ ์„ค์ •์ด ํ•„์š”ํ•  ์‹œ mongoose์˜ populate ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
      • ์ด ๊ฒฝ์šฐ์—๋Š” ํ•˜์œ„ ๋‹คํ๋จผํŠธ๋ฅผ ๋‹ค ์ฐพ์•„์•ผ ํ•ด์„œ ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Œ

2.2.2. Nginx, ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ

  • ๋ณด์•ˆ์„ฑ ์ธก๋ฉด์—์„œ ์ข‹์Œ
    • https ์‚ฌ์šฉ
  • ์จ์„œ ๋‚˜์  ๊ฑด ์—†์Œ

2.2.3. ๋ฐฑ์—”๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ โ†’ koa

  • koa
    • ๋ฏธ๋“ค์›จ์–ด ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•ด์„œ ๊ฐ€๋ฒผ์›€
      • Mildo์˜ ๋ฐฑ์—”๋“œ๋Š” api ๋ฐ›์•„์™€์„œ serving๋งŒ ํ•จ
      • ssr์„ ์•ˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…œํ”Œ๋ฆฟ ๊ธฐ๋Šฅ ํ•„์š” ์—†์Œ
    • req, res๋ฅผ ํ•ฉ์ณ์„œ ctx๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ๋ฒ•์ ์œผ๋กœ ํŽธํ•จ
    • async-await์„ ๊ณต์‹์ ์œผ๋กœ ์ง€์›ํ•จ
      • Mildo๋Š” api ์š”์ฒญ์ด ๋งŽ์„ ๊ฒƒ์œผ๋กœ ๋ณด์ž„
      • ์ฝœ๋ฐฑ ์ง€์˜ฅ ํƒˆ์ถœ ๊ฐ€๋Šฅ
    • ๋‹ค๋งŒ, express ๋Œ€๋น„ ์ฐธ๊ณ  ์ž๋ฃŒ๊ฐ€ ๋งŽ์ด ์—†์Œ
  • express
    • ๋ฏธ๋“ค์›จ์–ด, ๋ผ์šฐํŒ…๋งŒ ํ•„์š”ํ•œ๋ฐ express๋Š” ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋„ ๋งŽ์Œ
    • async-await ์—๋Ÿฌ ์ฒ˜๋ฆฌ์—์„œ ์–ด๋ ค์›€์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ

2.3. ๊ณตํ†ต

2.3.1. CSR vs SSR โ†’ CSR

  • Mildo์˜ ํŠน์ง•
    • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋А๋‚Œ์œผ๋กœ, ๋ ˆ์ด์•„์›ƒ์ด ๊ณ ์ •๋˜์–ด ์žˆ์Œ
    • ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋งŒ ์กด์žฌํ•˜๊ณ , ๋ถ€๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์€ ๋ชจ๋‘ ๋ชจ๋‹ฌ๋กœ ๊ตฌํ˜„
      • ๋งค๋ฒˆ html์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ๋ณด๋‹ค csr๋กœ ํ•ด๋‹น ๋ถ€๋ถ„๋งŒ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์ง€ ์•Š์„๊นŒ?
    • ๋ณด์•ˆ ๊ด€๋ จ
      • ์„œ์šธ์‹œ ๋„์‹œ ๋ฐ์ดํ„ฐ API๋Š” ์›๋ž˜ ๊ณต๊ฐœ๋˜์–ด ์žˆ์Œ
      • ๋กœ๊ทธ์ธ์€ ๋„ค์ด๋ฒ„ Oauth๋กœ ๊ตฌํ˜„ํ•˜๋‹ˆ๊นŒ ๋ณ„๋„์˜ ๋ณด์•ˆ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Œ
    • ์„œ๋ฒ„์—์„œ API ์š”์ฒญ์ด ๋งŽ์€ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ
      • ์„œ๋ฒ„์—์„œ crontab, node-cron ๋“ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์ง€์†์ ์œผ๋กœ ์„œ์šธ์‹œ ๋„์‹œ ๋ฐ์ดํ„ฐ API ์š”์ฒญ
      • API ๋ถˆ๋Ÿฌ์˜ค๋Š” ์‹œ๊ฐ„์— โ€˜๋กœ๋”ฉ ์ค‘โ€™ ํ™”๋ฉด ๋ณด์—ฌ์ค˜์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Œ
  • CSR(SPA)
    • ํ•˜๋‚˜์˜ html ํŒŒ์ผ ์‚ฌ์šฉ
      • html์„ ํด๋ผ์ด์–ธํŠธ์—์„œ ์กฐ๋ฆฝ
    • ์ดˆ๊ธฐ ๋ Œ๋”๋ง ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ
    • ๋ถ€๋ถ„ ๋ Œ๋”๋ง์— ๋” ์ตœ์ ํ™”
  • SSR
    • CSR ๋Œ€๋น„ ์ดˆ๊ธฐ ๋ Œ๋”๋ง์ด ๋น ๋ฅด๊ณ  ๋ณดํŽธ์ ์œผ๋กœ ๋ผ์ดํŠธํ•˜์šฐ์Šค ์Šค์ฝ”์–ด๊ฐ€ ๋†’์„ ๊ฐ€๋Šฅ์„ฑ
    • ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์— ์œ ๋ฆฌ
      • CSR์˜ ๊ฒฝ์šฐ ๊ฒ€์ƒ‰ ํฌ๋กค๋Ÿฌ๊ฐ€ js๋ฅผ ๋™์ž‘์‹œํ‚ค์ง€ ์•Š์•„ ๋นˆ ํŽ˜์ด์ง€๋กœ ์ธ์‹๋  ์ˆ˜ ์žˆ์Œ
      • ๋ Œ๋”๋ง์ด ๋” ๋น ๋ฆ„
    • CSR ๋Œ€๋น„ ์„œ๋ฒ„์—์„œ ๋” ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉ
      • html์„ ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด์„œ ๋ณด๋‚ด์คŒ
    • ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง
    • Next.js ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋Ÿฌ๋‹์ปค๋ธŒ ๋ฐœ์ƒ

2.3.2. JS vs TS โ†’ TS

  • TypeScript(์ƒ์ค€, ํ˜„์ •, ์œค์šฐ)
    • ํƒ€์ž…์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ฒดํฌํ•ด์„œ ํ˜‘์—… ์‹œ ์ข‹์Œ
    • Mildo์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” API ๋ฐ์ดํ„ฐ๋Š”(๋ฐ€๋„, ์ธ๊ตฌ์ˆ˜, ์œ„๋„, ๊ฒฝ๋„ ๋“ฑ) ์ˆซ์ž ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์Œ
    • ์•ฑ ์ž์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฟŒ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์ฃผ ๊ธฐ๋Šฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Œ

2.3.3. ํ…Œ์ŠคํŠธ

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
    • ์ข…๋ฅ˜
      • Jest
      • Mocha
    • ๊ตณ์ด ํ•  ํ•„์š”๊ฐ€ ์žˆ์„๊นŒ..? ํ™ฉ์ค€์ผ ๋งˆ์Šคํ„ฐ๋‹˜๋„ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ž˜ ์•ˆ ํ•œ๋‹ค๋Š” ๋“ฏ์ด ๋งํ•˜์…จ์Œ
    • ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ Jest + RTL
  • ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ
    • Cypress
      • ์žฌ๋ฐŒ์„ ๊ฒƒ ๊ฐ™๋‹ค.
  • UI ํ…Œ์ŠคํŠธ
    • storybook
  • ์ธ์ˆ˜ ํ…Œ์ŠคํŠธ, UI ํ…Œ์ŠคํŠธ๋Š” ๋งˆ์ง€๋ง‰ ์ฃผ์— ๋ชฐ์•„์„œ ํ•˜์ž.

2.3.4. CI/CD

  • Github Actions
  • ๋งค๋ฒˆ ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ์ฝ”๋“œ ์ˆ˜์ •์„ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆํŽธํ•˜๊ณ  ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ž๋™ํ™”ํ•˜์—ฌ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Œ

2.3.5. Docker, k8s

  • Docker
    • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐœ๋ฐœํ™˜๊ฒฝ, ๋ฐฐํฌํ™˜๊ฒฝ์„ ํ†ต์ผ์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์คŒ
  • k8s
    • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ๋„๊ตฌ
  • Docker๋Š” ๋ถ„ํ• ํ•ด์„œ ๋ฐฐํฌํ•  ๋•Œ ์žฅ์ ์ด ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.
  • ์ˆ˜์š”์ผ๊นŒ์ง€ ๊ณต๋ถ€ํ•˜๊ณ  ์ƒ์˜

2.3.6. ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„(WebServer) / API ์„œ๋ฒ„ ๋‚˜๋ˆ„๊ธฐ(WAS)

  • ์„œ๋ฒ„ ๋ถ€ํ•˜ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ
    • ์ •์  ์ปจํ…์ธ ๋Š” WS๊ฐ€ ์ œ๊ณตํ•˜๊ณ  ๋™์  ์ปจํ…์ธ ๋Š” WAS๊ฐ€ ์ œ๊ณต
    • ๋งŒ์•ฝ ์ •์  ์ปจํ…์ธ ๋„ WAS๊ฐ€ ์ œ๊ณตํ•œ๋‹ค๋ฉด ๋™์  ์ปจํ…์ธ  ์ฒ˜๋ฆฌ๊ฐ€ ์ง€์—ฐ๋จ์— ๋”ฐ๋ผ ์ˆ˜ํ–‰์†๋„๊ฐ€ ๋А๋ ค์ง
  • WAS์˜ ํ™˜๊ฒฝ์„ค์ • ํŒŒ์ผ์„ ์™ธ๋ถ€์— ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
    • ํด๋ผ์ด์–ธํŠธ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ํฌํŠธ๊ฐ€ ์ง์ ‘ WAS์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ค‘์š”ํ•œ ์„ค์ • ํŒŒ์ผ๋“ค์ด ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Œ
    • WS์™€ WAS๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ์ ‘๊ทผํ•˜๋Š” ํฌํŠธ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉํ™”๋ฒฝ์„ ์ณ์„œ ๋ณด์•ˆ ๊ฐ•ํ™” ๊ฐ€๋Šฅ
  • ์—ฌ๋Ÿฌ ๋Œ€์˜ WAS ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
    • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ๊ฐ€๋Šฅ โ†’ ํฌ๋กค๋ง์„ ๋‹ค๋ฅธ ์„œ๋ฒ„๋กœ ํŒ๋‹ค๋ฉด ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Œ
    • ์žฅ์•  ๊ทน๋ณต ๊ฐ€๋Šฅ

2.3.7. ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €(์˜์กด์„ฑ ๊ด€๋ฆฌ ํˆด) โ†’ Yarn classic

  • ๋ชจ๋…ธ๋ ˆํฌ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ• ๊นŒ? โ†’ ์ฐธ๊ณ 
  • ๋งŒ์•ฝ์— ๋ชจ๋…ธ๋ ˆํฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” Lerna + Yarn์ด ์–ด๋–จ๊นŒ..
  1. npm
    • ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ํฌ๊ธฐ๊ฐ€ ์ž‘์œผ๋ฏ€๋กœ npm๋„ ๋‚˜์˜์ง€ ์•Š์„ ๋“ฏ
  2. yarn
    • ๋ณด์•ˆ, ์ผ๊ด€์„ฑ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅ
    • Native ๋ชจ๋…ธ๋ ˆํฌ ์ง€์›
    • ์ƒˆ๋กœ์šด lock ํŒŒ์ผ ํ˜•์‹
    • ์ƒˆ๋กœ์šด ๋ฒ„์ „ yarn berry ๋“ฑ์žฅ
    • ๋ฆฌ์•กํŠธ ์„ค์น˜ ์‹œ npm์€ 3.5์ดˆ, yarn์€ 1.4์ดˆ
    • npm๊ณผ ๋น„์Šทํ•ด์„œ ๋Ÿฌ๋‹์ปค๋ธŒ๊ฐ€ ๊ฑฐ์˜ ์—†์Œ
  3. yarn berry
    • ์—๋Ÿฌ ๋งŽ์ด ๋‚œ๋‹ค๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์˜๊ฒฌ
    • Yarn classic์— ํ˜ธํ™˜๋˜์ง€ ์•Š์Œ
    • Plug n play & Zipfs๋ฅผ ์ด์šฉํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ
    • ํ”Œ๋Ÿฌ๊ทธ์ธ ์นœํ™”์ 
    • Monorepo๋ฅผ ์œ„ํ•œ workspace ๊ธฐ๋Šฅ ๊ฐ•ํ™”
  4. pnpm
    • Performant npm์˜ ์ค„์ž„๋ง
    • ํ”Œ๋žซํ•˜์ง€ ์•Š์€ node_modules ๊ตฌ์กฐ
    • ํ•˜๋“œ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•ด ํ•˜๋“œ๋””์Šคํฌ ์šฉ๋Ÿ‰ ์ ˆ์•ฝ
    • ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ํƒ์ƒ‰

2.3.8. ๋ฒˆ๋“ค๋ง ๋„๊ตฌ โ†’ โ˜…๋น„๊ต๋ฅผ ์œ„ํ•ด cra์™€ vite๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•ด๋ณด๋ฉด ์ข‹์„๋“ฏ

  • ๊ฑฐ์˜ ํ•œ ํŽ˜์ด์ง€ ์•ˆ์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ ๋ฒˆ๋“ค๋ง ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•จ
  • ์ฐธ๊ณ 
  1. Vite
    • ๋น ๋ฅด๋‹ค
      • Go ์–ธ์–ด ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— CRA๋ณด๋‹ค ๋น ๋ฅด๋‹ค.
      • CRA๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋А๋ฆฌ๋‹ค.
    • CRA์—์„œ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๋Š” ์„ค์ •์„ ๋ณ„๋„๋กœ ํ•ด์•ผํ•จ
      • ๋‹ค๋งŒ, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฐ€๋Šฅ(https://zih0.tistory.com/44)
      • ํ† ์ด ํ”„๋กœ์ ํŠธ์—์„œ๋„ ๊ฑฐ์˜ 2๋ฐฐ๊ฐ€ ๋น ๋ฅธ ์„ฑ๋Šฅ์„ ๋ณด์ด๋ฏ€๋กœ, ๊ทœ๋ชจ๊ฐ€ ์ž‘์€ ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™์Œ
    • CRA๋ฅผ ์•ˆ ์ผ์„ ๋•Œ ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฌด์—‡์„ ๊น”์•„์•ผ ํ•˜๋Š”์ง€ ํ•™์Šตํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋จผ์ € CRA๋ฅผ ์“ฐ๊ณ  Vite๋ฅผ ๊ฒฐํ•ฉํ•˜์ž
  2. CRA
    • ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ
    • ๋‹ค๋งŒ, ๋„ˆ๋ฌด ํŽธํ•จ

2.3.9. Prettier, esLint

  • esLint, prettier
    • ๋„ค์ด๋ฒ„ ์ปจ๋ฒค์…˜์—์„œ ํ•„์š”ํ•œ ๊ฒƒ๋งŒ ์ถ”๊ฐ€/๋ณ€๊ฒฝ โ†’ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๋ถ€๋ถ„์€ โ€˜์‚ญ์ œโ€™
โš ๏ธ **GitHub.com Fallback** โš ๏ธ