๐Ÿš‹ ๋ฐ๋ชจ_4์ฃผ์ฐจ - boostcampwm-2022/web33-Mildo GitHub Wiki

1. ํ”„๋กœ์ ํŠธ ๋ช… : Mildo(๋ฐ€๋„)

  • ๋ฐ˜์‘ํ˜• ์›น ํ™˜๊ฒฝ์—์„œ ์„œ์šธ์‹œ ์‹ค์‹œ๊ฐ„ ์ธ๊ตฌ ๋ฐ€๋„ ์ •๋ณด๋ฅผ ์ œ๊ณต์„ ๋ชฉํ‘œ

2. ์ง€๋‚œ ์ฃผ ์ง„ํ–‰ ๋‚ด์šฉ

  1. ๋„ค์ด๋ฒ„ ์ง€๋„ UI ๋ถ€๋ถ„์ ์œผ๋กœ ๊ตฌํ˜„ ๋ฐ ์ง€๋„ ๋ฐ˜๊ฒฝ ์„œ์šธ ๋‚ด๋กœ ์ œํ•œํ•˜๊ธฐ
  2. ๋กœ๋”ฉ ํ™”๋ฉด ๊ตฌํ˜„
  3. ์ƒ์„ธ ๋ชจ๋‹ฌ 1๋‹จ๊ณ„์™€ 2๋‹จ๊ณ„ UI
  4. ์ธ๊ตฌ ๋ฐ€๋„์— ๋”ฐ๋ฅธ ํ•€(๋งˆ์ปค) ์ถœ๋ ฅ

3. ์ด๋ฒˆ ์ฃผ ๋ชฉํ‘œ

  1. ์„œ์šธ์‹œ ์ธ๊ตฌ ๋ฐ€๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” cron ์„œ๋ฒ„ ๊ตฌ์ถ•

    a. ํ˜„์žฌ ์ธ๊ตฌ๋ฐ€๋„ ํ•€์ด ์‹ค์‹œ๊ฐ„์ด ์•„๋‹Œ ํ…Œ์ŠคํŠธ์šฉ ๋„์‹œ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์Œ

    b. ์„œ์šธ ์ธ๊ตฌ ๋ฐ€๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ €์žฅํ•˜์—ฌ ์‹ค์‹œ๊ฐ„ ์„œ์šธ ์ธ๊ตฌ ๋ฐ€๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ์šฉ๋˜๋„๋ก ํ•จ

  2. ์ตœ๊ทผ 24์‹œ๊ฐ„ ์ธ๊ตฌ ๋ฐ€๋„ Redis๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์บ์‹ฑ

    a. ๊ฐ ์ง€์—ญ์— ๋Œ€ํ•ด ๋งค๋ฒˆ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ mongoDB์— ์š”์ฒญํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ์— ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•จ

  3. ์ธ๊ตฌ ๋ฐ€๋„๋ณ„ ์ง€๋„ ํ•€์„ ํ•„ํ„ฐ๋งํ•˜๋Š” ๊ธฐ๋Šฅ

    a. ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ธ๊ตฌ ๋ฐ€๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

  4. https ์ ์šฉํ•˜๊ธฐ

    a. https๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์œ„์น˜ ํ—ˆ์šฉ ์—ฌ๋ถ€์™€ ๊ด€๋ จ๋œ ๋ถ€๋ถ„์„ ๋ฌผ์–ด๋ณด์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ๋ฌผ์–ด๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” https๋ฅผ ์ ์šฉํ•ด์•ผ ๋จ

4. ์ด๋ฒˆ ์ฃผ ์ง„ํ–‰ ๋‚ด์šฉ

image

4์ฃผ์ฐจ project burn up ์ฐจํŠธ

4.1. ํŽ˜์–ด ๊ฐœ๋ฐœ (์›”~์ˆ˜)

ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๊ฐœ๋ฐœ์šฉ, ๋ฐฐํฌ์šฉ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์„ค์ •

  • ์ง€๋‚œ ์ฃผ ๋ฐฐํฌํ•˜๋ฉด์„œ ์ˆ˜๋™์œผ๋กœ ๋ฐ”๊พธ์–ด์ค˜์•ผ ํ–ˆ์–ด์„œ ๋งค์šฐ ๋ถˆํŽธํ–ˆ์Œ
  • ๊ฐœ๋ฐœ์šฉ, ๋ฐฐํฌ์šฉ์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ๊ฐ์— ๋Œ€ํ•œ ์‹คํ–‰์Šคํฌ๋ฆฝํŠธ๋ฅผ ์„ค์ •ํ•จ

image

// package.json
"scripts": {
    "start": "cross-env REACT_APP_CLIENT_ENV=development node scripts/start.js",
    "build": "cross-env REACT_APP_CLIENT_ENV=production node scripts/build.js",
    "test": "node scripts/test.js"
  },
  • cross-env๋ฅผ ํ†ตํ•ด ์‹คํ–‰์‹œํ‚ฌ ๋•Œ NODE_ENV=development ๋˜๋Š” NODE_ENV=production์œผ๋กœ ์„ค์ •
  • ๊ฐœ๋ฐœ์šฉ๊ณผ ๋ฐฐํฌ์šฉ์ธ ๊ฒฝ์šฐ๋ฅผ ๋”ฐ๋กœ ๊ตฌ๋ถ„ํ•ด์„œ, ์ด์— ๋งž๋Š” ๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ฒŒ๋” ์„ค์ •

ํ•€ ํด๋ฆญ์‹œ ๋ฐœ์ƒ๋˜๋Š” ์ด๋ฒคํŠธ (ํ•€ ํ™•๋Œ€ & ์ƒ์„ธ ๋ชจ๋‹ฌ 1๋‹จ๊ณ„ ์ถœ๋ ฅ)

  • ๋„ค์ด๋ฒ„ ์ง€๋„ API์˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ด์šฉํ•ด ๊ฐ๊ฐ์˜ ํ•€์˜ ์ด๋ฒคํŠธ ๊ฑธ์–ด์ฃผ๊ธฐ
    • ํ•€(๋งˆ์ปค)์ด ์ •ํ™•ํ•˜๊ฒŒ ํด๋ฆญ๋จ
    • click์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์ฃผ๋”๋ผ๋„ pc, mobile ๋ชจ๋‘ ํ„ฐ์น˜์™€ ํด๋ฆญ์ด ์ž˜ ๋™์ž‘ํ•จ
  • ์ด๋ฒคํŠธ ์œ„์ž„์„ ํ†ตํ•ด ํ•€์˜ ์ด๋ฒคํŠธ ๊ฑธ์–ด์ฃผ๊ธฐ
    • ํ•€(๋งˆ์ปค)์ด ์ •ํ™•ํ•˜๊ฒŒ ํด๋ฆญ์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ
    • touchend๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์ฃผ๋ฉด ๋ชจ๋ฐ”์ผ์ด ์•„๋‹Œ pc์—์„œ๋Š” ํด๋ฆญ์ด ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ํ•˜์ง€๋งŒ ๊ฐ๊ฐ์˜ ํ•€์— ์ด๋ฒคํŠธ๋ฅผ ๊ฑธ์–ด์ค„ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ด€๋ จ๋œ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Œ

์‚ฌ์šฉ์ž๊ฐ€ ์œ„์น˜ ์ •๋ณด ์ œ๊ณต ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ์ง€๋„ ์ค‘์‹ฌ ์œ„์น˜ ์„ค์ •

image

์‚ฌ์šฉ์ž๊ฐ€ ์œ„์น˜ ์ •๋ณด ์ œ๊ณต์„ ํ—ˆ์šฉํ•  ๊ฒฝ์šฐ / ์‚ฌ์šฉ์ž๊ฐ€ ์œ„์น˜ ์ •๋ณด ์ œ๊ณต์„ ์ฐจ๋‹จํ•  ๊ฒฝ์šฐ

  • ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๊ฐ€ ์„œ์šธ์‹œ์ธ์ง€ ์•„๋‹Œ ์ง€์— ๋”ฐ๋ผ ์ดˆ๊ธฐ์— ๋‚˜ํƒ€๋‚ผ ์ง€๋„์˜ ์ค‘์‹ฌ ์œ„์น˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•จ
    • ์„œ์šธ ๋‚ด์— ์žˆ๋Š” ๊ฒฝ์šฐ: ์‚ฌ์šฉ์ž์˜ ํ˜„์žฌ ์œ„์น˜๋กœ ์„ค์ •ํ•จ
    • ์„œ์šธ ๋ฐ–์— ์žˆ๋Š” ๊ฒฝ์šฐ: ์„œ์šธ ์ค‘์‹ฌ์ธ ์‹œ์ฒญ์—ญ์œผ๋กœ ์œ„์น˜๋ฅผ ์„ค์ •ํ•จ

๋„ค์ด๋ฒ„ ์†Œ์…œ ๋กœ๊ทธ์ธ

  • ๋งˆ์ด๋ฒ„ํŠผ ํด๋ฆญ์‹œ ๋กœ๊ทธ์ธ ๋ชจ๋‹ฌ์ฐฝ ์ถœ๋ ฅ
  • ๋„ค์ด๋ฒ„๋กœ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญํ•˜๋ฉด ๋„ค์ด๋ฒ„ ์†Œ์…œ ๋กœ๊ทธ์ธ์œผ๋กœ ์ด๋™ ํ›„ ๋กœ๊ทธ์ธ
  • ๋„ค์ด๋ฒ„ ์•„์ด์ฝ˜์ด ๋ชจ๋‹ฌ ๋’ท๋ฐฐ๊ฒฝ ์–ด๋‘ก๊ฒŒ ํ•ด์ฃผ๋Š” ํ•„ํ„ฐ์„ ๋šซ๊ณ  ๋‚˜์˜ค๋Š” ๋ฌธ์ œ
  • naver ์•„์ด์ฝ˜์˜ z-index๊ฐ€ 100์ด๊ธฐ ๋•Œ๋ฌธ์— 100๋ณด๋‹ค ๋” ํฐ z-index๋ฅผ ๊ฐ๊ฐ ๋ชจ๋‹ฌ๊ณผ ํ•„ํ„ฐ์˜ css ์†์„ฑ์œผ๋กœ ๋„ฃ์–ด์คŒ
  • passport ๊ด€๋ จ๋œ ๋ฏธ๋“ค์›จ์–ด์˜ ์œ„์น˜์— ๋”ฐ๋ผ ๋กœ๊ทธ์ธ ํ–ˆ์„ ๊ฒฝ์šฐ ์ถœ๋ ฅ๋˜๋Š” ๋กœ๊ทธ๊ฐ€ ๋‹ฌ๋ผ์ง
  • express์˜ ๋ฏธ๋“ค์›จ์–ด๋Š” ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๊ณ  ์ด๋กœ ์ธํ•ด์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚  ์ˆ˜๋„ ์žˆ์Œ
  • passport์˜ deserializeUser๊ฐ€ ๋ชจ๋“  api์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด ์ฒ˜์Œ์—๋Š” ์˜ค๋ฅ˜์ธ ์ค„ ์•Œ์•˜์ง€๋งŒ passport์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•˜์—ฌ ๋ฐœ์ƒํ•œ ํ•ดํ”„๋‹์œผ๋กœ ๋๋‚จ

์‚ฌ์ด๋“œ๋ฐ” ์ถœ๋ ฅ

image

  • ๋ฉ”์ธ ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง ๋  ๋•Œ(Component๊ฐ€ ์ฒ˜์Œ mount ๋œ ๊ฒฝ์šฐ), ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” api๋ฅผ ํ˜ธ์ถœ
  • ์„œ๋ฒ„๋Š” ๋กœ๊ทธ์ธ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์ฃผ๊ฒŒ ๋˜๊ณ  ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ์— ๋งž๊ฒŒ ๋กœ๊ทธ์ธ ๋ชจ๋‹ฌ์ฐฝ ๋˜๋Š” ์‚ฌ์ด๋“œ๋ฐ”๊ฐ€ ์ถœ๋ ฅ

ํ™”๋ฉด ํฌ๊ธฐ์— ๋ฐ˜์‘ํ•˜์—ฌ UI์˜ ํฌ๊ธฐ์™€ ์œ„์น˜ ๋ณ€๊ฒฝ

image

pc

image

๊ฐค๋Ÿญ์‹œ ํด๋“œ

image

์•„์ดํŒจ๋“œ ๋ฏธ๋‹ˆ

  • CSS์˜ max-width๋ฅผ ํ†ตํ•ด ํ™”๋ฉด์ด ์ผ์ • ํฌ๊ธฐ ์ด์ƒ์œผ๋กœ ์ปค์ง€๋”๋ผ๋„ ์ƒ์„ธ ๋ชจ๋‹ฌ์ฐฝ๊ณผ ๊ฒ€์ƒ‰์ฐฝ์˜ ํฌ๊ธฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ.
  • px์„ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” vh, vw, rem, %์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๋ฐ˜์‘ํ˜• ํ™”๋ฉด์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋ ฅํ•จ.
    • ๋ฌธ์ œ : ์‹ค์ œ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ์˜ ์ฃผ์†Œ์ฐฝ ๋†’์ด๋ฅผ ๋ฏธ์ฒ˜ ๊ณ„์‚ฐํ•˜์ง€ ๋ชปํ•ด ์ƒ์„ธ ๋ชจ๋‹ฌ์ฐฝ ํ™”๋ฉด ๋ฐ‘์ด ์ž˜๋ฆฌ๋Š” ํ˜„์ƒ ๋ฐœ์ƒ โ†’ vh ๋Œ€์‹  %๋กœ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ• ๋“ฏ ํ•จ

cron ์„œ๋ฒ„์—์„œ ์„œ์šธ ๋„์‹œ ๋ฐ์ดํ„ฐ 30๋ถ„ ๊ฐ„๊ฒฉ์œผ๋กœ ์ €์žฅ ๋ฐ ์บ์‹ฑ

import cron from 'node-cron';

...

// ??์‹œ 0๋ถ„, ??์‹œ 30๋ถ„๋งˆ๋‹ค ๋™์ž‘
cron.schedule(`0,30 * * * *`, cronController.cronSeoulData);
  • 24์‹œ๊ฐ„ ์ด๋‚ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 30๋ถ„๋งˆ๋‹ค ์„œ์šธ ์‹ค์‹œ๊ฐ„ ๋„์‹œ๋ฐ์ดํ„ฐ API์— ์š”์ฒญ
  • ๋ฐ›์•„๋‚ธ ์ฃผ์š” 50์žฅ์†Œ์˜ ๋ฐ์ดํ„ฐ(xml)๋ฅผ json์œผ๋กœ ๊ฐ€๊ณต ํ›„, mongoDB์™€ Redis์— ์ €์žฅ

์ตœ๊ทผ 24์‹œ๊ฐ„ ์ธ๊ตฌ ๋ฐ€๋„๋ฅผ ์ƒ์„ธ ๋ชจ๋‹ฌ 2๋‹จ๊ณ„์—์„œ ์ถœ๋ ฅ

image

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ธ๋ชจ๋‹ฌ 2๋‹จ๊ณ„๋ฅผ ์—ด๋ฉด, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์ธก์— ์ตœ๊ทผ 24์‹œ๊ฐ„๋™์•ˆ์˜ ์ธ๊ตฌ ๋ฐ€๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญ

  • ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์ง€์—ญ์˜ ์ตœ๊ทผ 24์‹œ๊ฐ„ ์ธ๊ตฌ๋ฐ€๋„ ๋ฐ์ดํ„ฐ๋ฅผ redis์—์„œ ๊ฐ€์ ธ์™€ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด์คŒ

  • ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐ„๋ณ„ ๋ง‰๋Œ€ ๊ทธ๋ž˜ํ”„๋กœ ์ถœ๋ ฅ

  • ํ•œ ๋ฒˆ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋“ค์€ ์บ์‹ฑํ•˜์—ฌ ์ดํ›„ ๋‹ค์‹œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜์ง€ ์•Š๋„๋ก ํ•จ

    • ์ด๋ฏธ ๋ˆŒ๋ €๋˜ ์„œ์šธ์—ญ์€ ๋กœ๋”ฉ ์—†์ด ๋ฐ”๋กœ ๊ทธ๋ž˜ํ”„๊ฐ€ ์ถœ๋ ฅ๋จ
  • ํ˜„์žฌ ์บ์‹ฑ์€ ์ „์—ญ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์™„๋ฒฝํ•œ ์‹ค์‹œ๊ฐ„์„ฑ์ด ๋ณด์žฅ๋˜์ง€ ์•Š์Œ

    โ†’ React Query ๊ฐ™์€ ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Œ

4.2. ๋ฐฐํฌ (๋ชฉ)

Mildo

5. ์•ž์œผ๋กœ ํ•  ์ผ

  • https ์ ์šฉ
  • ํ•„ํ„ฐ๋ง ๊ธฐ๋Šฅ (๋ถ๋งˆํฌ๋ณ„, ์ธ๊ตฌ๋ฐ€๋„๋ณ„)
  • ๋ถ๋งˆํฌ ๊ธฐ๋Šฅ
  • ๋‚ด์ผ ๊ฐˆ ๊ฑฐ์•ผ ๊ธฐ๋Šฅ
  • ์‚ฌ์ด๋“œ๋ฐ” ๋ Œ๋”๋ง(๋ถ๋งˆํฌ, ๋‚ด์ผ ๊ฐˆ ๊ฑฐ์•ผ) ๋ฐ ๋กœ๊ทธ์•„์›ƒ
  • ์žฅ์†Œ ๊ฒ€์ƒ‰