๐ ๋ฐ๋ชจ_4์ฃผ์ฐจ - boostcampwm-2022/web33-Mildo GitHub Wiki
1. ํ๋ก์ ํธ ๋ช : Mildo(๋ฐ๋)
- ๋ฐ์ํ ์น ํ๊ฒฝ์์ ์์ธ์ ์ค์๊ฐ ์ธ๊ตฌ ๋ฐ๋ ์ ๋ณด๋ฅผ ์ ๊ณต์ ๋ชฉํ
2. ์ง๋ ์ฃผ ์งํ ๋ด์ฉ
- ๋ค์ด๋ฒ ์ง๋ UI ๋ถ๋ถ์ ์ผ๋ก ๊ตฌํ ๋ฐ ์ง๋ ๋ฐ๊ฒฝ ์์ธ ๋ด๋ก ์ ํํ๊ธฐ
- ๋ก๋ฉ ํ๋ฉด ๊ตฌํ
- ์์ธ ๋ชจ๋ฌ 1๋จ๊ณ์ 2๋จ๊ณ UI
- ์ธ๊ตฌ ๋ฐ๋์ ๋ฐ๋ฅธ ํ(๋ง์ปค) ์ถ๋ ฅ
3. ์ด๋ฒ ์ฃผ ๋ชฉํ
-
์์ธ์ ์ธ๊ตฌ ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ์ฅํ๋ cron ์๋ฒ ๊ตฌ์ถ
a. ํ์ฌ ์ธ๊ตฌ๋ฐ๋ ํ์ด ์ค์๊ฐ์ด ์๋ ํ ์คํธ์ฉ ๋์๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ ์์
b. ์์ธ ์ธ๊ตฌ ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ์ฅํ์ฌ ์ค์๊ฐ ์์ธ ์ธ๊ตฌ ๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฉ๋๋๋ก ํจ
-
์ต๊ทผ 24์๊ฐ ์ธ๊ตฌ ๋ฐ๋ Redis๋ฅผ ํตํด ๋ฐ์ดํฐ ์บ์ฑ
a. ๊ฐ ์ง์ญ์ ๋ํด ๋งค๋ฒ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ mongoDB์ ์์ฒญํ๊ธฐ ๋๋ฌธ์ ์บ์ฑํ์ฌ ๋ฐ์ดํฐ์ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํจ
-
์ธ๊ตฌ ๋ฐ๋๋ณ ์ง๋ ํ์ ํํฐ๋งํ๋ ๊ธฐ๋ฅ
a. ์ฌ์ฉ์๊ฐ ์ํ๋ ์ธ๊ตฌ ๋ฐ๋๋ฅผ ๋น ๋ฅด๊ฒ ํ์ธํ ์ ์๋ ๊ธฐ๋ฅ
-
https ์ ์ฉํ๊ธฐ
a. https๋ฅผ ์ ์ฉํ์ง ์์ผ๋ฉด, ๋ธ๋ผ์ฐ์ ์์ ์์น ํ์ฉ ์ฌ๋ถ์ ๊ด๋ จ๋ ๋ถ๋ถ์ ๋ฌผ์ด๋ณด์ง ์๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ๋ฌผ์ด๋ณด๊ธฐ ์ํด์๋ https๋ฅผ ์ ์ฉํด์ผ ๋จ
4. ์ด๋ฒ ์ฃผ ์งํ ๋ด์ฉ
4์ฃผ์ฐจ project burn up ์ฐจํธ
4.1. ํ์ด ๊ฐ๋ฐ (์~์)
ํ๊ฒฝ๋ณ์๋ฅผ ๊ฐ๋ฐ์ฉ, ๋ฐฐํฌ์ฉ์ผ๋ก ๋๋์ด ์ค์
- ์ง๋ ์ฃผ ๋ฐฐํฌํ๋ฉด์ ์๋์ผ๋ก ๋ฐ๊พธ์ด์ค์ผ ํ์ด์ ๋งค์ฐ ๋ถํธํ์
- ๊ฐ๋ฐ์ฉ, ๋ฐฐํฌ์ฉ์ผ๋ก ๋๋๊ณ , ๊ฐ๊ฐ์ ๋ํ ์คํ์คํฌ๋ฆฝํธ๋ฅผ ์ค์ ํจ
// 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์์๋ ํด๋ฆญ์ด ๋์ง ์๋ ๋ฌธ์ ๋ฐ์
- ํ์ง๋ง ๊ฐ๊ฐ์ ํ์ ์ด๋ฒคํธ๋ฅผ ๊ฑธ์ด์ค ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ๋์์ ๊ด๋ จ๋ ๋ฌธ์ ๊ฐ ์์ ์ ์์
์ฌ์ฉ์๊ฐ ์์น ์ ๋ณด ์ ๊ณต ์ฌ๋ถ์ ๋ฐ๋ฅธ ์ง๋ ์ค์ฌ ์์น ์ค์
์ฌ์ฉ์๊ฐ ์์น ์ ๋ณด ์ ๊ณต์ ํ์ฉํ ๊ฒฝ์ฐ / ์ฌ์ฉ์๊ฐ ์์น ์ ๋ณด ์ ๊ณต์ ์ฐจ๋จํ ๊ฒฝ์ฐ
- ์ฌ์ฉ์์ ํ์ฌ ์์น๊ฐ ์์ธ์์ธ์ง ์๋ ์ง์ ๋ฐ๋ผ ์ด๊ธฐ์ ๋ํ๋ผ ์ง๋์ ์ค์ฌ ์์น๋ฅผ ๋ค๋ฅด๊ฒ ์ค์ ํจ
- ์์ธ ๋ด์ ์๋ ๊ฒฝ์ฐ: ์ฌ์ฉ์์ ํ์ฌ ์์น๋ก ์ค์ ํจ
- ์์ธ ๋ฐ์ ์๋ ๊ฒฝ์ฐ: ์์ธ ์ค์ฌ์ธ ์์ฒญ์ญ์ผ๋ก ์์น๋ฅผ ์ค์ ํจ
๋ค์ด๋ฒ ์์ ๋ก๊ทธ์ธ
- ๋ง์ด๋ฒํผ ํด๋ฆญ์ ๋ก๊ทธ์ธ ๋ชจ๋ฌ์ฐฝ ์ถ๋ ฅ
- ๋ค์ด๋ฒ๋ก ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญํ๋ฉด ๋ค์ด๋ฒ ์์ ๋ก๊ทธ์ธ์ผ๋ก ์ด๋ ํ ๋ก๊ทธ์ธ
- ๋ค์ด๋ฒ ์์ด์ฝ์ด ๋ชจ๋ฌ ๋ท๋ฐฐ๊ฒฝ ์ด๋ก๊ฒ ํด์ฃผ๋ ํํฐ์ ๋ซ๊ณ ๋์ค๋ ๋ฌธ์
- naver ์์ด์ฝ์ z-index๊ฐ 100์ด๊ธฐ ๋๋ฌธ์ 100๋ณด๋ค ๋ ํฐ z-index๋ฅผ ๊ฐ๊ฐ ๋ชจ๋ฌ๊ณผ ํํฐ์ css ์์ฑ์ผ๋ก ๋ฃ์ด์ค
- passport ๊ด๋ จ๋ ๋ฏธ๋ค์จ์ด์ ์์น์ ๋ฐ๋ผ ๋ก๊ทธ์ธ ํ์ ๊ฒฝ์ฐ ์ถ๋ ฅ๋๋ ๋ก๊ทธ๊ฐ ๋ฌ๋ผ์ง
- express์ ๋ฏธ๋ค์จ์ด๋ ์์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ณ ์ด๋ก ์ธํด์ ์ค๋ฅ๊ฐ ๋ ์๋ ์์
- passport์ deserializeUser๊ฐ ๋ชจ๋ api์์ ์คํ๋๋ ๊ฒ์ด ์ฒ์์๋ ์ค๋ฅ์ธ ์ค ์์์ง๋ง passport์ ๋ํ ์ดํด๊ฐ ๋ถ์กฑํ์ฌ ๋ฐ์ํ ํดํ๋์ผ๋ก ๋๋จ
์ฌ์ด๋๋ฐ ์ถ๋ ฅ
- ๋ฉ์ธ ํ์ด์ง๊ฐ ์ฒ์ ๋ ๋๋ง ๋ ๋(Component๊ฐ ์ฒ์ mount ๋ ๊ฒฝ์ฐ), ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ api๋ฅผ ํธ์ถ
- ์๋ฒ๋ ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด์ฃผ๊ฒ ๋๊ณ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ฌ์ฉ์์ ์ํ์ ๋ง๊ฒ ๋ก๊ทธ์ธ ๋ชจ๋ฌ์ฐฝ ๋๋ ์ฌ์ด๋๋ฐ๊ฐ ์ถ๋ ฅ
ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ์ํ์ฌ UI์ ํฌ๊ธฐ์ ์์น ๋ณ๊ฒฝ
pc
๊ฐค๋ญ์ ํด๋
์์ดํจ๋ ๋ฏธ๋
- 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๋จ๊ณ์์ ์ถ๋ ฅ
-
์ฌ์ฉ์๊ฐ ์์ธ๋ชจ๋ฌ 2๋จ๊ณ๋ฅผ ์ด๋ฉด, ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ธก์ ์ต๊ทผ 24์๊ฐ๋์์ ์ธ๊ตฌ ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ
-
์๋ฒ๋ ํด๋น ์ง์ญ์ ์ต๊ทผ 24์๊ฐ ์ธ๊ตฌ๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ redis์์ ๊ฐ์ ธ์ ํด๋ผ์ด์ธํธ๋ก ๋ณด๋ด์ค
-
๋ฐ์ดํฐ๋ฅผ ์๊ฐ๋ณ ๋ง๋ ๊ทธ๋ํ๋ก ์ถ๋ ฅ
-
ํ ๋ฒ ์์ฒญํ ๋ฐ์ดํฐ๋ค์ ์บ์ฑํ์ฌ ์ดํ ๋ค์ ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ์ง ์๋๋ก ํจ
- ์ด๋ฏธ ๋๋ ๋ ์์ธ์ญ์ ๋ก๋ฉ ์์ด ๋ฐ๋ก ๊ทธ๋ํ๊ฐ ์ถ๋ ฅ๋จ
-
ํ์ฌ ์บ์ฑ์ ์ ์ญ๋ณ์๋ก ๊ด๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์๋ฒฝํ ์ค์๊ฐ์ฑ์ด ๋ณด์ฅ๋์ง ์์
โ React Query ๊ฐ์ ๊ธฐ์ ์ ๋ํ ๊ณ ๋ฏผ์ด ํ์ํ ๊ฒ ๊ฐ์
4.2. ๋ฐฐํฌ (๋ชฉ)
5. ์์ผ๋ก ํ ์ผ
- https ์ ์ฉ
- ํํฐ๋ง ๊ธฐ๋ฅ (๋ถ๋งํฌ๋ณ, ์ธ๊ตฌ๋ฐ๋๋ณ)
- ๋ถ๋งํฌ ๊ธฐ๋ฅ
- ๋ด์ผ ๊ฐ ๊ฑฐ์ผ ๊ธฐ๋ฅ
- ์ฌ์ด๋๋ฐ ๋ ๋๋ง(๋ถ๋งํฌ, ๋ด์ผ ๊ฐ ๊ฑฐ์ผ) ๋ฐ ๋ก๊ทธ์์
- ์ฅ์ ๊ฒ์