PlanMate
๐ Githubโ
https://github.com/shlee9999/PlanMate
โจ ํ๋ก์ ํธ ๊ฐ์โ
PlanMate๋ ์ ๋ฌธ์ง ์ค๋น์๋ค์ ์ํ ํ์ต ๊ด๋ฆฌ ๋ฐ ์ปค๋ฎค๋ํฐ ํ๋ซํผ์ ๋๋ค. ์ฌ์ฉ์๊ฐ ํจ์จ์ ์ผ๋ก ํ์ต ์๊ฐ์ ๊ด๋ฆฌํ๊ณ , ํ์ต ํจํด์ ๋ถ์ํ๋ฉฐ, ํ์ํ ์ ๋ณด๋ฅผ ๊ณต์ ํ ์ ์๋๋ก ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
โฐ ๊ฐ๋ฐ ๊ธฐ๊ฐ
1์ฐจ ๊ฐ๋ฐ: 2023.05 ~ 2023.08
2์ฐจ ๊ฐ๋ฐ: 2024.01
๐ช ํ์ ๊ตฌ์ฑ
์ญํ | ์ด๋ฆ |
---|---|
๐ฅ๏ธ FrontEnd | ์ด์ฑํ |
๐ ๏ธ BackEnd | ๊นํธ์ง |
๐จ ๋์์ธ | ๋ฐ์ํ |
๐ ๊ธฐํ | ๊น์ธ์ |
๐ ํต์ฌ ๊ธฐ๋ฅโ
โฑ๏ธํ์ด๋จธ ํ์ด์งโ
- ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ณผ๋ชฉ์ CRUDํ ์ ์์ต๋๋ค.
- ๊ณผ๋ชฉ๋ณ ์๊ฐ์ ์ธก์ ํ๊ณ ์ด๋ฅผ ์๊ฐํํ ๊ทธ๋ํ์ ์ฆ์ ๋ฐ์ํ์ฌ ์ฌ์ฉ์์๊ฒ ์ฑ์ทจ๊ฐ์ ์ค๋๋ค.
- ๊ณผ๋ชฉ์ ๋ฐ๋ผ ์๊น์ ๋ค์ํ๊ฒ ์ง์ ํ ์ ์์ต๋๋ค.
๐ํต๊ณ ํ์ด์งโ
- ์บ๋ฆฐ๋๋ฅผ ์ด์ฉํ์ฌ ๋ ์ง๋ณ ํต๊ณ๋ฅผ ์๊ฐํํฉ๋๋ค.
- ํ์ต๋์ ๋ฐ๋ผ ์์์ ๋ค๋ฅด๊ฒ ํ์ํ์ฌ ์ฌ์ฉ์์๊ฒ ์ง๊ด์ ์ธ UI๋ฅผ ๋ณด์ฌ์ค๋๋ค.
- ์ฐจํธ๋ฅผ ์ด์ฉํด ๊ณผ๋ชฉ๋ณ ํ์ต ์๊ฐ์ ํ ๋์ ๋น๊ตํ ์ ์์ต๋๋ค.
- ๊ทธ๋ํ๋ฅผ ํตํด ์๊ฐ๋๋ณ๋ก ์ ๋ ๊ณผ ๊ณต๋ถ๋์ ๋น๊ตํ ์ ์์ต๋๋ค.
๋ค๋ฅธ ์ธ๋ถ ๊ธฐ๋ฅ๋ค์ ReadMe๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
๐ ๏ธ ์ฌ์ฉํ ๊ธฐ์ ์คํโ
- TypeScript, React, Redux
- styled-components, framer-motion
- draft-js, Chart.js
๐ซ ์ ๊ฒฝ ์ด ๋ถ๋ถโ
์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑโ
ํ๋ก์ ํธ๋ฅผ ๋จ๋ ์ผ๋ก ์งํํ๋ฉด์๋ ํ ํ์ ์ ๊ณ ๋ คํ์ฌ ์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ์ค์ ์ ๋๊ณ ์์ฑ ๋ฐ ๋ฆฌํฉํ ๋งํ์ต๋๋ค.
1. ์ค์ค๋ก ์ปจ๋ฒค์ ์ ์ ํ๊ณ ์งํค๋ฉฐ ๊ฐ๋ฐํ์์ต๋๋ค.
https://github.com/shlee9999/PlanMate/blob/master/README.md#-์ปจ๋ฒค์
2. API์ JSDoc ์ฃผ์์ผ๋ก ์์ธ ์ค๋ช ์ ์ถ๊ฐํ์ฌ ๊ฐ๋ฐ ํธ์์ฑ์ ๋์์ต๋๋ค.
3. ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ทฐ ๋ก์ง์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ํ์ฅ์ฑ์ ๋์์ต๋๋ค .
4. ์ ๋๊ฒฝ๋ก์ index.tsx์ import๋ฌธ ๋จ์ถ ๊ธฐ๋ฅ์ ํ์ฉํด import๋ฌธ์ ์ค์์ต๋๋ค. styled-components ๊ด๋ จ import๋ฌธ์ ์ ์คํฐ๋ฆฌ์คํฌ(*)๋ฅผ ์ฌ์ฉํด ๊ฐ์ํํ๋ฉด์ ์ผ๋ฐ ์ปดํฌ๋ํธ์์ ๊ตฌ๋ถ๋ ์ฉ์ดํด์ก์ต๋๋ค.
5. ๋ชจ๋ mutation ํ ์ ๋ถ๋ฆฌํ์ฌ ์ฝ๋์ ์ ์ง๋ณด์์ฑ๊ณผ ๊ฐ๋ ์ฑ์ ๋์์ต๋๋ค.
์ฌ์ฉ์ ๊ฒฝํ(UX) ๊ฐ์ ๊ณผ ํจ์จ์ ์ธ API ํธ์ถโ
React Query์ optimistic update๋ก UI ์ ๋ฐ์ดํธ ์ง์ฐ์ ์ต์ํํ๊ณ , ํด๋ผ์ด์ธํธ ์ธก Query ๋ฐ์ดํฐ๋ฅผ ์ง์ ์์ ์ผ๋ก ๋ถํ์ํ API ํธ์ถ์ ์ค์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ 27๊ฐ์ ๋ชจ๋ mutation ์ฝ๋์ ์ ์ฉํด API ํธ์ถ์ ํฌ๊ฒ ์ค์ด๊ณ , ์์คํ ์ฑ๋ฅ๊ณผ UX๋ฅผ ๋์์ ๊ฐ์ ํ์ต๋๋ค.
๋ง์ถคํ ์ปดํฌ๋ํธ ๊ฐ๋ฐโ
ํ๋ก์ ํธ์ ํน์ฑ๊ณผ ๋์์ธ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑ์ํค๊ธฐ ์ํด ์ผ๋ถ ํต์ฌ ์ปดํฌ๋ํธ๋ฅผ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ์ง ์๊ณ ์์ ๋ฆฌ์กํธ๋ก ์ง์ ๊ตฌํํ์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก์ ํธ์ ์ต์ ํ๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ์ ๊ณตํ ์ ์์์ต๋๋ค.
1. ์บ๋ฆฐ๋
2. ์ค์ผ์ค๋ฌ
๋ฐ์ํ ์ปดํฌ๋ํธโ
Display ์ปดํฌ๋ํธ๋ย ๋ฐ์ํ ์น ๋์์ธ์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ์ ๋๋ค. ํนํ ํ์ ์์ ์ฑ๊ณผ ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ฑ์ ์ค์ ์ ๋์ด ๊ฐ๋ฐํ์ต๋๋ค. ๋ค์ํ ํ๋ฉด ํฌ๊ธฐ์ ๋์ํ๋ ๋ธ๋ ์ดํฌํฌ์ธํธ๋ฅผ ์์๋ก ์ ์ํ์ฌ ์ผ๊ด๋ ๋ฐ์ํ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌํํ๊ณ , ๋ช ํํ ํ์ ์ ์๋ฅผ ํตํด ์ปดํฌ๋ํธ์ ์์ ์ฑ์ ๋ณด์ฅํ๋ฉฐ ๊ฐ๋ฐ ์ ๋ฐ์ํ ์ ์๋ ํ์ ๊ด๋ จ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ์ต๋๋ค. ๋จ์ผ ์ฑ ์ ์์น์ ์ค์ํ ์ปดํฌ๋ํธ ์ค๊ณ๋ก ์ ์ง๋ณด์์ฑ์ด ์ฆ๊ฐํ์์ผ๋ฉฐ, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค ์ค๊ณ๋ก ๊ฐ๋ฐ ์์ฐ์ฑ์ด ํฅ์๋์์ต๋๋ค.
โ๏ธ๋ฐฐ์ด ์ โ
๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์โ
- IDE ํ์ฉ
- VSCode์ ๊ณ ๊ธ ๊ธฐ๋ฅ ํ์ฉ์ผ๋ก ๊ฐ๋ฐ ์๋ ์ต์ ํ
- ์ปค์คํ ์ค๋ํซ ์์ฑ ๋ฐ ํ์ฉ์ผ๋ก ๋ฐ๋ณต ์์ ์ต์ํ
- ํจ์จ์ ์ธ ๋จ์ถํค ์ฌ์ฉ์ผ๋ก ์์ ํ๋ฆ ๊ฐ์
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ฉ
- framer-motion, Chart.js, draft-js ๋ฑ ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝํ
๊ธฐ์ ์คํ ํ์ฅโ
- TypeScript ๋์ ์ผ๋ก ์ ์ ํ์ ์์คํ ์ ์ด์ ์ฒด๋
- Redux๋ฅผ ํตํ ๋ณต์กํ ์ํ ๊ด๋ฆฌ ๊ฒฝํ
- React Query๋ฅผ ํ์ฉํ ์๋ฒ ์ํ ๊ด๋ฆฌ
์ฝ๋ ํ์ง ๋ฐ ์ํคํ ์ฒ ๊ฐ์ โ
- ActionButton, Display, Pagination ๋ฑ์ ์ฌ์ฌ์ฉ์ฑ ๋์ ์ปดํฌ๋ํธ ์ค๊ณํ์ฌ ํจ์จ์ ๊ฐ๋ฐ
- useForm, useDetectClickOutside, useLockBodyScroll ๋ฑ์ ์ปค์คํ ํ ์ ๊ฐ๋ฐํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ํจ๊ณผ์ ์ผ๋ก ๋ถ๋ฆฌํ๊ณ ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋์
์น ๋์์ธโ
- media query๋ฅผ ์ฌ์ฉํ ๋ฐ์ํ ๋์์ธ ์ฒด๋
- 7๊ฐ์ ํ์ด์ง๋ฅผ ๊ตฌํํ๋ฉด์ CSS ๋ฅ๋ ฅ ํฅ์
๐ค์์ฌ์ ๋ ์ โ
ํ์ ๊ฒฝํ ๋ถ์กฑโ
- ์ค๋ฌด์ ์ธ ํ์ ์คํฌ๊ณผ ์ฒด๊ณ์ ์ธ ํ์ ํ๋ก์ธ์ค ๊ฒฝํ์ ์ถฉ๋ถํ ํด๋ณด๊ณ ์ถ์๋๋ฐ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ค๊ณผ ํจ๊ป ํ ํ๋ก์ ํธ๋ฅผ ์งํํ์ง ๋ชปํ ์ ์ด ์์ฌ์ ์ต๋๋ค. ์ด์ ๊ด๋ฆฌ, PR, ์ ์์ผ ๋ฐฉ๋ฒ๋ก , ์ฝ๋ ๋ฆฌ๋ทฐ, ๋ฌธ์ํ ๋ฑ์ ๊ฒฝํ์ ํด๋ณด๊ณ ์ ์ดํ ํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ์ฝ์ค์ ์ง์ํ์ฌ ๊ฒฝํ์ ์์์ต๋๋ค.
์์ ์ฌ์ ์ง์โ
- JavaScript์ ๋ํ ๋ ๊น์ ์ฌ์ ํ์ต์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ดํ ํ๋ก๊ทธ๋๋จธ์ค ๋ฐ๋ธ์ฝ์ค์์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฅ๋ค์ด๋ธ ์คํฐ๋๋ฅผ ํตํ์ฌ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ํ ๊น์ด ์๋ ์ง์์ ์ป๊ฒ ๋์์ต๋๋ค.
์ปดํฌ๋ํธ ๊ด๋ฆฌ ๋ฅ๋ ฅ ํฅ์ ํ์โ
- ๋ชจ๋ฌ ๊ด๋ฆฌ์ ๊ฐ์ UI ์ปดํฌ๋ํธ์ ํจ์จ์ ์ธ ๊ด๋ฆฌ ๋ฐฉ๋ฒ์ ์ถฉ๋ถํ ๊ณ ๋ คํ์ง ๋ชปํ์ต๋๋ค. ์ด๋ ํ๋ก์ ํธ์ ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ํฅ์ ๋ฏธ์ณค์ ๊ฒ์ ๋๋ค. ์ดํ DDang (์งํ์ค) ํ๋ก์ ํธ์์ zustand๋ฅผ ํ์ฉํ ๋ชจ๋ฌ ๊ด๋ฆฌ๋ฅผ ์๋ํด ๋ณด์์ต๋๋ค.
์ฝ๋ ํ์ง ๊ฐ์ ํ์โ
- ๋น ๋ฅธ ๊ฐ๋ฐ์ ์น์คํ๋ค ๋ณด๋ ์ฝ๋์ ํ์ง, ์ฌ์ฌ์ฉ์ฑ, ๊ทธ๋ฆฌ๊ณ ์ฑ๋ฅ ์ต์ ํ์ ๋ํ ๊ณ ๋ ค๊ฐ ๋ถ์กฑํ์ต๋๋ค. ๋ ๋์ ์ํคํ ์ฒ์ ๋์์ธ ํจํด์ ์ ์ฉํ ๊ธฐํ๋ฅผ ๋์น ๊ฒ ๊ฐ์ต๋๋ค. ์ดํ ์ํ ๋ฏน ๋์์ธ ํจํด์ ๊ณต๋ถํ์ฌ ์ ์ฉํด๋ณธ ๊ฒฝํ์ด ์์ต๋๋ค.
ํ ์คํ ์ ๋ต ๋ถ์ฌโ
- ํ ์คํ ์ ๋ต ์๋ฆฝ ๋ฐ ๊ตฌํ์ ๋ํ ๊ฒฝํ์ด ๋ถ์กฑํ์ต๋๋ค. ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ๋ฅผ ํตํด ์ฝ๋์ ์์ ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋์ผ ์ ์์์ ํ ๋ฐ, ์ด๋ฅผ ์ถฉ๋ถํ ๊ณ ๋ คํ์ง ๋ชปํ ์ ์ด ์์ฝ์ต๋๋ค. ํฅํ ํ๋ก์ ํธ์์๋ Jest๋ React Testing Library๋ฅผ ํ์ฉํ ์ฒด๊ณ์ ์ธ ํ ์คํธ ์ฝ๋ ์์ฑ์ ๋ชฉํ๋ก ํ๊ณ ์์ต๋๋ค.
์น ์ฑ๋ฅ ์ต์ ํ ๋ถ์กฑโ
- ์น ์ฑ๋ฅ ์ต์ ํ์ ๋ํ ํ์ต์ด ๋ถ์กฑํ์ต๋๋ค. ์ฝ๋ ์คํ๋ฆฌํ , ๋ ์ด์ง ๋ก๋ฉ ๋ฑ์ ๊ธฐ๋ฒ์ ์ ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ฉ ์๋์ ์ ๋ฐ์ ์ธ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์์ ๊ฒ์ ๋๋ค. ์ดํ ํ๋ก์ ํธ์์๋ ์ด๋ฌํ ์ต์ ํ ๊ธฐ๋ฒ๋ค์ ์ ๊ทน์ ์ผ๋ก ๋์ ํ์ฌ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ ์ ํฉ๋๋ค.
๋ผ์ด๋ธ ์๋น์ค ์ด์ ๊ฒฝํ ๋ถ์กฑโ
- ๋ผ์ด๋ธ ์๋น์ค๋ฅผ ์ด์ํ์ฌ ์ค์ฌ์ฉ์์ ํผ๋๋ฐฑ์ ๋ฐ์ง ๋ชปํ ์ ์ด ์์ฌ์ ์ต๋๋ค. ์ค์ ์ฌ์ฉ์๋ค์ ๋ฐ์๊ณผ ํผ๋๋ฐฑ์ ์๋น์ค ๊ฐ์ ๊ณผ ๋ฐ์ ์ ์ค์ํ ์์์ด๋ฉฐ, ์ด๋ ์น ํ๋ซํผ์ ์ฅ๊ธฐ์ ์ธ ์ฑ๊ณต๊ณผ ์ ์ ๊ฒฝํ ํฅ์์ ํ์์ ์ ๋๋ค. ํฅํ ํ๋ก์ ํธ์์๋ ๋ผ์ด๋ธ ์๋น์ค ์ด์์ ํตํด ์ ์ ์ ํผ๋๋ฐฑ์ ๋ฐ์ํ์ฌ ์ง์์ ์ผ๋ก ์๋น์ค๋ฅผ ๊ฐ์ ํด๋ณด๋ ๊ฒฝํ์ ํ๊ณ ์ถ์ต๋๋ค.