โ Coffect: ์ปคํผ๋ก ์ํตํ๋ ์๋ก์ด ๋ฐฉ๋ฒ
Coffect์ ๊ณตํต์ ๊ด์ฌ์ฌ๋ก ์ฌ๋๋ค์ ์ฐ๊ฒฐํ๋ ์์ ๋์ค์ปค๋ฒ๋ฆฌ ํ๋ซํผ์ ๋๋ค.
๋์ ๋น์ทํ ๊ด์ฌ์ฌ๋ฅผ ๊ฐ์ง ์ฌ๋์ ๋ฐ๊ฒฌํ๊ณ , ๊ฐ๋ฒผ์ด ์ปคํผ์ฑ์ ์ ์ํ๋ฉฐ, ์ปค๋ฎค๋ํฐ๋ฅผ ํตํด ๊ด์ฌ์ฌ๋ฅผ ๊ณต์ ํด๋ณด์ธ์. Coffect๋ ์จ๋ผ์ธ์์์ ๋ํ๊ฐ ์ค์ ๋ง๋จ์ผ๋ก ์ด์ด์ง๋ ์ฆ๊ฑฐ์ด ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
โจ ์ฃผ์ ๊ธฐ๋ฅ
- ์ค๋์ ์ถ์ฒ ์นด๋: ๋งค์ผ ์๋ก์ด ์ฌ๋๋ค์ ํ๋กํ ์นด๋๋ฅผ ์ถ์ฒ๋ฐ๊ณ , ๋๊ฒจ๋ณด๋ฉฐ ๋ง์์ ๋๋ ์๋๋ฅผ ์ฐพ์๋ณด์ธ์.
- ํ๋กํ ํ์ธ ๋ฐ ์ปคํผ์ฑ ์ ์: ์๋๋ฐฉ์ ํ๋กํ์์ ๊ด์ฌ์ฌ๋ฅผ ํ์ธํ๊ณ , '์ปคํผ์ฑ ์ ์ํ๊ธฐ' ๊ธฐ๋ฅ์ ํตํด ๊ฐํธํ๊ฒ ๋ง๋จ์ ์ ์ํ ์ ์์ต๋๋ค.
- ์ค์๊ฐ ์ฑํ ๋ฐ ์ฝ์ ์กฐ์จ: ์๋๋ฐฉ์ด ์ ์์ ์๋ฝํ๋ฉด ์ค์๊ฐ ์ฑํ ๋ฐฉ์ด ์ด๋ฆฝ๋๋ค. ์ฑํ ๋ฐฉ ๋ด์์ ์บ๋ฆฐ๋์ ์ฝ์ ์ก๊ธฐ๋ฅผ ํ์ฉํด ์ฝ์ ์๊ฐ๊ณผ ์ฅ์๋ฅผ ํธ๋ฆฌํ๊ฒ ์ ํ ์ ์์ต๋๋ค.
- ์ปค๋ฎค๋ํฐ: ์์ ๋กญ๊ฒ ๊ธ์ ์์ฑํ๊ณ ๋๊ธ์ ๋ฌ๋ฉฐ ๋ค๋ฅธ ์ฌ์ฉ์๋ค๊ณผ ์ํตํ ์ ์๋ ํผ๋ ํ์์ ์ปค๋ฎค๋ํฐ ๊ณต๊ฐ์ ๋๋ค.
- ์ค์๊ฐ ์๋ฆผ: Firebase Cloud Messaging(FCM)์ ํตํด ์๋ก์ด ์ถ์ฒ, ์ปคํผ์ฑ ์ ์, ์ฑํ ๋ฉ์์ง ๋ฑ์ ์์์ ์ค์๊ฐ ์๋ฆผ์ผ๋ก ๋ฐ์๋ณผ ์ ์์ต๋๋ค.
- ๋ง์ดํ์ด์ง: ๋ด ํ๋กํ ์ ๋ณด๋ฅผ ์์ ํ๊ณ , ๋ด๊ฐ ๋ฐ์ ์ ์๊ณผ ๋ณด๋ธ ์ ์์ ๊ด๋ฆฌํ๋ฉฐ, ์ฝ์ ๋ด์ญ์ ํ์ธํ ์ ์์ต๋๋ค.
src/
โโโ assets/ # ์ ์ ์์(์ด๋ฏธ์ง, ํฐํธ, ์คํ์ผ)
โ โโโ images/
โ โโโ styles/
โ โโโ fonts/
โโโ components/ # ์ฌ์ฌ์ฉ UI ์ปดํฌ๋ํธ
โ โโโ shareComponents/ # ๋ค์ ํ์ด์ง์์ ๊ณต์
โ โโโ ProfileComponents/ # Profile ์ ์ฉ
โโโ pages/ # ๋ผ์ฐํ
์ฐ๊ฒฐ ํ์ด์ง ๋จ์ ์ปดํฌ๋ํธ
โโโ hooks/ # ์ปค์คํ
ํ
โโโ utils/ # ํฌํผ/์ ํธ ํจ์
โโโ apis/ # API ํธ์ถ ๋ก์ง (React Query ์ฌ์ฉ)
โโโ types/ # ํ์
์ ์
โโโ enums/ # ์ด๊ฑฐํ ์์
โโโ App.tsx # ๋ฃจํธ ์ปดํฌ๋ํธ
โโโ index.tsx # ์ํธ๋ฆฌ ํฌ์ธํธ
๐ ๊ท์น
- ํ์ด์ง ์ ์ฉ ์ปดํฌ๋ํธ๋
components/{Page๋ช }/์ ์์น - ๋ค์ ํ์ด์ง์์ ๊ณต์ ๋๋ ๊ฒฝ์ฐ๋ง
shareComponents/์ ์ ์ฅ - ๋ณ์ โ ํจ์ โ return ์์ ์ ์ง
- ํจ์๋ ํ์ดํ ํจ์ ํํ์๋ง ์ฌ์ฉ
Coffect ํ๋ก์ ํธ๋ ๋ชจ๋ ์น ๊ธฐ์ ์ ์ ๊ทน์ ์ผ๋ก ํ์ฉํ์ฌ, ๋น ๋ฅด๊ณ ์์ ์ ์ธ ๊ฐ๋ฐ ๊ฒฝํ๊ณผ ํ๋ถํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- React & TypeScript
- ์ ์ ์ด์ : ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ํตํด UI๋ฅผ ๋ ๋ฆฝ์ ์ด๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋จ์๋ก ๊ฐ๋ฐํ๊ธฐ ์ํด React๋ฅผ ์ ํํ์ต๋๋ค. ์ฌ๊ธฐ์ TypeScript๋ฅผ ์ ์ฉํ์ฌ ์ปดํ์ผ ๋จ๊ณ์์ ํ์ ์ ๊ฒ์ฆํจ์ผ๋ก์จ, ์ฝ๋์ ์์ ์ฑ์ ๋์ด๊ณ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ์ํ ์ ์๋ ์ ์ฌ์ ๋ฒ๊ทธ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๊ณ ์ ํ์ต๋๋ค.
- Vite
- ์ ์ ์ด์ : ๊ธฐ์กด์ ๋ฒ๋ค๋ฌ(e.g., Webpack) ๋๋น ์๋ฑํ ๋น ๋ฅธ ๊ฐ๋ฐ ์๋ฒ ๊ตฌ๋ ์๋์ HMR(Hot Module Replacement) ์ฑ๋ฅ์ ์ ๊ณตํ๋ Vite๋ฅผ ์ ํํ์ฌ ๊ฐ๋ฐ ์์ฐ์ฑ์ ๊ทน๋ํํ๊ณ ์ ํ์ต๋๋ค.
- React Router (
react-router-dom)- ์ ์ ์ด์ : SPA(Single Page Application)์์ ์ฌ์ฉ์ ๊ฒฝํ์ ํด์น์ง ์์ผ๋ฉด์ ์ฌ๋ฌ ํ์ด์ง ๊ฐ์ ์ด๋์ ๊ตฌํํ๊ธฐ ์ํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก React Router๋ฅผ ์ ํํ์ต๋๋ค.
- React Query (
@tanstack/react-query)- ์ ์ ์ด์ : ํด๋ผ์ด์ธํธ ์ํ์ ์๋ฒ ์ํ๋ฅผ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํ๊ณ , ์๋ฒ์์ ๊ฐ์ ธ์จ ๋ฐ์ดํฐ์ ์บ์ฑ, ๋๊ธฐํ, ์ ๋ฐ์ดํธ ๋ก์ง์ ๊ฐ๊ฒฐํ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด React Query๋ฅผ ์ ํํ์ต๋๋ค. useEffect์ useState๋ก ๋ณต์กํ๊ฒ ๊ด๋ฆฌํด์ผ ํ๋ ๋น๋๊ธฐ ๋ก์ง์ ํฌ๊ฒ ๋จ์ํํ ์ ์์ต๋๋ค.
- Zustand
- ์ ์ ์ด์ : React Query๊ฐ ๊ด๋ฆฌํ์ง ์๋ ์ ์ญ ํด๋ผ์ด์ธํธ ์ํ(e.g., ๋ชจ๋ฌ์ ์ด๋ฆผ/๋ซํ, UI ํ ๋ง ์ค์ )๋ฅผ ์ต์ํ์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฐ๋ณ๊ณ ์ ์ฐํ Zustand๋ฅผ ์ ํํ์ต๋๋ค.
- Tailwind CSS
- ์ ์ ์ด์ : 'Utility-First' ์ ๊ทผ ๋ฐฉ์์ ํตํด ๋ฏธ๋ฆฌ ์ ์๋ ํด๋์ค๋ฅผ ์กฐํฉํ์ฌ HTML ๋ด์์ ์ง์ ์คํ์ผ์ ์ ์ฉํจ์ผ๋ก์จ, ๋น ๋ฅด๊ณ ์ผ๊ด๋ UI ๊ฐ๋ฐ์ ์ํด Tailwind CSS๋ฅผ ๋์ ํ์ต๋๋ค.
- Swiper
- ์ ์ ์ด์ : ๋ณธ ํ๋ก์ ํธ์ ํต์ฌ ๊ธฐ๋ฅ์ธ ํ๋กํ ์นด๋ UI์ฒ๋ผ, ๋ชจ๋ฐ์ผ ํ๊ฒฝ์ ์ต์ ํ๋ ํฐ์น ์ฌ๋ผ์ด๋ ๋ฐ ์ค์์ดํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด Swiper๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
- Socket.IO Client
- ์ ์ ์ด์ : ์ฌ์ฉ์์ ์ฌ์ฉ์ ๊ฐ์ ์ค์๊ฐ ์ฑํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด, ์์ ์ ์ธ ์๋ฐฉํฅ ํต์ ์ฑ๋์ ์ ๊ณตํ๋ Socket.IO๋ฅผ ์ฑํํ์ต๋๋ค.
- Firebase (FCM)
- ์ ์ ์ด์ : ์๋ก์ด ๋งค์นญ, ์ฑํ ๋ฉ์์ง, ์ปคํผ์ฑ ์ ์ ๋ฑ ์ฌ์ฉ์์ ์ฆ๊ฐ์ ์ธ ๋ฐ์์ด ํ์ํ ๊ธฐ๋ฅ์ ์ค์๊ฐ ํธ์ ์๋ฆผ์ ๊ตฌํํ๊ธฐ ์ํด ์์ ์ ์ด๊ณ ๊ฐ๋ ฅํ Firebase Cloud Messaging์ ์ ํํ์ต๋๋ค.
- PWA (
vite-plugin-pwa)- ์ ์ ์ด์ : ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ดํฐ๋ธ ์ฑ์ฒ๋ผ ์ฌ์ฉ์์ ํ ํ๋ฉด์ ์ค์นํ๊ณ , ์คํ๋ผ์ธ ์ํ์์๋ ์ผ๋ถ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋๋ก Progressive Web App ๊ธฐ์ ์ ์ ์ฉํ์ต๋๋ค.
- ESLint & Prettier
- ์ ์ ์ด์ : ์ฌ๋ฌ ๊ฐ๋ฐ์๊ฐ ํจ๊ป ์์ ํ๋๋ผ๋ ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ์ ์ ์งํ๊ณ , ์ ์ฌ์ ์ธ ์๋ฌ๋ฅผ ์ฌ์ ์ ๋ฐ๊ฒฌํ๊ธฐ ์ํด ESLint(์ฝ๋ ๋ฆฐํฐ)์ Prettier(์ฝ๋ ํฌ๋งคํฐ)๋ฅผ ๋์ ํ์ต๋๋ค. husky์ lint-staged๋ฅผ ์ฐ๋ํ์ฌ ์ปค๋ฐ ์ ์๋์ผ๋ก ์ฝ๋ ํ์ง์ ๊ฒ์ฌ ๋ฐ ๊ต์ ํจ์ผ๋ก์จ, ์ ์ฅ์์ ์ฝ๋ ํ์ง์ ๋์ ์์ค์ผ๋ก ์ ์งํ์ต๋๋ค.
- pnpm
- ์ ์ ์ด์ : ๋น ๋ฅธ ์์กด์ฑ ์ค์น ์๋์ ํจ์จ์ ์ธ ๋์คํฌ ๊ณต๊ฐ ํ์ฉ์ ์ํด pnpm์ ํจํค์ง ๋งค๋์ ๋ก ์ ํํ์ต๋๋ค.
- PR ๋์ branch:
feature/* โ developchore/* โ develop
- PR ๋จ์: ๊ธฐ๋ฅ ๋จ์ (UI ํํธ ๋จ์ ๊ธ์ง)
- PR ํ ํ๋ฆฟ ์ฌ์ฉ:
## ๐ PR ์ ๋ชฉ
- A ๊ธฐ๋ฅ ์ถ๊ฐ
- B ๊ธฐ๋ฅ ์ญ์
- C ๊ธฐ๋ฅ ์์
## ๐งฉ ๋ณ๊ฒฝ ์ฌํญ
- ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ ๋์ด
## โ
์ฒดํฌ๋ฆฌ์คํธ
[ ] ์ฝ๋ ์คํ์ผ ์ค์
[ ] ํ
์คํธ ์คํ
[ ] ์ฃผ์ ์์ฑ
## ๐ฌ ๊ธฐํ ์ฐธ๊ณ ์ฌํญ
- ๊ด๋ จ ๋ฌธ์, ๋งํฌ- ํ์ฅ๋ง
develop,main๋จธ์ง - ํ์์
develop์ผ๋ก๋ง PR
ํ์
(์ค์ฝํ): ์ ๋ชฉ
ํ์
์์: feat, fix, chore, docs, refactor, test
| ๋ธ๋์น๋ช | ์ค๋ช |
|---|---|
| main | ์ด์ ๋ฐฐํฌ์ฉ |
| develop | ๋ค์ ๋ฐฐํฌ ์ค๋น์ฉ |
| feature/* | ๊ธฐ๋ฅ ๊ฐ๋ฐ์ฉ |
| release/* | ๋ฐฐํฌ ์ค๋น |
| hotfix/* | ๊ธด๊ธ ์์ |
์์:
feature/login
feature/login-42
release-1.0
hotfix-1.2.1
Bug reportํ ํ๋ฆฟ: ๋ฒ๊ทธ ๋ฐ์ ์ ์ฌํ ๋ฐฉ๋ฒ, ์คํฌ๋ฆฐ์ท, ํ๊ฒฝ ์ ๋ณด ์์ฑFeature requestํ ํ๋ฆฟ: ๊ธฐ๋ฅ ์ ์ ์ฌ์ , ๊ตฌํ ์์ด๋์ด ์์ฑ
- ๋ณ์ โ ํจ์ โ return ์
- ํจ์๋ ํ์ดํ ํจ์ ํํ์๋ง ์ฌ์ฉ
export/default๋ ํ์ผ ํ๋จ- ์ฃผ์ ํ์: ํ์ผ ์๋จ, ํจ์ ์, ๋ณต์ก ๋ก์ง, JSX ๋ด๋ถ ํ์ ์
fetch๋์useQuery/useMutation์ฌ์ฉ
pnpm์ฌ์ฉ (npm, yarn ๊ธ์ง)- ์ ๊ธฐํ์: ์ฃผ 2ํ (3~4์ผ ๊ฐ๊ฒฉ)
- ๊ธฐ๋ฅ ์ง์ฐ ์ Discord ํ๋ฉด ๊ณต์ ํ์
| ํจํค์ง๋ช | ์ค์น ๋ช ๋ น์ด | ์ฌ์ฉ ๋ชฉ์ |
|---|---|---|
| swiper | pnpm add swiper |
์นด๋ํ ์ฌ๋ผ์ด๋ UI ๊ตฌํ. (ํ๋กํ ์นด๋ ํ๋ฆฝ, ๋ฐฐ๋ ์ฌ๋ผ์ด๋ ๋ฑ) |
| react-date-picker | npm install react-date-picker |
๋ ์ง ์ ํ UI ๊ตฌํ. (react-day-picker ๋์ฒด) |
| @tailwindcss/line-clamp | pnpm install -D @tailwindcss/line-clamp |
๊ธด ํ ์คํธ๋ฅผ ์ผ์ ์ค ์์์ ๋ง์ค์(...) ์ฒ๋ฆฌ. |
| zustand | pnpm add zustand |
์ ์ญ ์ํ ๊ด๋ฆฌ. |
| husky | npm install husky --save-dev |
Git hook ์๋ํ (์ปค๋ฐ ์ lint ๊ฒ์ฌ ๋ฑ). |
| lint-staged | npm install --save-dev lint-staged |
Git staged ํ์ผ์๋ง lint/ํฌ๋งท ์ ์ฉ. |
| vite-tsconfig-paths | npm install --save-dev vite-tsconfig-paths |
Vite์์ tsconfig.json ๊ฒฝ๋ก ๋ณ์นญ ์ธ์. |
| axios | pnpm i axios |
HTTP ์์ฒญ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. |
| locomotive-scroll | pnpm add locomotive-scroll |
๋ถ๋๋ฌ์ด ์คํฌ๋กค, ์คํฌ๋กค ๊ฐ์ง ์ด๋ฒคํธ ๊ตฌํ. |
| socket.io-client | pnpm add socket.io-client |
์ค์๊ฐ ์๋ฐฉํฅ ํต์ (์ฑํ , ์๋ฆผ ๋ฑ). |
| firebase | pnpm add firebase |
FCM ํธ์ ์๋ฆผ, Firebase ์๋น์ค ์ฐ๋. |
| vite-plugin-pwa | pnpm add -D vite-plugin-pwa |
Vite ๊ธฐ๋ฐ PWA(Service Worker, ์บ์ฑ, ์คํ๋ผ์ธ ์ง์). |
| workbox-precaching | pnpm add workbox-precaching |
PWA ์๋น์ค ์์ปค์์ ์ ์ ๋ฆฌ์์ค ์ฌ์ ์บ์ฑ. |
| @tanstack/react-query | pnpm add @tanstack/react-query |
useQuery, useMutation ํ
์ฌ์ฉ์ ์ํ ์๋ฒ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ. API ํธ์ถ ๊ฒฐ๊ณผ ์บ์ฑยท๋น๋๊ธฐ ๋ฐ์ดํฐ fetching ์ต์ ํ. |
- ๋ฌธ์ ์ํฉ
- ์๋น์ค๋ฅผ Vercel ํ๊ฒฝ์ ๋ฐฐํฌํ ๋ค, ํ๋ก ํธ์๋์์ ์์ผ ํต์ ์ ์๋ํ์ ๋ ์ฐ๊ฒฐ์ด ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. HTTPS ๊ธฐ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ์์ ์์ผ ์ฐ๊ฒฐ์ด ์๋๋์์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋ ์๋ฒ ์ฃผ์๊ฐ ๋ง์ง ์์ ์์ฒญ์ด ์๋ชป๋ ์๋ํฌ์ธํธ๋ก ํฅํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ฐ๊ฒฐ์ด ์คํจํ์ต๋๋ค. ํนํ WebSocket์ HTTP์ ๋ฌ๋ฆฌ ํ๋กํ ์ฝ(
wss://)๊ณผ ๋๋ฉ์ธ ์ค์ ์ด ์ ํํด์ผ ํ๋ฏ๋ก, ์๋ชป๋ ๊ฒฝ๋ก๋ก ์์ฒญํ๋ฉด ์ฐ๊ฒฐ์ด ๋ฐ๋ก ๋์ด์ง๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- ์๋น์ค๋ฅผ Vercel ํ๊ฒฝ์ ๋ฐฐํฌํ ๋ค, ํ๋ก ํธ์๋์์ ์์ผ ํต์ ์ ์๋ํ์ ๋ ์ฐ๊ฒฐ์ด ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. HTTPS ๊ธฐ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ์์ ์์ผ ์ฐ๊ฒฐ์ด ์๋๋์์ง๋ง, ๊ธฐ๋ณธ์ ์ผ๋ก ์ค์ ๋ ์๋ฒ ์ฃผ์๊ฐ ๋ง์ง ์์ ์์ฒญ์ด ์๋ชป๋ ์๋ํฌ์ธํธ๋ก ํฅํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ฐ๊ฒฐ์ด ์คํจํ์ต๋๋ค. ํนํ WebSocket์ HTTP์ ๋ฌ๋ฆฌ ํ๋กํ ์ฝ(
- ํด๊ฒฐ ๊ณผ์
- ์ฒ์์๋
.env๋ฅผ ์์ ํ์ฌ ํ๋ก ํธ์๋์์ ์ฌ๋ฐ๋ฅธ API ์ฃผ์๋ฅผ ์ฐธ์กฐํ๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํ์ผ๋, ํ๋ก ํธ์ ๋ฐฑ์๋ ๊ฐ ๋๋ฉ์ธ ๋ถ์ผ์น ๋ฌธ์ ๋ก ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ด ๋์ง ์์์ต๋๋ค. - ์ด์ ๋ฐฑ์๋ ์๋ฒ์ nginx ์ค์ ์ ์์ ํ์ฌ, ์ค์ ์๋น์ค ๋๋ฉ์ธ๊ณผ ๋ฐฐํฌ ํ๊ฒฝ(Vercel)์์ ์ฌ์ฉํ๋ ์ฃผ์๋ฅผ ์ผ์น์ํค๋ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ์ต๋๋ค.
server_name๊ณผ ํ๋ก์ ์ค์ ์ ๋ณ๊ฒฝํด ์์ผ ํต์ ์์ฒญ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฑ์๋ ์๋ฒ๋ก ๋ผ์ฐํ ๋๋๋ก ํ์ต๋๋ค.
- ์ฒ์์๋
- ๊ฒฐ๊ณผ
- nginx ์ค์ ๋ณ๊ฒฝ ํ, Vercel ๋ฐฐํฌ ํ๊ฒฝ์์๋ ์์ผ ์ฐ๊ฒฐ์ด ์ ์์ ์ผ๋ก ์ด๋ฃจ์ด์ก์ต๋๋ค. ์ด์ ํ๋ก ํธ์๋๊ฐ ์ด๋ค ํ๊ฒฝ์์ ๋ฐฐํฌ๋๋๋ผ๋, ํด๋น ๋๋ฉ์ธ์ ํตํด ์์ ์ ์ผ๋ก ์์ผ ํต์ ์ ํ ์ ์๊ฒ ๋์์ผ๋ฉฐ, ์ค์๊ฐ ์ฑํ ๋ฐ ๋ฐ์ดํฐ ๋๊ธฐํ ๊ธฐ๋ฅ์ด ์ ์ ๋์ํ๊ฒ ๋์์ต๋๋ค.
๊ณต์ ์ปดํฌ๋ํธ์ ์ํ ๋ถ์ผ์น ๋ฌธ์ ํด๊ฒฐ: API ์๋ต ๋ฐ์ดํฐ ๋ถ์์ ํตํ ์์ธ ๊ท๋ช
- ๋ฌธ์ ์ํฉ
- ํ๋ก์ ํธ ๋ด ์ฌ๋ฌ ํ์ด์ง(์ปค๋ฎค๋ํฐ ํผ๋, ๋ง์ดํ์ด์ง ๋ฑ)์์ ์ฌ์ฌ์ฉ๋๋ ๊ณต์ ์ปดํฌ๋ํธ์ธ
FeedItem.tsx๊ฐ ์์์ต๋๋ค. ๋๋ถ๋ถ์ ํ์ด์ง์์๋ '์ข์์'์ '๋ถ๋งํฌ' ๋ฒํผ์ด ์ ์์ ์ผ๋ก ๋์ํ์ง๋ง, ํน์ ํ์ด์ง์์๋ง ๋ฒํผ์ ํด๋ฆญํด๋ UI(์ข์์ ์์๊ณผ ์นด์ดํธ / ๋ถ๋งํฌ ์์)๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ์ํ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋์ผํ ์ปดํฌ๋ํธ๊ฐ ๋ค๋ฅธ ํ์ด์ง์์๋ ์ ์ ๋์ํ๊ธฐ ๋๋ฌธ์, ๋ฌธ์ ์ ์์ธ์ ํ์ ํ๊ธฐ ์ด๋ ค์ด ์ด๊ธฐ ์ํฉ์ด์์ต๋๋ค.
- ํ๋ก์ ํธ ๋ด ์ฌ๋ฌ ํ์ด์ง(์ปค๋ฎค๋ํฐ ํผ๋, ๋ง์ดํ์ด์ง ๋ฑ)์์ ์ฌ์ฌ์ฉ๋๋ ๊ณต์ ์ปดํฌ๋ํธ์ธ
- ํด๊ฒฐ ๊ณผ์
- ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด, ํ๋ก ํธ์๋ ๋ก์ง์ ๋ฌธ์ ์ธ์ง ๋ฐฑ์๋ API์ ๋ฌธ์ ์ธ์ง๋ฅผ ๋ช ํํ ์๋ณํ๋ ๊ฒ์ ์ต์ฐ์ ๋ชฉํ๋ก ์ผ๊ณ ์ฒด๊ณ์ ์ธ ๋๋ฒ๊น ์ ์งํํ์ต๋๋ค.
- ๊ฐ์ค ์๋ฆฝ: '์ปดํฌ๋ํธ์ ๋ก์ง์ ๋์ผํ๋ฏ๋ก, ๊ฐ ํ์ด์ง์ ์ ๋ฌ๋๋ ๋ฐ์ดํฐ๋ API ์๋ต์ ์ฐจ์ด๊ฐ ์์ธ์ผ ๊ฒ์ด๋ค'๋ผ๋ ๊ฐ์ค์ ์ธ์ ์ต๋๋ค.
- ์ ์ ๋์ ๊ธฐ์ค์ ํ์ธ: ๋จผ์ , ๊ธฐ๋ฅ์ด ์ ์ ๋์ํ๋ ํ์ด์ง์์ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ '๋คํธ์ํฌ' ํญ์ ์ด์์ต๋๋ค. '์ข์์' ๋ฒํผ ํด๋ฆญ ์ ํ์ API ์๋ต(Response) ๋ฐ์ดํฐ๋ฅผ ์บก์ฒํ์ฌ, ์ฑ๊ณต ์ ์๋ฒ๊ฐ ์ด๋ค ํ์๊ณผ ๋ฐ์ดํฐ๋ก ์๋ตํ๋์ง์ ๋ํ ๋ช ํํ ๊ธฐ์ค์ ์ ํ๋ณดํ์ต๋๋ค.
- ๋ฌธ์ ์ง์ ๋น๊ต ๋ถ์: ๋ค์์ผ๋ก, ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ํ์ด์ง์์ ๋์ผํ ์์ ์ ๋ฐ๋ณตํ์ต๋๋ค. ๋ฒํผ ํด๋ฆญ ํ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ API ์๋ต์ ์ ์ ๋์ ๊ธฐ์ค์ ๊ณผ ๋น๊ต ๋ถ์ํ ๊ฒฐ๊ณผ, ๋ฌธ์ ๊ฐ ๋๋ ํ์ด์ง์ API ์๋ต์๋ ์ ๋ฐ์ดํธ๋ '์ข์์' ์ํ๋ '์นด์ดํธ' ์ ๋ณด๊ฐ ๋๋ฝ๋์ด ์๊ฑฐ๋, ๋ค๋ฅธ ํ์์ผ๋ก ์ ๋ฌ๋๊ณ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
- ์์ธ ๊ท๋ช ๋ฐ ํ์ : ํ๋ก ํธ์๋ ์ปดํฌ๋ํธ๋ ์ ์์ด์์ผ๋, ํน์ API ์๋ํฌ์ธํธ์์ ๋น์ ์์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์๋ตํ๊ณ ์์์ด ๋ช ํํด์ก์ต๋๋ค. ์ด์ฒ๋ผ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐํ ๊ตฌ์ฒด์ ์ธ ๊ทผ๊ฑฐ(์ ์/๋น์ ์ ์๋ต ๋ฐ์ดํฐ ๋น๊ต ์๋ฃ)๋ฅผ ์ค๋นํ์ฌ ๋ฐฑ์๋ ํ์ ์ ๋ฌํ๊ณ , ๋๋ถ์ ๋ฐฑ์๋ ํ์ ๋ฌธ์ ์ ์์ธ์ ์ ์ํ๊ฒ ํ์ ํ๊ณ ํด๋น API๋ฅผ ์์ ํ ์ ์์์ต๋๋ค.
- ๊ฒฐ๊ณผ
- ๋ฐฑ์๋ API ์์ ํ, ๋ชจ๋ ํ์ด์ง์์ '์ข์์' ๋ฐ '๋ถ๋งํฌ' ๊ธฐ๋ฅ์ด ์ผ๊ด๋๊ฒ ๋์ํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค. ์ด ๊ฒฝํ์ ํตํด ๋ณต์กํ ๋ฌธ์ ์ํฉ์์ ์ฃ๋ถ๋ฆฌ ์ฝ๋๋ฅผ ์์ ํ๊ธฐ๋ณด๋ค, ์ฒด๊ณ์ ์ธ ๋ฐ์ดํฐ ๋ถ์์ ํตํด ๋ฌธ์ ์ ์์ธ์ ์ ํํ ๋ถ๋ฆฌํด๋ด๋ ๋๋ฒ๊น ํ๋ก์ธ์ค์ ์ค์์ฑ์ ๋ค์ ํ๋ฒ ๊นจ๋ฌ์์ต๋๋ค. ๋ํ, ํ ๊ฐ์ ํ์ ์ ์์ด ๋ช ํํ ๊ทผ๊ฑฐ ์๋ฃ๊ฐ ์ผ๋ง๋ ํจ์จ์ ์ธ ์ํต๊ณผ ๋น ๋ฅธ ๋ฌธ์ ํด๊ฒฐ์ ์ด๋์ด๋ด๋์ง ๋ฐฐ์ธ ์ ์์์ต๋๋ค.
- ๋ฌธ์ ์ํฉ
- ๋ฌดํ ์นด๋ ๋ฒ๊ทธ: ํ๋ฃจ์ ์ ๊ณต๋๋ 3์ฅ์ ์ถ์ฒ ์นด๋๋ฅผ ๋ชจ๋ ์์งํ์ ๋, ๊ธฐ๋ฅ์ด ์ข ๋ฃ๋์ง ์๊ณ ๋ง์ง๋ง ์นด๋๊ฐ ๊ณ์ํด์ ๋ณด์ด๋ '๋ฌดํ ๋ฃจํ' ํ์์ด ๋ฐ์ํ์ต๋๋ค. ์ด๋ ์ฌ์ฉ์์๊ฒ ๊ธฐ๋ฅ์ด ๋๋ฌ๋ค๋ ๋ช ํํ ํผ๋๋ฐฑ์ ์ฃผ์ง ๋ชปํ๋ ์ฌ๊ฐํ ๋ฒ๊ทธ์์ต๋๋ค.
- ์นด๋ ์ ํ ์ UI ๊นจ์ง: ์ฌ์ฉ์๊ฐ ์นด๋๋ฅผ ๋น ๋ฅด๊ฒ ๋๊ธธ ๋(Swipe), ๋ค์ ์นด๋์ ๋ฐ์ดํฐ๊ฐ ๋ฏธ์ฒ ๋ก๋๋์ง ์์ ์ด์ ์นด๋์ ์ ๋ณด๊ฐ ์ ์ ๋ ธ์ถ๋๊ฑฐ๋, ๋น์ด์๋ ์นด๋๊ฐ ๋ณด์ด๋ ๋ฑ ์๊ฐ์ ์ผ๋ก ๋งค๋๋ฝ์ง ๋ชปํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ์ต๋๋ค.
- ํด๊ฒฐ ๊ณผ์
- ๋ช
ํํ API ๊ณ์ฝ ์๋ฆฝ ๋ฐ ์ข
๋ฃ ์ํ ์ฒ๋ฆฌ
- ์์ธ ๋ถ์: ์ด๊ธฐ API๋ ์ถ์ฒ ์นด๋๊ฐ ๋ชจ๋ ์์ง๋์์ ๋, ๋ง์ง๋ง ์นด๋ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ ๋ฐํํ๊ณ ์์์ต๋๋ค. ํ๋ก ํธ์๋์์๋ ์ด๋ฅผ ์๋ฌ ์ํฉ์ผ๋ก ์ธ์งํ ์ ์์์ต๋๋ค.
- ํด๊ฒฐ: ๋ฐฑ์๋ ํ๊ณผ์ ํ์๋ฅผ ํตํด, ๋ ์ด์ ์ถ์ฒํ ์นด๋๊ฐ ์์ ๊ฒฝ์ฐ null์ ๋ฐํํ๋๋ก API ๋ช
์ธ๋ฅผ ์ฌ์ ์ํ์ต๋๋ค. ํ๋ก ํธ์๋์์๋
getCurrentRecommendedCardAPI์ ์๋ต์ด null์ผ ๊ฒฝ์ฐ, '์ค๋์ ์ถ์ฒ์ด ๋ชจ๋ ์ข ๋ฃ๋์์ต๋๋ค'์ ๊ฐ์ ์๋ฃ ํ๋ฉด์ ๋ ๋๋งํ๋๋ก ๋ก์ง์ ์์ ํ์ฌ '๋ฌดํ ๋ฃจํ' ๋ฒ๊ทธ๋ฅผ ๊ทผ๋ณธ์ ์ผ๋ก ํด๊ฒฐํ์ต๋๋ค.
setQueryData๋ฅผ ํ์ฉํ ๋๊ด์ ์ ๋ฐ์ดํธ(Optimistic Update) ์ ์ฉ:- ์์ธ ๋ถ์: ์นด๋ ์ ํ UI ๊นจ์ง ํ์์ ์นด๋ ์คํต
initOrSkipCardAPI ํธ์ถ ํ, ๋ค์ ์นด๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋getCurrentRecommendedCardAPI๊ฐ ํธ์ถ๋๊ธฐ๊น์ง์ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ ๋๋ฌธ์ ๋ฐ์ํ์ต๋๋ค. - ํด๊ฒฐ: ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด React Query์
setQueryData๊ธฐ๋ฅ์ ํ์ฉํ์ต๋๋ค.initOrSkipCardMutation์ด ์ฑ๊ณตํ๋ ์ฆ์, ๋คํธ์ํฌ ์์ฒญ์ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ค์ ์นด๋์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐ์์ setQueryData๋ก ์บ์๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ์ต๋๋ค. ์ด '๋๊ด์ ์ ๋ฐ์ดํธ' ๋ฐฉ์์ ํตํด, UI๋ ๋ค์ ์นด๋๋ฅผ ๋ ๋๋งํ ์์ ์ ์ด๋ฏธ ์บ์์ ์ค๋น๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์ด ๋คํธ์ํฌ ์ง์ฐ์ผ๋ก ์ธํ ์๊ฐ์ ๊นจ์ง ํ์์ ์๋ฒฝํ๊ฒ ์ ๊ฑฐํ๊ณ ๋งค์ฐ ๋ถ๋๋ฌ์ด ์นด๋ ์ ํ ๊ฒฝํ์ ๊ตฌํํ ์ ์์์ต๋๋ค.
- ์์ธ ๋ถ์: ์นด๋ ์ ํ UI ๊นจ์ง ํ์์ ์นด๋ ์คํต
- ๋ช
ํํ API ๊ณ์ฝ ์๋ฆฝ ๋ฐ ์ข
๋ฃ ์ํ ์ฒ๋ฆฌ
- ๊ฒฐ๊ณผ
- ๋ฐฑ์๋์์ ๊ธด๋ฐํ ํ์ ๊ณผ React Query์ ๊ณ ๊ธ ๊ธฐ๋ฅ ํ์ฉ์ ํตํด, ์ถ์ฒ ์นด๋ ๊ธฐ๋ฅ์ ์์ ์ฑ์ ํ๋ณดํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์์ต๋๋ค. ์ด ๊ณผ์ ์์ ๋ช ํํ API ๊ณ์ฝ์ ์ค์์ฑ๊ณผ, ๋คํธ์ํฌ ์ง์ฐ์ ๊ณ ๋ คํ ํ๋ก ํธ์๋ ์ํ ๊ด๋ฆฌ ๊ธฐ๋ฒ์ด ์ผ๋ง๋ ์ค์ํ์ง ๋ฐฐ์ธ ์ ์์์ต๋๋ค.
- ๋ฌธ์ ์ํฉ
- ์ฑํ
๋ฐฉ ํ์ด์ง์ ์ง์
ํ ํ, ๋ด๋ถ์ ํน์ ๊ธฐ๋ฅ(e.g., ์ผ์ ๋ฑ๋ก)์ ์ฌ์ฉํ๊ธฐ ์ํด
coffectId๋ผ๋ ๊ฐ์ด ํ์ํ์ต๋๋ค. ํ์ง๋ง ์ฑํ ๋ฐฉ ๋ชฉ๋ก ํ์ด์ง์์ ์ฑํ ๋ฐฉ ํ์ด์ง๋ก ์ด๋ํ ๋ ์ด coffectId ๊ฐ์ ์ ๋ฌํ์ง ์์, ์ฑํ ๋ฐฉ ํ์ด์ง๋ coffectId๋ฅผ ์ป๊ธฐ ์ํด ๋ถํ์ํ API๋ฅผ ์ถ๊ฐ๋ก ํธ์ถํด์ผ๋ง ํ์ต๋๋ค. ์ด๋ ํ์ด์ง ๋ก๋ฉ ์๋๋ฅผ ์ ํ์ํค๊ณ ์๋ฒ์ ๋ถ๋ด์ ์ฃผ๋ ๋นํจ์จ์ ์ธ 'API ์ํฐํด(Waterfall)' ํ์์ ์ผ๊ธฐํ์ต๋๋ค.
- ์ฑํ
๋ฐฉ ํ์ด์ง์ ์ง์
ํ ํ, ๋ด๋ถ์ ํน์ ๊ธฐ๋ฅ(e.g., ์ผ์ ๋ฑ๋ก)์ ์ฌ์ฉํ๊ธฐ ์ํด
- ํด๊ฒฐ ๊ณผ์
- ์์ธ ๋ถ์: ๋ฌธ์ ์ ๊ทผ๋ณธ ์์ธ์ ํ์ด์ง ๊ฐ ์ด๋(Routing) ์ ํ์ํ ๋ฐ์ดํฐ๊ฐ ์ถฉ๋ถํ ์ ๋ฌ๋์ง ์๋๋ค๋ ์ ์ด์์ต๋๋ค.
- ๊ตฌ์กฐ ๊ฐ์ : ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐ์ดํฐ ์ ๋ฌ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํ์ต๋๋ค. ์ฑํ
๋ฐฉ ๋ชฉ๋ก์์ coffectId๋ฅผ ์ด๋ฏธ ์๊ณ ์์ผ๋ฏ๋ก, ํน์ ์ฑํ
๋ฐฉ์ผ๋ก ์ด๋ํ ๋ URL ํ๋ผ๋ฏธํฐ (/chat/:coffectId) ๋๋ React Router์
state๋ฅผ ํตํด coffectId๋ฅผ ์ง์ ์ ๋ฌํ๋๋ก ๋ก์ง์ ์์ ํ์ต๋๋ค. - API ํธ์ถ ์ ๊ฑฐ: ์ฑํ ๋ฐฉ ํ์ด์ง๋ ์ด์ ์ง์ ์์ ๋ถํฐ coffectId๋ฅผ ์ง์ ์ ๋ฌ๋ฐ๊ฒ ๋์ด, ๋ ์ด์ coffectId๋ฅผ ์ป๊ธฐ ์ํ ๋ณ๋์ API๋ฅผ ํธ์ถํ ํ์๊ฐ ์์ด์ก์ต๋๋ค.
- ๊ฒฐ๊ณผ:
- ๋ถํ์ํ API ํธ์ถ ๋ก์ง์ ์ ๊ฑฐํจ์ผ๋ก์จ ์ฑํ ๋ฐฉ์ ๋ก๋ฉ ์๋๋ฅผ ๋์ ๋๊ฒ ๊ฐ์ ํ๊ณ ์๋ฒ์ ๋ถ๋ด์ ์ค์์ต๋๋ค. ์ด ๊ฒฝํ์ ํตํด SPA(Single Page Application) ํ๊ฒฝ์์ ํจ์จ์ ์ธ ํ์ด์ง ์ ํ์ ์ํด์๋ ์ปดํฌ๋ํธ๋ ํ์ด์ง ๊ฐ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฌํ๋ ๋ผ์ฐํ ์ค๊ณ์ ์ค์์ฑ์ ๋ฐฐ์ธ ์ ์์์ต๋๋ค.
- ๋ฌธ์ ์ํฉ
- '๊ณต๊ฐ ์๊ฐ ์กฐํ' ๊ธฐ๋ฅ์ ๋ ์ฌ์ฉ์๊ฐ ๊ณตํต์ผ๋ก ๋น์ด์๋ ์๊ฐ์ ๋ณด์ฌ์ฃผ๋ ๊ธฐ๋ฅ์ ๋๋ค. ๋ฐฑ์๋์์๋ ๋ฐ์ดํฐ ํจ์จ์ฑ์ ์ํด ๊ฐ ์ฌ์ฉ์์ ์ ์ฒด ์๊ฐํ๋ฅผ '100101...'๊ณผ ๊ฐ์ ํํ์ ๊ธด ๋นํธ์ด(Bitmask) ๋ฐ์ดํฐ๋ก ์ ๋ฌํ์ต๋๋ค. ํ๋ก ํธ์๋์์๋ ์ด ๋นํธ๋ง์คํฌ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์, ๋ ์ฌ์ฉ์์ ๊ณตํต ์๊ฐ์ ๊ณ์ฐํ๊ณ , ์ด๋ฅผ '์ 10:00, ์ 14:00'์ฒ๋ผ ์ฌ์ฉ์๊ฐ ์ฝ๊ฒ ์ดํดํ ์ ์๋ ํํ๋ก ๋ณํํด์ผ ํ๋ ๊ณผ์ ๊ฐ ์์์ต๋๋ค.
- ํด๊ฒฐ ๊ณผ์
- ๊ณตํต ์๊ฐ ๊ณ์ฐ: ๋ ์ฌ์ฉ์์ ๋นํธ๋ง์คํฌ ๋ฌธ์์ด์ ์ ๋ ฅ๋ฐ์, ๊ฐ ์๋ฆฌ์ ๋ํด ๋นํธ AND ์ฐ์ฐ(&)์ ์ํํ๋ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ ์ฌ์ฉ์ ๋ชจ๋ '1'(๊ณต๊ฐ)์ธ ์๊ฐ๋๋ง '1'๋ก ๋จ๋ ์๋ก์ด ๋นํธ๋ง์คํฌ(๊ณตํต ๊ณต๊ฐ ์๊ฐ)๋ฅผ ์์ฑํ์ต๋๋ค.
- ๋ฐ์ดํฐ ๋ณํ ๋ฐ ์๊ฐํ: ์์ฑ๋ ๊ณตํต ๊ณต๊ฐ ์๊ฐ ๋นํธ๋ง์คํฌ๋ฅผ ์ํํ๋ฉฐ '1'์ด ์์นํ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์์ต๋๋ค. ๊ฐ ์ธ๋ฑ์ค๋ '์์์ผ 9์', '์์์ผ 10์' ๋ฑ ๋ฏธ๋ฆฌ ์ ์๋ ์๊ฐํ์ ํน์ ์๊ฐ๋์ ๋งคํ๋๋๋ก ์ค๊ณํ์ต๋๋ค. ์ด ๋งคํ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก, ์ต์ข ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์์๋ณด๊ธฐ ์ฌ์ด ๋ฌธ์์ด ํํ๋ก ๋ณํํ์ฌ ํ๋ฉด์ ํ์ํ์ต๋๋ค.
- ๊ฒฐ๊ณผ:
- ๋ฐฑ์๋๋ก๋ถํฐ ๋ฐ์ ์์ถ๋ ๋นํธ๋ง์คํฌ ๋ฐ์ดํฐ๋ฅผ ํ๋ก ํธ์๋์์ ์ฑ๊ณต์ ์ผ๋ก ํ์ฑํ๊ณ ๊ฐ๊ณตํ์ฌ, ๋ณต์กํ ์๊ฐํ ์ ๋ณด๋ฅผ ์ฌ์ฉ์ ์นํ์ ์ธ UI๋ก ์ ๊ณตํ ์ ์์์ต๋๋ค. ์ด ๊ณผ์ ์์ ์๋ฒ ๋ฐ์ดํฐ ํ์์ ๋ง์ถฐ ํด๋ผ์ด์ธํธ์์ ๋น์ฆ๋์ค ๋ก์ง์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๋ฅ๋ ฅ๊ณผ, ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉ์ ๊ด์ ์์ ์ ์๋ฏธํ ์ ๋ณด๋ก ์๊ฐํํ๋ ๋ฅ๋ ฅ์ ๊ธฐ๋ฅผ ์ ์์์ต๋๋ค.
์ปดํฌ๋ํธ ๋ฐ์ดํฐ ํ๋ฆ ๋ฆฌํฉํ ๋ง: ์๋ชป๋ Hook ์ฌ์ฉ์ผ๋ก ์ธํ ๋ฐ์ดํฐ ๋ถ์ผ์น ํด๊ฒฐ
- ๋ฌธ์ ์ํฉ
- ๊ฒ์๊ธ ์์ธ ํ์ด์ง (
PostDetailPage.tsx)์ ์๋ ๋๊ธ ์ ๋ ฅ ์ปดํฌ๋ํธ(CommentInput.tsx)์์ ๋๊ธ์ ์์ฑํ๋ ค๋ ํ์ฌ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์์ ํ๋กํ ์ด๋ฏธ์ง๊ฐ ์๋ ๊ฒ์๊ธ ์์ฑ์์ ํ๋กํ ์ด๋ฏธ์ง๊ฐ ํ์๋๋ ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ต๋๋ค. ์ด๋ ์ฌ์ฉ์์๊ฒ ๋ง์น ๋ค๋ฅธ ์ฌ๋์ ์ ๋ถ์ผ๋ก ๋๊ธ์ ๋ค๋ ๋ฏํ ํผ๋์ ์ฃผ๋ ์ฌ๊ฐํ UI ์ค๋ฅ์์ต๋๋ค.
- ๊ฒ์๊ธ ์์ธ ํ์ด์ง (
- ํด๊ฒฐ ๊ณผ์
- ์์ธ ๋ถ์: ์ฝ๋ ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ, ๋ฌธ์ ์ ์์ธ์ CommentInput ์ปดํฌ๋ํธ ๋ด์์
usePostDetail์ด๋ผ๋ ํ ์ ์ง์ ํธ์ถํ์ฌ ์ฌ์ฉํ๊ณ ์์๊ธฐ ๋๋ฌธ์ด์์ต๋๋ค. ์ด ํ ์ ์ด๋ฆ ๊ทธ๋๋ก '๊ฒ์๊ธ ์์ธ ์ ๋ณด'๋ฅผ ๊ฐ์ ธ์ค๋ ์ญํ ์ ํ๋ฏ๋ก, ํด๋น ํ ์ด ๋ฐํํ๋ ํ๋กํ ์ด๋ฏธ์ง๋ ๋น์ฐํ '๊ฒ์๊ธ ์์ฑ์'์ ๊ฒ์ด์์ต๋๋ค. ์ด๋ ์ปดํฌ๋ํธ๊ฐ ์์ ์ ์ญํ ๋ฒ์๋ฅผ ๋์ด์๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํธ์ถํ์ฌ ์ฌ์ฉํ ์ค๊ณ์์ ์ค๋ฅ์์ต๋๋ค. - ๋ฐ์ดํฐ ํ๋ฆ ์ฌ์ค๊ณ: CommentInput ์ปดํฌ๋ํธ๋ ๋๊ธ ์ ๋ ฅ์๋ง ์ง์คํด์ผ ํ๋ฉฐ, ํ์ฌ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ์ ๋ณด๋ ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ๋ ๊ฒ์ด ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ ํ๋ฆ์ด๋ผ๊ณ ํ๋จํ์ต๋๋ค. ์ด์ ๋ฐ๋ผ CommentInput ์ปดํฌ๋ํธ ๋ด๋ถ์ usePostDetail ํ ํธ์ถ ๋ก์ง์ ๊ณผ๊ฐํ ์ ๊ฑฐํ์ต๋๋ค.
- Props ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌํฉํ ๋ง: CommentInput ์ปดํฌ๋ํธ๊ฐ currentUserProfileImage๋ผ๋ ์ด๋ฆ์ Prop์ ๋ฐ์์ ํ๋กํ ์ด๋ฏธ์ง๋ก ์ฌ์ฉํ๋๋ก ์์ ํ์ต๋๋ค. ์ด๋ฅผ ํตํด CommentInput์ ๋ฐ์ดํฐ์ ์ถ์ฒ๋ฅผ ์ ๊ฒฝ ์ธ ํ์ ์์ด, ์ ๋ฌ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ ์ญํ ์๋ง ์ถฉ์คํ ์ฌ์ฌ์ฉ์ฑ ๋์ ์ปดํฌ๋ํธ๊ฐ ๋์์ต๋๋ค.
- ์์ ์ปดํฌ๋ํธ์ ์ฑ ์ ๋ถ์ฌ: ์์ ์ปดํฌ๋ํธ์ธ PostDetailPage.tsx๊ฐ ํ์ฌ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์์ ํ๋กํ ์ ๋ณด(e.g., profile.ts์ getProfile API๋ฅผ ์ฌ์ฉํ๋ ํ ์ ํตํด)๋ฅผ ๊ฐ์ ธ์์, CommentInput์ currentUserProfileImage Prop์ผ๋ก ์ ํํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋๋ก ์์ ํ์ต๋๋ค.
- ์์ธ ๋ถ์: ์ฝ๋ ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ, ๋ฌธ์ ์ ์์ธ์ CommentInput ์ปดํฌ๋ํธ ๋ด์์
- ๊ฒฐ๊ณผ:
- ๋ฒ๊ทธ๋ฅผ ํด๊ฒฐํ์ฌ ๋๊ธ ์ ๋ ฅ์ฐฝ์ ์ ํํ ์ฌ์ฉ์์ ํ๋กํ ์ด๋ฏธ์ง๊ฐ ํ์๋๋๋ก ์์ ํ์ต๋๋ค. ๋ ๋์๊ฐ, ์ปดํฌ๋ํธ์ ์ฑ ์์ ๋ช ํํ ๋ถ๋ฆฌํ๊ณ ๋ถ๋ชจ-์์ ๊ฐ์ ๋ฐ์ดํฐ ํ๋ฆ์ Props๋ฅผ ํตํด ๋จ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๋๋ก ๋ฆฌํฉํ ๋งํจ์ผ๋ก์จ, ๋ ์์ธก ๊ฐ๋ฅํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ฌ์ด ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์์ต๋๋ค. ์ด ๊ฒฝํ์ ๊ฐ ์ปดํฌ๋ํธ์ ์ญํ ์ ๋ช ํํ ์ ์ํ๊ณ ์ฌ๋ฐ๋ฅธ ๋ฐ์ดํฐ ํ๋ฆ์ ์ค๊ณํ๋ ๊ฒ์ ์ค์์ฑ์ ๊นจ๋ซ๊ฒ ํด์ฃผ์์ต๋๋ค.
AI ์ฝ๋ ๋ฆฌ๋ทฐ์ด (CodeRabbit)
CodeRabbit ๋์ ๊ธฐ
ํ๋ก์ ํธ ์ด๊ธฐ์ ํ์ 3๋ช ์ Pull Request(PR) ๋ฆฌ๋ทฐ๋ฅผ ํ์ฅ ํ ๋ช ์ด ๋งก๋ค๋ณด๋ ์์ ๋ ์ฝ๋์ ๋ด์ฉ์ด ๋ง์ PR merge๊ฐ ์ง์ฐ๋๊ณค ํ์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์๋ค์ด ๋ฆฌ๋ทฐ์ ์ฐธ์ฌํ์ง๋ง ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ฆฌ๋ทฐ ๊ธฐ์ค์ผ๋ก ์ธํด ์ฝ๋์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ด๋ ต๋ค๋ ํ๊ณ์ ๋ถ๋ชํ์ต๋๋ค.
์ด๋ฌํ ๋ฌธ์ ๋ค์ ๊ทน๋ณตํ๊ธฐ ์ํด, ์ ํฌ๋ AI ์ฝ๋ ๋ฆฌ๋ทฐ์ด CodeRabbit์ ๋์ ํ์ต๋๋ค.
CodeRabbit ๋์ ์ผ๋ก ์ป๊ฒ ๋ ์ด์
-
์ผ๊ด์ฑ ์๋ ์ฝ๋ ํ์ง ๊ด๋ฆฌ ๋ฐ ํ์คํ
- CodeRabbit์ ์ฌ์ ์ ์ ์๋ ๊ท์น์ ๋ฐ๋ผ ๋ชจ๋ PR์ ๋์ผํ ๊ธฐ์ค์ผ๋ก ๊ฒํ ํ์ฌ, ์ฌ๋๋ง๋ค ๋ค๋ฅผ ์ ์๋ ์ฃผ๊ด์ ์ธ ํ๋จ์ ๋ฐฐ์ ํ๊ณ ํ๋ก์ ํธ ์ ์ฒด์ ์ฝ๋ฉ ์คํ์ผ์ ์ผ๊ด๋๊ฒ ์ ์งํ ์ ์์์ต๋๋ค.
- ๋์น๊ธฐ ์ฌ์ด ์ ์ฌ์ ๋ฒ๊ทธ, ์ํฐ ํจํด, ๋นํจ์จ์ ์ธ ์ฝ๋ ๋ฑ์ ์ด๊ธฐ์ ๋ฐ๊ฒฌํ์ฌ ์ฝ๋์ ์์ ์ฑ๊ณผ ํ์ง์ ํฌ๊ฒ ํฅ์์์ผฐ์ต๋๋ค.
-
ํต์ฌ ๋ก์ง์ ์ง์คํ๋ ๋ฆฌ๋ทฐ ๋ฌธํ ์ ์ฐฉ
- ์คํ์ผ ๊ฐ์ด๋, ๋ค์ด๋ฐ ๊ท์น, ๋ฏธ์ฌ์ฉ ๋ณ์ ๋ฑ๊ณผ ๊ฐ์ ๋ถ๋ถ์ CodeRabbit์ด ์ ๋ดํ๊ฒ ๋์์ต๋๋ค.
- ๊ทธ ๊ฒฐ๊ณผ ํ์๋ค์ ์ด์ ์ฝ๋์ ํต์ฌ ๋ก์ง, ์ํคํ ์ฒ, ์ฌ์ฉ์ ๊ฒฝํ(UX) ๋ฑ ๋ ์ค์ํ๊ณ ์ฐฝ์์ ์ธ ๋ถ๋ถ์ ์ง์คํ์ฌ ์์ ์ ์งํํ ์ ์์์ต๋๋ค.
-
๊ฐ๊ด์ ์ธ ํผ๋๋ฐฑ์ ํตํ ํ์ต ๋ฌธํ ์กฐ์ฑ
- CodeRabbit์ด ์ ์ํ๋ ๊ฐ์ ์ฌํญ๊ณผ ๊ทธ ์ด์ ๋ฅผ ์ดํด๋ณด๋ฉฐ, ํ์ ๋ชจ๋๊ฐ ๋ ๋์ ์ฝ๋ ์์ฑ๋ฒ์ ์์ฐ์ค๋ฝ๊ฒ ์ตํ๊ณ ํจ๊ป ์ฑ์ฅํ๋ ๊ณ๊ธฐ๊ฐ ๋์์ต๋๋ค.
-
๋ฆฌ๋ทฐ ๋ณ๋ชฉ ํ์ ํด๊ฒฐ ๋ฐ ๊ฐ๋ฐ ์๋ ํฅ์
- PR ์์ฑ ์ฆ์ ๋ฆฌ๋ทฐ๊ฐ ์๋์ผ๋ก ์งํ๋๋ฏ๋ก, ๋ฆฌ๋ทฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋๊ธฐ ์๊ฐ์ด ํฌ๊ฒ ์ค์์ต๋๋ค.
- ํ์๋ค์ CodeRabbit์ ๊ฒํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๋น ๋ฅด๊ฒ ํ๋จ์ ๋ด๋ฆด ์ ์์ด, ์ ์ฒด์ ์ธ ๊ฐ๋ฐ ์ฌ์ดํด์ด ๋์ ๋๊ฒ ๋นจ๋ผ์ก์ต๋๋ค.