๐จ ํ๋ก ํธ์๋ ๊ธฐ์ ์คํ ์ค๊ณ - 100-hours-a-week/9-team-Devths-WIKI GitHub Wiki
| ์์ญ | ๊ธฐ์ | ์ ์ ์ด์ ์์ฝ |
|---|---|---|
| ์ธ์ด | TypeScript v5.9.3 | ํ๋ฉด/๊ธฐ๋ฅ์ด ๋ง์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๋ Devths์์ ํ์ ์ ํตํด ํ๋ ๋๋ฝยทํ์ ์ฐฉ๊ฐ์ ๊ฐ๋ฐ ๋จ๊ณ์์ ์ฐจ๋จํ๊ณ , ๋ฆฌํฉํ ๋ง๊ณผ ํ์ ์์ ์ฑ์ ๋์ด๊ธฐ ์ํด ์ฑํ |
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | React v19.2 | ์บ๋ฆฐ๋/๊ฒ์ํ/์ฑํ ์ฒ๋ผ ์ํ ๋ณํ์ ์ธํฐ๋์ ์ด ๋ง์ UI๋ฅผ ์ปดํฌ๋ํธ ๋จ์๋ก ๋ถ๋ฆฌํด ๊ด๋ฆฌํ๊ณ , ์ํ ๊ธฐ๋ฐ UI ์ ๋ฐ์ดํธ๋ก ๋ณต์ก๋๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด ์ฑํ |
| ํ๋ ์์ํฌ | Next.js 16 | ํ์ด์ง ์๊ฐ ๋ง๊ณ (๊ณตํต ๋ ์ด์์ ๋ฐ๋ณต), ๋ก๊ทธ์ธ ์ /ํ ๋ถ๊ธฐ์ ์๋ฌ ํ์ด์ง๊ฐ ์ค์ํ ๊ตฌ์กฐ์์ ๋ผ์ฐํ ยท๋ ์ด์์ยท์๋ฌ ์ฒ๋ฆฌยทSSR/SSG๋ฅผ ํ๋ ์์ํฌ ์์ค์์ ํ์คํํ๊ธฐ ์ํด ์ฑํ |
| ์ ์ญ ์ํ | Zustand v5.0.9 | ํ ์คํธ/์ ์ญ ๋ชจ๋ฌ/ํญยทํํฐ ๊ฐ์ UI ์ ์ญ ์ํ๊ฐ ๋ง์ prop drilling์ ์ค์ด๊ณ , ํ์ํ ์ํ๋ง ์ ํ ๊ตฌ๋ ํด ๋ฆฌ๋ ๋๋ง ๋ฒ์๋ฅผ ํต์ ํ๊ธฐ ์ํด ์ฑํ |
| ์๋ฒ ์ํ | TanStack Query v5.90.16 | ๋ชฉ๋ก/๊ฒ์/ํํฐ/๋ฌดํ ์คํฌ๋กค์ด ๋ง๊ณ , ๋ณ๊ฒฝ ํ ๊ฐฑ์ (invalidate) ํ๋ฆ์ด ๋ณต์กํด์ง๋ Devths์์ ์บ์ฑยท๋๊ธฐํยทํ์ด์ง๋ค์ด์ ํจํด์ ํ์คํํ๊ธฐ ์ํด ์ฑํ |
| ์คํ์ผ๋ง | Tailwind CSS v4.1 | ๋ฐ๋ณต UI์ ์ํ๋ณ ์คํ์ผ(์ ํ/์๋ฌ/๋นํ์ฑ ๋ฑ)์ด ๋ง์ ๊ตฌ์กฐ์์ JSX์์ ๋น ๋ฅด๊ฒ ์์ ํ๊ณ , config๋ก ๋์์ธ ๊ธฐ์ค์ ๊ณ ์ ํด ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ฑํ |
| UI ์ปดํฌ๋ํธ | shadcn/ui | ๋ชจ๋ฌ/๋๋กญ๋ค์ด/ํญ ๋ฑ ์ํธ์์ฉ UI๋ฅผ ํ๋ก์ ํธ๊ฐ ์ฝ๋๋ก ์์ ํด ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์์ ํ๊ณ , ์ ๊ทผ์ฑ ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ๊ณตํต UI๋ฅผ ํ์คํํ๊ธฐ ์ํด ์ฑํ |
| ์บ๋ฆฐ๋ UI | FullCalendar v6.1.20 | ๋ฌ๋ ฅ ํน์ ์ ๋ทฐ ์ ํยท์ด๋ฒคํธ ๋ฐฐ์นยท์์ธ ์ผ์ด์ค๋ฅผ ๊ฒ์ฆ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ปค๋ฒํ๊ณ , Devths ์๊ตฌ์ ๋ง์ถ ์ปค์คํ ๋ ๋๋ง/์ํธ์์ฉ ๊ตฌํ์ ์ง์คํ๊ธฐ ์ํด ์ฑํ |
| ํจํค์ง ๊ด๋ฆฌ | pnpm v10.27.0 | ์์กด์ฑ์ด ์ปค์ง์๋ก ์ค์น ์๋/๋์คํฌ/CI ์์ ์ฑ์ด ์ค์ํด์ง๋ ํ ํ๋ก์ ํธ์์ ๊ณต์ฉ ์ ์ฅ์ ๊ธฐ๋ฐ ์ค์น ํจ์จ๊ณผ lockfile ์ฌํ์ฑ์ ํ๋ณดํ๊ธฐ ์ํด ์ฑํ |
| ๋ฒ๋ค๋ฌ/๋น๋ | Turbopack | Next.js ๊ธฐ๋ณธ ํตํฉ ํ๋ฆ์ ์ ์งํ๋ฉด์ ์ค์ ๋ถ๋ด์ ์ค์ด๊ณ , ๊ท๋ชจ ํ์ฅ ์ ๊ฐ๋ฐ ์๋ฒ ์ฒด๊ฐ ์๋๋ฅผ ํ๋ณดํ๋ ์ ํ์ง๋ก ์ฑํ |
| ์ ํจ์ฑ ๊ฒ์ฌ | Zod v4.3.4 | ์ ๋ ฅ ํ๋ฉด๊ณผ ๊ท์น์ด ๋ง์ ๊ตฌ์กฐ์์ ๊ฒ์ฆ ์ ์ฑ ์ ์คํค๋ง๋ก ๊ณ ์ ยท์ฌ์ฌ์ฉํ๊ณ , TypeScript ํ์ ์ถ๋ก ์ผ๋ก ๊ฒ์ฆ ๊ท์น๊ณผ ํ์ ๋ถ์ผ์น ๋ฆฌ์คํฌ๋ฅผ ์ค์ด๊ธฐ ์ํด ์ฑํ |
| ํผ ์ฒ๋ฆฌ | React Hook Form v7.70.0 | ํ์๊ฐ์ /์์ฑ/์์ ๋ฑ ํผ์ด ๋ง์ ํ๋ก์ ํธ์์ ํผ ์ํยท์ ์ถยท์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ์คํํ๊ณ , Zod ๊ฒ์ฆ ๊ฒฐ๊ณผ๋ฅผ UI์ ์ผ๊ด๋๊ฒ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ฑํ |
| API ํต์ | Axios v1.13.2 | OAuth ์ดํ ๊ณตํต ํค๋/ํ ํฐ ์ฃผ์ , ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ, ์ ๋ก๋ ํจํด ๋ฑ์ ์ธํฐ์ ํฐ์ ์ธ์คํด์ค๋ก ์ค์ํํด ๋คํธ์ํฌ ์ ์ฑ ์ ์ผ๊ด๋๊ฒ ์ด์ํ๊ธฐ ์ํด ์ฑํ |
| ๋จ์/์ปดํฌ๋ํธ ํ ์คํธ | Vitest v4.0.16 | UI ๋ก์ง/๊ฒ์ฆ/์ํ ์ ํ ํ ์คํธ๋ฅผ ๋น ๋ฅด๊ฒ ๋ฐ๋ณต ์คํํ๊ณ , TS/React ํ ์คํธ ์ํ๊ณ์ ๊ฒฐํฉํด ํ ์คํธ ํ๊ฒฝ ์ด์ ๋ถ๋ด์ ์ค์ด๊ธฐ ์ํด ์ฑํ |
| ์ปดํฌ๋ํธ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | React Testing Library v16.3.1 | ๊ตฌํ์ด ์๋๋ผ ์ฌ์ฉ์ ๊ด์ (DOM ์ํธ์์ฉ)์ผ๋ก ํ ์คํธ๋ฅผ ์์ฑํด ๋ฆฌํฉํ ๋ง ๋ด๊ตฌ์ฑ์ ๋์ด๊ณ , ์ ๊ทผ์ฑ ๊ธฐ๋ฐ ์กฐํ๋ก ํ ์คํธ ํ์ค์ ๋ง๋ค๊ธฐ ์ํด ์ฑํ |
| E2E ํ ์คํธ | Playwright v1.57.0 | ๋๋ฉโ๋ก๊ทธ์ธโ๋ฉ์ธ ์ง์ ๊ฐ์ ํต์ฌ ์ฌ์ฉ์ ์๋๋ฆฌ์ค๋ฅผ ์ค์ ๋ธ๋ผ์ฐ์ ์์ ๊ฒ์ฆํ๊ณ , ์๋ ๋๊ธฐ/ํธ๋ ์ด์ค ๋ฑ์ผ๋ก E2E ์ด์ ์์ ์ฑ์ ํ๋ณดํ๊ธฐ ์ํด ์ฑํ |
| ์ค์๊ฐ | STOMP + WebSocket | ์ฑํ /์๋ฆผ์์ ํ์ํ ์ฌ์ฐ๊ฒฐยทํด๋ฐฑยท๋ฃธ ๋จ์ ๋ฉ์์งยทACK ํจํด์ ๊ธฐ๋ณธ ์ ๊ณตํด, ์คํ๊ฒฝ ์์ธ ์ฒ๋ฆฌ ๋ถ๋ด์ ์ค์ด๊ณ ์์ ์ ์ธ ์ค์๊ฐ UX๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฑํ |
Devths๋ ์ทจ์ ์ค๋น ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ์ผ์ (์บ๋ฆฐ๋/To-Do) ๊ด๋ฆฌ, ๊ฒ์ํ ๊ธฐ๋ฐ ์ ๋ณด ํ์ยท์์ฑยท๊ณต์ , ๊ฐ์ธ/๊ทธ๋ฃน ์ฑํ , AI ์ปค๋ฆฌ์ด ์ฑ๋ด์ ํตํ ์๋ฃ ๋ถ์ยท์๋ด, ์๋ฆผ, ํ๋กํ/ํ๋ก์ฐ ๊ธฐ๋ฅ์ ํตํด ์ทจ์ ์ค๋น ๊ณผ์ ์ ํ ๊ณณ์์ ๊ด๋ฆฌํ๊ณ ์คํํ ์ ์๋๋ก ๋์์ฃผ๋ ์๋น์ค์ด๋ค.
(1) ์บ๋ฆฐ๋
- ์ผ์ ์กฐํ/๋ฑ๋ก/์์ /์ญ์ (์, ์ฃผ ๋ทฐ)
- AI ์๋ ์ผ์ ์ฝ์ : ์ฑ์ฉ ๊ณต๊ณ ์ ๋ก๋ โ AI๋ก ์ถ์ถ โ ์ผ์ ์ด์ ์์ฑ โ ์ฌ์ฉ์ ํ์ธ ํ ์บ๋ฆฐ๋์ ์ ์ฅ
(2) ๊ฒ์ํ
- ๊ธ ๋ชฉ๋ก/์์ธ/์์ฑ/์์ /์ญ์
- ๋๊ธ/์ข์์/๊ฒ์(ํํฐ)
(3) ์ฑ๋ด/AI
- ์ด๋ ฅ์/ํฌํธํด๋ฆฌ์ค/์ฑ์ฉ๊ณต๊ณ ๋ฑ ์ ๋ ฅ ๊ธฐ๋ฐ ๋ต๋ณ ์์ฑ
- ๋ฉด์ ๋ชจ๋ (์ง๋ฌธ ์์ฑ/ํผ๋๋ฐฑ)
- ๋ํ ์ด๋ ฅ ๊ด๋ฆฌ ๋ฐ ์ปจํ ์คํธ ๊ธฐ๋ฐ ์๋ต ์ ๊ณต
(4) ์ฑํ
- ์ฑํ ๋ฐฉ ๋ชฉ๋ก/์์ฑ/์ฐธ์ฌ/๋๊ฐ๊ธฐ
- ์ค์๊ฐ ๋ฉ์์ง ์ ์ก/์์ , ์ฝ์ ์ฒ๋ฆฌ
- ๋ฉ์์ง ํ์คํ ๋ฆฌ ๋ก๋ฉ(๋ฌดํ์คํฌ๋กค) ๋ฐ ํ์ผ/์ด๋ฏธ์ง ์ฒจ๋ถ
Devths๋ ํ์ด์ง๊ฐ ๋ง๊ณ (์บ๋ฆฐ๋/๊ฒ์ํ/์ฑํ /์ฑ๋ด/ํ๋กํ/์ค์ ๋ฑ), ๋ฐ์ดํฐ ํํ๊ฐ ๋ค์ํ๋ฉฐ, ์ค์๊ฐ ๊ธฐ๋ฅ(์ฑํ )๊ณผ AI ๊ธฐ๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ(๊ณต๊ณ ์ ๋ก๋ โ ์ถ์ถ โ ์ด์ ์์ฑ)๊ฐ ์์ฌ ์๋ ์๋น์ค์
- ๊ทธ๋์ ํ๋ก ํธ์๋ ๊ธฐ์ ์คํ์ ์๋น์ค ์๊ตฌ์ฌํญ์ ์์ ์ ์ผ๋ก ๊ตฌํํ๊ณ , ์ ์ง๋ณด์์ ํ์ฅ์ ๊ฐํ ์กฐํฉ์ธ์ง ๋ ์ค์ํ๋ค๊ณ ์๊ฐํจ
(1) ๊ธฐ๋ฅ ์ ํฉ์ฑ
- Devths๋ ๋จ์ CRUD๋ง ์๋ ์๋น์ค๊ฐ ์๋๋ผ, ์บ๋ฆฐ๋/๋ฌดํ์คํฌ๋กค/์ค์๊ฐ/ํ์ผ์ ๋ก๋/AI ์ฒ๋ฆฌ ํ๋ฆ์ฒ๋ผ UI ์๊ตฌ๊ฐ ๋ณต์กํจ
- ํ๋จ ๊ธฐ์ค
- ์ค์๊ฐ ์ด๋ฒคํธ(์ฝ์/์ ์ก/์ ์ฅ ๋ฑ) ์ฒ๋ฆฌ๋ฅผ ์์ ์ ์ผ๋ก ๋ถ์ผ ์ ์๋๊ฐ?
- ๋น๋๊ธฐ ๋ฐ์ดํฐ(์กฐํ/์ ์ฅ/์ฌ์๋/์บ์ฑ) ์ฒ๋ฆฌ๊ฐ ํ์คํ ๊ฐ๋ฅํ๊ฐ?
- ๋ผ์ฐํ /๋ ์ด์์ ๊ตฌํ์ด ์ฌ์ด๊ฐ?
(2) ์ ์ง๋ณด์์ฑ
- ํ๋ฉด๊ณผ API๊ฐ ๋์๋ก ์ด๋์ ๋ญ๊ฐ ๋ฐ๋๋์ง ์ถ์ ๋น์ฉ์ด ๋ฐ์ํจ
- ํ๋จ ๊ธฐ์ค
- ํ์ /์ธํฐํ์ด์ค๋ก ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๊ณ ์ ๋๋๊ฐ? (ํ๋ ๋๋ฝ/ํ์ ์ฐฉ๊ฐ ๋ฐฉ์ง)
- ์ปดํฌ๋ํธ/์ํ/๋ฐ์ดํฐ ๊ณ์ธต์ด ์ญํ ๋ณ๋ก ๋ถ๋ฆฌ๋๋๊ฐ?
- ํด๋ ๊ตฌ์กฐ/์ฝ๋ฉ ๊ท์น์ ์ผ๊ด๋๊ฒ ์ ์งํ ์ ์๋๊ฐ?
(3) ์ฑ๋ฅ
- ์ฑํ (๋ฉ์์ง ๋ฆฌ์คํธ), ๊ฒ์ํ(๋ชฉ๋ก), ์บ๋ฆฐ๋(์/์ฃผ ๋ ๋๋ง)๋ ๋ ๋๋ง ๋น์ฉ์ด ์ปค์ ์ฑ๋ฅ ์ต์ ํ๊ฐ ์ฒด๊ฐ๋จ
- ํ๋จ ๊ธฐ์ค
- ๋ฌดํ์คํฌ๋กค/๊ฐ์ํ๋ก ๊ธด ๋ฆฌ์คํธ ๋ ๋๋ง์ ์ต์ ํํ ์ ์๋๊ฐ?
- ๋ฐ์ดํฐ ์บ์ฑ/ํ๋ฆฌํจ์น๋ก ํ๋ฉด ์ ํ ์ฒด๊ฐ ์๋๋ฅผ ๊ฐ์ ํ ์ ์๋๊ฐ?
- ๋ฒ๋ค ๋ถ๋ฆฌ, ์ด๋ฏธ์ง ์ต์ ํ, SSR/SSG ๋ฑ ๋ ๋๋ง ์ ๋ต์ ์ ์ฉํ๊ธฐ ์ฌ์ด๊ฐ?
(4) ์์ ์ฑ/์์ธก ๊ฐ๋ฅ์ฑ
- ์ฑํ , ์๋ฆผ, AI ๊ฒฐ๊ณผ ๋ฐ์์ฒ๋ผ ์ํ ๋ณํ๊ฐ ๋ง์ผ๋ฉด ๋ฒ๊ทธ๊ฐ ๋์ด๋จ
- ํ๋จ ๊ธฐ์ค
- ์ ์ญ ์ํ๊ฐ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ ์ฅ/๋ณ๊ฒฝ๋๋์ง ๋ช ํํ๊ฐ?
- ์๋ฒ ์ํ(๋น๋๊ธฐ ๋ฐ์ดํฐ)์ ํด๋ผ์ด์ธํธ ์ํ(UI ์ํ)๊ฐ ์์ด์ง ์๊ฒ ๋ถ๋ฆฌ ๊ฐ๋ฅํ๊ฐ?
- ์๋ฌ ์ฒ๋ฆฌ/๋ก๋ฉ ์ฒ๋ฆฌ/์ฌ์๋ ์ ์ฑ ์ ์ผ๊ด๋๊ฒ ์ ์ฉํ ์ ์๋๊ฐ?
- ์ ์ ํ์
- ๋ณ์/ํจ์/๊ฐ์ฒด์ ํ์ ์ ๋ฏธ๋ฆฌ ์ ํด๋๊ณ , ์ฝ๋ ์คํ ์ ์ปดํ์ผ ๋จ๊ณ์์ ํ์ ์ค๋ฅ๋ฅผ ์ก์์ค์ ๋ฐํ์ ์๋ฌ๋ฅผ ์ค์ฌ์ค
- ๊ฐ๋ ฅํ IDE ์ง์
- ํ์ ์ ๋ณด ๋๋ถ์ ์๋์์ฑ, ์คํ ๊ฐ์ง, ํจ์ ํ๋ผ๋ฏธํฐ ์๋ด, ์์ ํ ๋ฆฌํฉํ ๋ง(๋ณ์๋ช ๋ณ๊ฒฝ ๋ฑ)์ด ํจ์ฌ ์ ํํด์ง
- ์ฝ๋ ๊ฐ๋ ์ฑ๊ณผ ํ์ ์ ์ ๋ฆฌ
- ๋๊ท๋ชจ ํ๋ก์ ํธ์ ๊ฐํจ
Devths๋ ํ์ด์ง/๊ธฐ๋ฅ์ด ๋ง๊ณ , ๊ธฐ๋ฅ ๊ฐ์ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ๋ณต์กํด์ง๋ ์๋น์ค๋ผ์ TypeScript๊ฐ ํนํ ํจ๊ณผ์ ์ด๋ผ๊ณ ํ๋จํจ
(1) API ์๋ต/์์ฒญ ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋ง๊ณ ๋ณต์กํจ
- ์ ์ (User), ๊ฒ์๊ธ(Post), ๋๊ธ(Comment), ์ฑํ ๋ฉ์์ง(Message), ์๋ฆผ(Notification), ์บ๋ฆฐ๋ ์ด๋ฒคํธ(CalendarEvent) ๋ฑ
- ๊ฐ ๋ฐ์ดํฐ๋ ํ๋๊ฐ ๋ง๊ณ , ํ๋ฉด๋ง๋ค ํ์ํ ํ๋๋ ๋ค๋ฆ
- TypeScript๋ก ํ์ ์ ์ ์ํด๋๋ฉด ํ๋ ๋๋ฝ/์คํ/ํ์ ์ฐฉ๊ฐ์ ์ปดํ์ผ ๋จ๊ณ์์ ์ฐจ๋จ ๊ฐ๋ฅ
(2) ํผ ์ ๋ ฅ/๊ฒ์ฆ๊ณผ์ ๊ถํฉ์ด ์ข์
- ๋ก๊ทธ์ธ/ํ์๊ฐ์
, ํ๋กํ ์์ , ๊ฒ์๊ธ ์์ฑ, ํ์ผ ์
๋ก๋ ๋ฑ ํผ์ด ๋ง์
- ํผ ๋ฐ์ดํฐ ํ์ ์ ๋ช ํํ ํด๋๋ฉด, ์ ํจ์ฑ ๊ฒ์ฆ๊ณผ ๊ฒฐํฉํ ๋ ํด๋ผ์ด์ธํธ์์ ์์ ์ ์ผ๋ก ๋ฐ์ดํฐ ์ ๋ฆฌ ๊ฐ๋ฅ
(3) ์ค์๊ฐ ๊ธฐ๋ฅ(์ฑํ )์์ ์ด๋ฒคํธ/ํ์ด๋ก๋ ์์ ์ฑ์ด ์ค์ํจ
- ์ฑํ ์ ์ด๋ฒคํธ๊ฐ ๋ค์ํ๊ณ (์ ์ก/์ฝ์/์ ์ฅ/๋๊ฐ ๋ฑ) ํ์ด๋ก๋ ๊ตฌ์กฐ๊ฐ ์กฐ๊ธ๋ง ๋ฌ๋ผ๋ ๋ฒ๊ทธ๊ฐ ๋๊ธฐ ์ฌ์
(4) ํ๋ฉด ์๊ฐ ๋ง์์ง์๋ก ๋ณ๊ฒฝ ์ํฅ์ด ์ปค์ง
- TypeScript๋ ์ด๋๊ฐ ๊นจ์ก๋์ง ๋ฐ๋ก ํ์ํด์ค์ ์์ ๋ฒ์๋ฅผ ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์์
(5) ํ์ ๊ด์ ์์ ์ ์ฉ
- ํ์
์ด ๊ณง ๋ฌธ์๊ฐ ๋๊ธฐ ๋๋ฌธ์, ํ์๋ค์ด ์ฝ๋๋ฅผ ๋ณผ๋ ์ด ํจ์๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ์ด๋ค ํํ๋ก ๋๋ ค์ฃผ๋์ง๋ฅผ ๋น ๋ฅด๊ฒ ์ดํด ๊ฐ๋ฅ
- ์ปค๋ฎค๋์ผ์ด์ ๋น์ฉ์ด ์ค๊ณ ์ ์ง๋ณด์๊ฐ ์ฌ์์ง
-
ํ๋ฆ
- ์๋ฒ(API)์์ ์ผ์ ๋ชฉ๋ก์ ๋ฐ์
- ํ๋ก ํธ์์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด(UI) ์ปดํฌ๋ํธ์ ๋ฃ์ด ๋ ๋๋งํจ (FullCalendar)
- ํด๋ฆญ/์์ /์ญ์ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ๊ณ์ ๋ฐ์ํจ
-
๋ฌธ์
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ํ๋ฆฌ๋ฉด ํ๋ฉด์ด ์กฐ์ฉํ ๊นจ์ง
- ์๋ฅผ ๋ค๋ฉด
startAt์start๋ก ์๋ชป ์ฐ๋ฉด: - ํ๋ฉด์ ์ผ์ ์ด ์ ๋จ๊ฑฐ๋
- ์ผ์ ์๊ฐ๋๊ฐ ์ด์ํด์ง๊ฑฐ๋
- ๋ฐํ์์์
undefined์๋ฌ๊ฐ ๋๊ฑฐ๋
- ์๋ฅผ ๋ค๋ฉด
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ํ๋ฆฌ๋ฉด ํ๋ฉด์ด ์กฐ์ฉํ ๊นจ์ง
โ TypeScript ํ์ ์ ์ก์๋ฌ์ ์ฝ๋ ์คํ ์ ์ ์ค์๋ฅผ ๋ง์
- ํ๋ฆ
- ์ฌ์ฉ์๊ฐ ์ฑํ ๋ฐฉ์ ์ ์ฅ โ ์๋ฒ์ ์ค์๊ฐ ์ฐ๊ฒฐ(Socket.IO)
- ๋ฉ์ธ์ง ์ ์ก ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ์ด๋ฒคํธ emit
- ์๋ฒ๊ฐ ์ ์ฅ ํ, ๊ฐ์ ๋ฐฉ ์ฌ์ฉ์๋ค์๊ฒ ์ ๋ฉ์์ง ์ด๋ฒคํธ broadcast
- ํด๋ผ์ด์ธํธ๋ ์์ ํ ๋ฉ์์ง๋ฅผ ์ํ์ ์ถ๊ฐํ๊ณ ํ๋ฉด์ ๋ ๋๋ง
- ์ฝ์ ์ฒ๋ฆฌ/์ ์ฅ,ํด์ฅ/ํ์ผ ์ฒจ๋ถ ๊ฐ์ ์ด๋ฒคํธ๊ฐ ์ถ๊ฐ๋ก ๊ณ์ ๋ฐ์
- ๋ฌธ์
- ์ค์๊ฐ ๊ธฐ๋ฅ์ โ์ด๋ฒคํธ ์ด๋ฆ + ํ์ด๋ก๋ ๊ตฌ์กฐโ๊ฐ ๋ง์์, ์กฐ๊ธ๋ง ํ๋ ค๋ ๋ฒ๊ทธ ๋ฐ์ ์ฌ์
โ TypeScript๋ก ๋ฉ์์ง ํ์ /๋ฃธ ํ์ /์์ผ ์ด๋ฒคํธ ํ์ ์ ๊ณ ์ ํด์ ๋ณด๋ด๋ ๋ฐ์ดํฐ/๋ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์คํ ์ ์ ๊ฒ์ฆํ๊ณ ์ค์๊ฐ ๋ฒ๊ทธ๋ฅผ ์ค์
| ํญ๋ชฉ | JavaScript | TypeScript |
|---|---|---|
| ํ์ ๊ฒ์ฌ ์์ | ์คํ ์ค (๋ฐํ์) | ์ปดํ์ผ ๋จ๊ณ |
| ํ์ ์์ ์ฑ | ๋ฎ์ | ๋์ |
| ๋ฐํ์ ์๋ฌ | ๋ฐ์ ๊ฐ๋ฅ์ฑ ๋์ | ์ฌ์ ๋ฐฉ์ง ๊ฐ๋ฅ |
| ์๋์์ฑ / IDE ์ง์ | ์ ํ์ | ๋งค์ฐ ๊ฐ๋ ฅ |
| ๋ฆฌํฉํ ๋ง ์์ ์ฑ | ๊ท๋ชจ ์ปค์ง์๋ก ์ํ | ๋ณ๊ฒฝ ์ํฅ ์ฆ์ ํ์ธ ๊ฐ๋ฅ |
| ํ์ ํจ์จ | ์ฃผ์, ๋ฌธ์ ์์กด | ํ์ ์์ฒด๊ฐ ๋ฌธ์ ์ญํ |
| ๋๊ท๋ชจ ํ๋ก์ ํธ ์ ํฉ์ฑ | ๋ฎ์ | ๋์ |
-
ํ์ ๊ฒ์ฌ ์์ ๊ณผ ์์ ์ฑ
-
JS๋ ํ์ ๊ฒ์ฌ๊ฐ ์ฝ๋ ์คํ ์ค(๋ฐํ์)์๋ง ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์, ์๋ชป๋ ๊ฐ์ด๋ ๊ตฌ์กฐ๊ฐ ์์ด๋ ์ค์ ๋ก ์คํํด ๋ณด๊ธฐ ์ ๊น์ง๋ ์ค๋ฅ๋ฅผ ์๊ธฐ ์ด๋ ค์. ๊ทธ ๊ฒฐ๊ณผ ๋ฐํ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋์ ์ผ๋ก ๋์
โ๏ธ TS๋ ์ปดํ์ผ ๋จ๊ณ์์ ํ์ ์ ๊ฒ์ฌํด ์๋ชป๋ ์ฌ์ฉ์ ๋ฏธ๋ฆฌ ์ฐจ๋จํ๋ฏ๋ก, ์คํ ์ค์ ๋ฐ์ํ๋ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์์
-
-
IDE ์ง์ ๋ฐ ๊ฐ๋ฐ ํจ์จ
-
JS๋ ๊ฐ์ฒด ๊ตฌ์กฐ๋ ํจ์์ ์ ์ถ๋ ฅ์ IDE๊ฐ ์ ํํ ์๊ธฐ ์ด๋ ค์ ์๋์์ฑ์ด ์ ํ์ ์ธ ๊ฒฝ์ฐ๊ฐ ๋ง์
โ๏ธ TS๋ ํ์ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก IDE๊ฐ ์ ํํ ์๋์์ฑ๊ณผ ์ค๋ฅ ์๋ด๋ฅผ ์ ๊ณตํด ๊ฐ๋ฐ ํจ์จ์ ํฌ๊ฒ ๋์ฌ์ค.
-
-
๋ฆฌํฉํ ๋ง ์์ ์ฑ
-
JS๋ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๋ณ๊ฒฝ ์ํฅ ๋ฒ์๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ค์ ์ํ์ด ์ปค์ง
โ๏ธ TS๋ ํ์ ์ค๋ฅ๋ฅผ ํตํด ์์ ์ด ํ์ํ ์ง์ ์ ์ฆ์ ์๋ ค์ค ๋น๊ต์ ์์ ํ๊ฒ ๊ตฌ์กฐ ๋ณ๊ฒฝ์ ์งํํ ์ ์์
-
-
ํ์ ๋ฐ ์ฝ๋ ๊ฐ๋ ์ฑ
-
JS๋ ํ์ ํ ๋ ์ฃผ์์ด๋ ๋ณ๋์ ๋ฌธ์์ ์์กดํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
โ๏ธ TS๋ ํ์ ์ ์ ์์ฒด๊ฐ ์ฝ๋์ ์ค๋ช ์ ์ญํ ์ ํ์ฌ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ํจ์ฌ ์์ํจ
-
- TypeScript v5.9.3
- 2025๋ 10์ 1์ผ์ GitHub๋ฅผ ํตํด ๋ฆด๋ฆฌ์ฆ๋จ
- ํน๋ณํ๊ฒ 5.9.3 ๋ฒ์ ์ ์ ํํ ์ด์
- Next.js, React ๋ฑ ์ฃผ์ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ์์ TypeScript 5.x ๋ผ์ธ์ด ์์ ์ ์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ด, ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ ์ถฉ๋ ์ํ์ด ๋ฎ๋ค๊ณ ํ๋จํจ
- TypeScript๋ ๋์ผ ๋ฉ์ด์ ๋ฒ์ (5.x)์ ์ ์งํ๋ ๋ฒ์ ๋ด์์, ๋ฒ๊ทธ ์์ ๊ณผ ์์ ์ฑ ๊ฐ์ ์ด ๋ฐ์๋ ํจ์น ๋ฒ์ (v5.9.3)์ ์ ํํจ
- v5.9.3์ ๊ธฐ์กด ๋ฌธ๋ฒ๊ณผ ํ์ ์์คํ ์ ๋์์ ๋ณ๊ฒฝํ์ง ์์ผ๋ฉด์, ์ปดํ์ผ ์์ ์ฑ๊ณผ IDE ์ฐ๋ ํ์ง ๊ฐ์ ์ด ๋ฐ์๋ ๋ฒ์ ์ผ๋ก ํ๊ฐ๋จ
- Devths๋ ์บ๋ฆฐ๋, ๊ฒ์ํ, ์ฑํ , AI์ฑ๋ด์ฒ๋ผ ํ๋ฉด๊ณผ ๊ธฐ๋ฅ์ด ๋ง๊ณ , ๊ธฐ๋ฅ ๊ฐ์ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ๊ฐ ๋ณต์กํ ์๋น์ค์
- ๋ฐ๋ผ์ TypeScript๋ฅผ ์ ์ฉํด
- API ๊ณ์ฝ(์์ฒญ/์๋ต)๊ณผ ๋๋ฉ์ธ ๋ชจ๋ธ(User/Post/Message/Event ๋ฑ)์ ํ์ ์ผ๋ก ๊ณ ์ ํ๊ณ ,
- ํผ ์ ๋ ฅ/๊ฒ์ฆ ๋ก์ง์ ํ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ํํ๋ฉฐ,
- ์ค์๊ฐ ์ฑํ ์ ์ด๋ฒคํธ/ํ์ด๋ก๋๋ฅผ ํ์ ์ผ๋ก ๊ฐ์ ํด ์คํ, ๋๋ฝ, ํ์ ๋ถ์ผ์น๋ก ์ธํ ๋ฒ๊ทธ๋ฅผ ์ปดํ์ผ ๋จ๊ณ์์ ์ฐจ๋จํจ
- ๊ฒฐ๊ณผ์ ์ผ๋ก TypeScript๋ Devths์์ ๋ฐํ์ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ , ๋ณ๊ฒฝ์ ๊ฐํ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๋ฉฐ, ํ์ ์๋์ ์ ์ง๋ณด์์ฑ์ ๋์ด๋ ๊ธฐ์ ๋ก์ ์ฑํ ๊ฐ์น๊ฐ ํผ
- ์ปดํฌ๋ํธ ๊ธฐ๋ฐ UI ๊ฐ๋ฐ
- ํ๋ฉด์ Header/๋ฒํผ/์นด๋/๋ฆฌ์คํธ ๊ฐ์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ๋ก ๋๋ ์กฐ๋ฆฝํ๋ฏ ๊ฐ๋ฐํ ์ ์์ด, ๊ธฐ๋ฅ์ด ๋ง๊ณ ํ๋ฉด์ด ๋ง์ ์๋น์ค์์ ์ ์ง๋ณด์๊ฐ ์ฌ์
- ์ปดํฌ๋ํธ ์ฌ์ฌ์ฉ์ ํตํ ์์ฐ์ฑ
- ๋ฒํผ/๋ชจ๋ฌ/์ ๋ ฅํผ ๊ฐ์ ๊ณตํต UI๋ฅผ ํ ๋ฒ ๋ง๋ค์ด๋๋ฉด ์ฌ๋ฌ ํ์ด์ง์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด์ ๊ฐ๋ฐ ์๋์ ์ผ๊ด์ฑ์ด ๋์์ง
- ์ํ ๊ธฐ๋ฐ ๋ ๋๋ง
- ์ฌ์ฉ์ ์ ๋ ฅ, API ์๋ต, ์ค์๊ฐ ๋ฉ์์ง์ฒ๋ผ ๊ณ์ ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ state๋ก ๊ด๋ฆฌํ๊ณ , ๊ทธ ๋ณํ๊ฐ ๊ณง ํ๋ฉด ์ ๋ฐ์ดํธ๋ก ์ฐ๊ฒฐ๋จ
- ํ๋ถํ ์ํ๊ณ
- ๋ผ์ฐํ (React Router), ๋ฐ์ดํฐ ํจ์นญ(React Query), ํผ(React Hook Form), ์ํ๊ด๋ฆฌ(Zustand) ๋ฑ๊ณผ ์กฐํฉ์ด ์ฌ์ ๊ธฐ๋ฅ ํ์ฅ ๋น ๋ฆ
Devths๋ ํ์ด์ง/์ธํฐ๋์ ์ด ๋ง๊ณ ๋ฐ์ดํฐ๊ฐ ๊ณ์ ๋ฐ๋๋ ์๋น์ค๋ผ์, React ์ปดํฌ๋ํธ/์ํ ๊ธฐ๋ฐ UI ๋ฐฉ์์ด ๋ง์
(1) ๊ธฐ๋ฅ๋ณ ํ๋ฉด์ด ๋ง์๋ ์ปดํฌ๋ํธ๋ก ์ชผ๊ฐ์ ๊ด๋ฆฌ ๊ฐ๋ฅ
- Devths๋ ์บ๋ฆฐ๋, ๊ฒ์ํ, ์ฑ๋ด, ์ฑํ ์ฒ๋ผ ๋๋ฉ์ธ์ด ๋ค๋ฅธ ํ๋ฉด์ด ์ฌ๋ฌ ๊ฐ ์์
- React๋ ํ๋ฉด์ ์์ ๋ถํ์ผ๋ก ์ชผ๊ฐ์ ์ฌ์ฌ์ฉ/์กฐ๋ฆฝํ๋ ๊ตฌ์กฐ๋ผ์ ์ ์ง๋ณด์์ ๊ฐํจ
- ์ปดํฌ๋ํธ๋ 2-2์ ์์ฑ
โ ์ด๋ ๊ฒ ๋๋๋ฉด ๊ธฐ๋ฅ์ด ๋์ด๋๋ ์ปดํฌ๋ํธ ๋จ์๋ก ์์ ํ๋ฉด ๋ผ์ ์ฝ๋ ๋ ๋ง๊ฐ์ง
(2) ์ํ๊ฐ ๋ฐ๋๋ฉด ํ๋ฉด์ด ์๋์ผ๋ก ๋ฐ๋ผ์ค๋ ๊ตฌ์กฐ๊ฐ ํ์ํจ
- Devths๋ ์ํ ๋ณํ๊ฐ ๋ง์ ์๋น์ค
- ์บ๋ฆฐ๋: ์ผ์ ์ถ๊ฐ/์์ /์ญ์ โ ์ฆ์ ํ๋ฉด ๋ฐ์
- ๊ฒ์ํ: ๋ฌดํ์คํฌ๋กค๋ก ๊ธ ๊ณ์ ์ถ๊ฐ โ ๋ฆฌ์คํธ UI ๊ฐฑ์
- ์ฑ๋ด: ๋ต๋ณ ์คํธ๋ฆฌ๋ฐ/๋ํ ๋์ โ ๋ฉ์์ง UI๊ฐ ๊ณ์ ๋์ด๋จ
- ์ฑํ : ์ค์๊ฐ ์์ ๋ฉ์์ง โ ํ๋ฉด์ ๋ฐ๋ก ์ถ๊ฐ + ์คํฌ๋กค ์ฒ๋ฆฌ
โ Zustand๋ง ์ํ๋ฉด DOM์ ์ง์ ๋ง์ง์ง ์์๋ UI๊ฐ ์๋ ๊ฐฑ์ ๋จ
(3) ์ฑ๋ฅ ์ต์ ํ ํฌ์ธํธ๊ฐ ๋ง์ ํ๋ฉด์ ์ ๋ฆฌํจ
- Devths๋ ๋ฆฌ์คํธ๊ฐ ๊ธด UI๊ฐ ์ฌ๋ฌ ๊ฐ์
- ๊ฒ์ํ ๊ธ ๋ชฉ๋ก (๋ฌดํ ์คํฌ๋กค)
- ์ฑํ ๋ฉ์์ง
- ์บ๋ฆฐ๋ ์ด๋ฒคํธ
- React๋ ๋ฆฌ์คํธ๋ฅผ ์ปดํฌ๋ํธ๋ก ๊ด๋ฆฌํ๋ฉด์
- ๊ฐ์ ์คํฌ๋กค(react-window)
- ๋ฉ๋ชจ์ด์ ์ด์ (useMemo, memo)
- ํค ๊ธฐ๋ฐ ๋ ๋๋ง ์ต์ ํ
โ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ๋ก ํธ ์ฑ๋ฅ์ ๋จ๊ณ์ ์ผ๋ก ๊ฐ์ ํ๊ธฐ ์ข์
- ์บ๋ฆฐ๋
- ์/์ฃผ ๋ทฐ ์ ํ
- ์ผ์ (๋ ์ง ํด๋ฆญ์ ์ ์ฒด โ ์ผ) ๋ทฐ ์ ํ
- ์ฑ์ฉ๊ณต๊ณ OCR
- ํ ์คํธ/์ด๋ฏธ์ง ์ ๋ก๋
- ๊ฒฐ๊ณผ ์ด์ ํ์ธ/์์ ํ ์ ์ฅ
- ์คํจ ์ ์ฌ์๋/์๋ ์ ๋ ฅ ์ ํ
- ๊ฒ์ํ
- ๋ฌดํ ์คํฌ๋กค
- ๊ฒ์/ํํฐ/์ ๋ ฌ ๋ณ๊ฒฝ
- ๊ฒ์๊ธ ์นด๋ ํด๋ฆญ โ ์์ธ ์ง์
- ์ข์์ ํ ๊ธ (์ฆ์ UI ๋ฐ์)
- ๋๊ธ ์์ฑ/์์ ์ญ์
- ์ข์์/๊ณต์
- ๊ฒ์๊ธ ์์ฑ(ํผ ์ ๋ ฅ โ ์ ๋ชฉ/๋ณธ๋ฌธ/ํ๊ทธ)
- ์ด๋ฏธ์ง/ํ์ผ ์ฒจ๋ถ
- ์ฑ๋ด/AI
- ์ฑํ ๋ชฉ๋ก/๋ํ ์์ ํ์ด์ง
- AI๊ฐ ์์ฑํ ๋ต๋ณ ๋ณด๊ธฐ
- ๋ฉด์ ๋ชจ๋ ํ ๊ธ
- ๋ฉ์์ง ์ ๋ ฅ/์ ์ก
- ๋ต๋ณ ์คํธ๋ฆฌ๋ฐ
- ๋ํ ์ด๋ ฅ ์คํฌ๋กค/๋ก๋
- ์ฑํ
- ๋ฐฉ ์ ํ โ ๋ฐฉ ์ง์
- ์ ๋ฐฉ ๋ง๋ค๊ธฐ
- ๊ฒ์
- ๋ฉ์์ง ์ ์ก/์์
- ๊ณผ๊ฑฐ ๋ฉ์์ง ๋ก๋ฉ
- ์ฝ์ ์ฒ๋ฆฌ. ์ /ํด์ฅ ํ์
- ํ์ผ/์ด๋ฏธ์ง ์ฒจ๋ถ
- ์บ๋ฆฐ๋
-
CalendarToolbar- ์บ๋ฆฐ๋ ์๋จ ์ปจํธ๋กค ์์ญ(์/์ฃผ ๋ทฐ ์ ํ, ์ด์ /๋ค์, ์ค๋ ๋ฒํผ, ์ฑ์ฉ ๊ณต๊ณ ๋ก ์ผ์ ๋ง๋ค๊ธฐ ๋ฒํผ)
-
EventModal- ์ผ์ ์์ฑ/์์ /์ญ์ ๋ฅผ ์ํ ํผ ๋ชจ๋ฌ
- ์ ๋ชฉ/์๊ฐ/์ข ์ผ/์ฅ์/๋ฉ๋ชจ ์ ๋ ฅ + ์ ํจ์ฑ ๊ฒ์ฆ + ์ ์ฅ/์ญ์ API ํธ์ถ ์ฐ๊ฒฐ
-
EventCard- ์ผ์ ๋ฆฌ์คํธ/์์ธ์์ ์ผ์ ํ ๊ฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์นด๋(UI)
- ์ ๋ชฉ/์๊ฐ/์ฅ์/ํ๊ทธ/์์ ํ์, ํด๋ฆญ ์ ์์ธ/์์ ๋ชจ๋ฌ ์คํ ํธ๋ฆฌ๊ฑฐ
-
OcrUploadModal- ์ฑ์ฉ๊ณต๊ณ (PDF/์ด๋ฏธ์ง) ์ ๋ก๋ ๋ชจ๋ฌ
- ํ์ผ ์ ํ โ ์ ๋ก๋ ์์ฒญ โ โ์ฒ๋ฆฌ ์ค(๋๊ธฐ)โ ์ํ ํ์ โ ๊ฒฐ๊ณผ(draft) ๋์ฐฉ ์ ๊ฒํ ํ๋ฉด์ผ๋ก ์ฐ๊ฒฐ
-
- ๊ฒ์ํ
-
PostList- ๊ฒ์๊ธ ๋ชฉ๋ก์ ๋ ๋๋งํ๋ ๋ฆฌ์คํธ ์ปดํฌ๋ํธ
- ๋ฌดํ์คํฌ๋กค ํธ๋ฆฌ๊ฑฐ, ๋ก๋ฉ/์๋ฌ/๋น ์ํ ์ฒ๋ฆฌ
-
PostCard- ๋ชฉ๋ก์์ ๊ฒ์๊ธ 1๊ฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์นด๋(UI)
- ์ ๋ชฉ/์์ฝ/์์ฑ์/์์ฑ์ผ/์ข์์/๋๊ธ ์/๊ณต์ ์, ํด๋ฆญ ์ ์์ธ ์ด๋
-
CommentList- ๋๊ธ ๋ชฉ๋ก + ๋๊ธ ์์ฑ ์ ๋ ฅ์ ํฌํจํ ์์ญ
- ๋๊ธ ์ถ๊ฐ/์์ /์ญ์ ํ ๋ฆฌ์คํธ ์ฆ์ ๊ฐฑ์ , ๋๊ด์ ์ ๋ฐ์ดํธ
-
LikeButton- ์ข์์ ํ ๊ธ ๋ฒํผ(ํ์ฑ/๋นํ์ฑ UI)
- ํด๋ฆญ ์ ์ข์์ API ํธ์ถ + ์ฆ์ UI ๋ฐ์(๋๊ด์ ์ ๋ฐ์ดํธ) + ์คํจ ์ ๋กค๋ฐฑ ์ฒ๋ฆฌ
-
SearchFilter- ๊ฒ์์ด ์ ๋ ฅ + ์ ๋ ฌ(์ต์ ์) ์ปจํธ๋กค
- ๋ณ๊ฒฝ ์ ๋ชฉ๋ก ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๊ฐฑ์ โ PostList ์ฌ์กฐํ ํธ๋ฆฌ๊ฑฐ
-
- ์ฑํ
-
RoomList- ์ฌ์ฉ์๊ฐ ์ฐธ์ฌํ ์ฑํ ๋ฐฉ ๋ชฉ๋ก(์ต๊ทผ ๋ฉ์์ง, ์์ฝ์ ๋ฑ์ง ํฌํจ)
- ๋ฐฉ ์ ํ/๊ฒ์/์ ๋ ฌ, ์ ํ ์ ํด๋น ๋ฐฉ์ผ๋ก ๋ผ์ฐํ ๋๋ ์ํ ๋ณ๊ฒฝ
-
MessageList- ํน์ ๋ฐฉ์ ๋ฉ์์ง ๋ชฉ๋ก์ ๋ ๋๋ง(์คํฌ๋กค ์์ญ)
- ์ ๋ฉ์์ง ์์ ์ ์๋จ ์ถ๊ฐ + ์๋ ์คํฌ๋กค, ํ๋จ ์คํฌ๋กค ์ ๊ณผ๊ฑฐ ๋ฉ์์ง ๋ก๋ฉ(๋ฌดํ์คํฌ๋กค)
-
MessageBubble- ๋ฉ์์ง 1๊ฐ์ ๋งํ์ UI(๋ด ๋ฉ์์ง/์๋ ๋ฉ์์ง ๊ตฌ๋ถ)
- ์๊ฐ/ํ๋กํ/์ฝ์ ์ํ ํ์
-
ChatInput- ๋ฉ์์ง ์ ๋ ฅ์ฐฝ + ์ ์ก ๋ฒํผ + ์ฒจ๋ถ ๋ฒํผ
- ์ํฐ ์ ์ก, ์ ์ก ์ค ๋นํ์ฑํ
-
- ๊ณตํต
-
Header- ์๋จ ๋ค๋น๊ฒ์ด์ ๋ฐ(๋ก๊ณ /ํ์ด์ง ํ์ดํ/์๋ฆผ/ํ๋กํ ๋ฉ๋ด)
-
Modal- ๊ณตํต ๋ชจ๋ฌ UI(์ค๋ฒ๋ ์ด, ESC/๋ฐ๊นฅ ํด๋ฆญ ๋ซ๊ธฐ, ํฌ์ปค์ค ํธ๋ฉ ๋ฑ)
-
Toast- ์ฑ๊ณต/์คํจ/๊ฒฝ๊ณ ์๋ฆผ์ ์งง๊ฒ ๋ณด์ฌ์ฃผ๋ ์ปดํฌ๋ํธ
- โ์ผ์ ์ด ์ ์ฅ๋์ด์โ, โ์ ๋ก๋ ์คํจ, ๋ค์ ์๋ํด์ฃผ์ธ์โ
-
Avatar- ์ฌ์ฉ์ ํ๋กํ ์ด๋ฏธ์ง ํ์(์์ผ๋ฉด ์ด๋์ /๊ธฐ๋ณธ ์์ด์ฝ)
- ํฌ๊ธฐ/๋ชจ์ ์ต์ ์ ๊ณต, ํด๋ฆญ ์ ํ๋กํ ๋ฉ๋ด ํธ๋ฆฌ๊ฑฐ
-
| ํญ๋ชฉ | React | Vanilla JS | Vue |
|---|---|---|---|
| UI ๊ตฌ์ฑ ๋ฐฉ์ | ์ปดํฌ๋ํธ ๊ธฐ๋ฐ | DOM ์ง์ ์กฐ์ | ์ปดํฌ๋ํธ ๊ธฐ๋ฐ |
| ์ํ ๊ด๋ฆฌ | ์ํ(State) ์ค์ฌ | ์ง์ ์ํ ๊ด๋ฆฌ ํ์ | ์ํ ์ค์ฌ |
| UI ๋ณต์ก๋ ๋์ | ๋์ | ๋ณต์กํด์ง์๋ก ์ด๋ ค์ | ๋์ |
| ์ํ๊ณ/ํ์ฅ์ฑ | ๋งค์ฐ ํ๋ถ | ์ ํ์ | ํ๋ถ |
| ๋๊ท๋ชจ ํ๋ก์ ํธ ์ ํฉ์ฑ | ๋์ | ๋ฎ์ | ๋์ |
-
UI ๊ตฌ์กฐ ๋ฐ ๋ณต์ก๋ ๊ด๋ฆฌ
-
Vanilla JS๋ DOM์ ์ง์ ์กฐ์ํ๋ ๋ฐฉ์์ด๊ธฐ ๋๋ฌธ์, ํ๋ฉด ์ํ๊ฐ ๋ง์์ง์๋ก DOM ์กฐ์ ์ฝ๋์ ์ํ ๊ด๋ฆฌ ๋ก์ง์ด ์๋ก ์ฝํ ๊ตฌ์กฐ๊ฐ ๋น ๋ฅด๊ฒ ๋ณต์กํด์ง. โ ํ๋ฉด ์์ ๊ธฐ๋ฅ์ด ์ฆ๊ฐํ ์๋ก ์ ์ง๋ณด์ ๋น์ฉ์ด ์ปค์ง ๊ฐ๋ฅ์ฑ์ด ๋์
โ๏ธ React๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ์ ์ํ ์ค์ฌ(State) UI ๋ชจ๋ธ์ ์ ๊ณตํ์ฌ, ํ๋ฉด๊ณผ ๋ก์ง์ ๊ธฐ๋ฅ ๋จ์๋ก ๊ด๋ฆฌํ ์ ์์ด UI ๋ณต์ก๋๊ฐ ๋์ ์๋น์ค์ ๋ ์ ํฉํจ
-
-
์ํ ๊ด๋ฆฌ ๋ฐฉ์๊ณผ UI ์ ๋ฐ์ดํธ ํ๋ฆ
-
Vanilla JS๋ ์ํ ๊ด๋ฆฌ์ UI ์ ๋ฐ์ดํธ ํ๋ฆ์ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ค๊ณํด์ผ ํ๋ฏ๋ก, ๋ฌดํ ์คํฌ๋กค, ๋ชจ๋ฌ ์ด๋ฆผ/๋ซํ, ์ค์๊ฐ ๋ฐ์ดํฐ ๋ฐ์๊ณผ ๊ฐ์ ์๊ตฌ์ฌํญ์ด ๋ง์์ง์๋ก ๊ตฌํ ๋ฐฉ์์ด ํ๋ฉด๋ง๋ค ๋ฌ๋ผ์ง ์ํ์ด ์์
โ๏ธ React๋ ์ํ ๋ณํ์ ๋ฐ๋ผ UI๊ฐ ์๋์ผ๋ก ๊ฐฑ์ ๋๋ ์ ์ธํ ๋ฐฉ์์ผ๋ก, ์ํ์ UI ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ช ํํ๊ฒ ์ ์งํ ์ ์์
-
-
ํ๋ ์์ํฌ, ์ํ๊ณ ์ฐ๊ณ์ฑ
-
Vue ์ญ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ์ ์ํ ์ค์ฌ UI๋ฅผ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ์ด์ง๋ง, devths๋ Next.js ๊ธฐ๋ฐ ๊ตฌ์กฐ์์ ๊ถํฉ, React ์ํ๊ณ(์ํ ๊ด๋ฆฌ, ์๋ฒ ์ํ ๊ด๋ฆฌ, UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ)๋ฅผ ํญ๋๊ฒ ํ์ฉํ ํ์๊ฐ ์๋ ํ๋ก์ ํธ์
โ๏ธ React๋ Next.js๋ฅผ ๋น๋กฏํ ํ๋ ์์ํฌ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํ๊ณ์์ ์ฐ๊ณ์ฑ์ด ๋์,์ฅ๊ธฐ์ ์ธ ํ์ฅ์ฑ๊ณผ ๊ธฐ์ ์คํ ์ผ๊ด์ฑ ์ธก๋ฉด์์ ์ ๋ฆฌํ๋ค๊ณ ํ๋จํจ
-
-
๋๊ท๋ชจ ํ๋ก์ ํธ ๋ฐ ํ ํ์ ์ ํฉ์ฑ
-
๋๊ท๋ชจ ํ๋ก์ ํธ ๊ด์ ์์, Vanilla JS๋ ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๊ตฌ์กฐ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง๋ ๋ฐ๋ฉด, React์ Vue๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ค๊ณ๋ฅผ ํตํด ๋๊ท๋ชจ UI๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์
โ๏ธ ์ด ์ค React๋ ์ปค๋ฎค๋ํฐ์ ๋ ํผ๋ฐ์ค, ํ์ฅ ์ํ๊ณ๊ฐ ๋งค์ฐ ํ๋ถํ์ฌ ํ ํ๋ก์ ํธ ํ๊ฒฝ์์ ๋ฌธ์ ํด๊ฒฐ๊ณผ ๊ธฐ์ ํ์ฅ์ด ์๋์ ์ผ๋ก ์์ํจ
-
-
React 19.2
- 2025๋ 10์ 1์ผ์ ๋ฆด๋ฆฌ์ฆ๋ ์์ (stable) ๋ฒ์
-
18 ๋ฒ์ ์ด๋ ๋ฌ๋ผ์ง ์
- ๋น๋๊ธฐ ์์
์ฒ๋ฆฌ ๋ฐฉ์์ด ํจ์ฌ ๋จ์ํด์ง: Action ์ค์ฌ
- 18: ๋ฒํผ๋ง๋ค ๋ก๋ฉ/์คํจ/์๋ฃ ๊ด๋ฆฌ๋ฅผ ์ง์ ์ฑ๊ฒจ์ผ ํ์
- 19: ํผ/๋ฒํผ์์) Action ํจ์๋ฅผ ์ค์ฌ์ผ๋ก React๊ฐ pending(์งํ ์ค) ์ํ์ Action ๊ฒฐ๊ณผ(state)๋ฅผ ๋ค๋ฃฐ ์ ์๋ ํ์ค ํ
/ํ๋ฆ์ ์ ๊ณตํด์, ๋ก๋ฉ ํ์ยท๋ฒํผ ๋นํ์ฑํยท๊ฒฐ๊ณผ ๋ฉ์์ง ์ฐ๊ฒฐ์ด ํจ์ฌ ๋จ์ํด์ง (
<form action>,useActionState,useFormStatus)
- ๋น๋๊ธฐ ์์
์ฒ๋ฆฌ ๋ฐฉ์์ด ํจ์ฌ ๋จ์ํด์ง: Action ์ค์ฌ
-
Devths์์ Action์ด ํนํ ๋์๋๋ ๊ณณ
- OCR ์ ๋ก๋: ์ ๋ก๋ โ ๋ถ์ ์ค โ ๊ฒฐ๊ณผ ๋ฐ๊ธฐ/์คํจ
- ์ผ์ ์ ์ฅ: ์ ์ฅ ์ค โ ์๋ฃ/์คํจ
- ๊ฒ์๊ธ ์์ฑ: ๋ฑ๋ก ์ค โ ์๋ฃ/์คํจ
- ์ฑํ ์ ์ก: ์ ์ก ์ค โ ์๋ฃ/์คํจ
- ์ฑ๋ด ์ง๋ฌธ: ๋ต๋ณ ์์ฑ ์ค โ ์๋ฃ/์คํจ
โ ๋ก๋ฉ ํ์, ๋ฒํผ ๋นํ์ฑํ, ์๋ฌ/์ฑ๊ณต ๋ฉ์์ง ๊ฐ์ ๊ฒ์ ์ผ๊ด๋๊ฒ ๋ง๋ค๊ธฐ ์ฌ์์ง
- Devths๋ ์บ๋ฆฐ๋(OCR ๊ธฐ๋ฐ ์ผ์ ์๋ ์์ฑ), ๊ฒ์ํ(๋ฌดํ ์คํฌ๋กค/์ข์์/๋๊ธ), ์ฑ๋ด(AI ์๋ต ์คํธ๋ฆฌ๋ฐ), ์ฑํ (์ค์๊ฐ ์ก์์ /์ฝ์/์ฒจ๋ถ)์ฒ๋ผ ์ํ ๋ณํ์ ์ธํฐ๋์ ์ด ๋ง์ ๊ธฐ๋ฅ์ด ํต์ฌ์ธ ์๋น์ค์
- ๋ฐ๋ผ์ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก UI๋ฅผ ๋ถ๋ฆฌํ๊ณ , ์ํ ๋ณํ์ ๋ฐ๋ผ ํ๋ฉด์ด ์๋์ผ๋ก ๊ฐฑ์ ๋๋ React์ ๋ฐฉ์์ด ์๋น์ค ๊ตฌ์กฐ์ ๊ฐ์ฅ ์ ํฉํ๋ค๊ณ ํ๋จํจ
- ๋ํ Devths์์ ํ์ํ ๋ค์ํ ๊ธฐ๋ฅ(๋ผ์ฐํ , ์๋ฒ ์ํ ๊ด๋ฆฌ, ํผ ์ฒ๋ฆฌ, ์ํ๊ด๋ฆฌ, UI ์ปดํฌ๋ํธ)์ ์ํ๊ณ ๋๊ตฌ๋ค๊ณผ ์์ฐ์ค๋ฝ๊ฒ ๊ฒฐํฉํ ์ ์์ด ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ๋์
- ํนํ React 19.2๋ Action ์ค์ฌ ๋น๋๊ธฐ ์ฒ๋ฆฌ ํจํด์ ํตํด ์ ๋ก๋/์ ์ฅ/์ ์ก์ฒ๋ผ ๋ฐ๋ณต๋๋ ์์ฒญ UI๋ฅผ ์ผ๊ด๋ ํํ๋ก ๊ตฌํํ๊ธฐ ์ฌ์, ํ๋ก์ ํธ ์ ๋ฐ์ ์ฝ๋ ์ค๋ณต๊ณผ ๋ฒ๊ทธ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์์
- React ๊ธฐ๋ฐ ํ์คํ ํ๋ ์์ํฌ
- React UI ๊ฐ๋ฐ์ ๋ํด, ๋ผ์ฐํ /๋น๋/๋ฐฐํฌ/์ต์ ํ ๊ฐ์ ์ฑ ์ด์์ ํ์ํ ๊ฒ๋ค์ ํ๋ ์์ํฌ๊ฐ ํ์ค์ผ๋ก ์ ๊ณตํจ
- ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ
+ ๋ ์ด์์ ์์คํ
(App Router)
- ํด๋ ๊ตฌ์กฐ๊ฐ URL ๊ตฌ์กฐ๊ฐ ๋๊ณ ,
layout.tsx๋ก ๊ณตํต ๋ ์ด์์์ ๋ถ๋ฆฌ ๊ฐ๋ฅ - ํ์ด์ง ์๊ฐ ๋ง๊ณ ๊ณตํต ๋ ์ด์์์ด ๋ฐ๋ณต๋๋ ์๋น์ค์์ ๊ตฌ์กฐ๊ฐ ๊ฐ๋ํ๊ฒ ์ ์ง๋จ
- ํด๋ ๊ตฌ์กฐ๊ฐ URL ๊ตฌ์กฐ๊ฐ ๋๊ณ ,
- ๋ ๋๋ง ์ ๋ต ์ ํ ๊ฐ๋ฅ (CSR/SSG/SSR)
- ํ์ด์ง ์ฑ๊ฒฉ์ ๋ฐ๋ผ ์์ด์ ๊ตฌ์ฑ ๊ฐ๋ฅ
- ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ณธ ์ ๊ณต
- ์ฝ๋ ์คํ๋ฆฌํ , ํ๋ฆฌํจ์นญ, ์ด๋ฏธ์ง ์ต์ ํ ๋ฑ ๊ธฐ๋ณธ ์ต์ ํ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์ด๊ธฐ ์ฑ๋ฅ์ ๋์ด์ฌ๋ฆฌ๊ธฐ ์ฌ์
- ์๋ฌ/๋ก๋ฉ/Not Found ์ฒ๋ฆฌ ํจํด ์ ๊ณต
-
loading.tsx,error.tsx,not-found.tsx๊ฐ์ ํ์ผ๋ก ์ํ UI๋ฅผ ํ์ค ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ - ํ๋ฉด์ด ๋ง์์ ธ๋ UX๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ๊ธฐ ์ข์
-
Devths๋ ๋๋ฉ ํ์ด์ง๋ SSG, ๋ก๊ทธ์ธ ์ดํ ์ฑ ์์ญ(์บ๋ฆฐ๋/๊ฒ์ํ/์ฑ๋ด/์ฑํ )์ CSR๋ก ์ด์ํ๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์, Next.js๊ฐ ์ ๊ณตํ๋ ํ์ด์ง ์ฑ๊ฒฉ๋ณ ๋ ๋๋ง ์ ๋ต + ์ฑ ๊ตฌ์กฐ ํ์คํ๊ฐ ํนํ ์ ๋ฆฌํจ
(1) ๋๋ฉ์ SSG๋ก ๋น ๋ฅด๊ฒ ์ ๊ณตํด์ผ ํจ
- ๋๋ฉ์ ์๋น์ค ์๊ฐ/์์ํ๊ธฐ ๋ชฉ์ ์ด๋ผ ์ฝํ
์ธ ๊ฐ ๋น๊ต์ ๊ณ ์ ์ ์ด๋ฉฐ, ์ฒซ ์ง์
์๋๊ฐ ์ค์ํจ
- Next.js๋ ํ์ด์ง ๋จ์๋ก SSG๋ฅผ ์ ์ฉํด ์ ์ HTML์ ๋ฏธ๋ฆฌ ์์ฑํ ์ ์์ด ์ด๊ธฐ ๋ก๋ฉ์ ๋น ๋ฅด๊ฒ ๋ง๋ค๊ธฐ ์ข์
(2) ๋ก๊ทธ์ธ ์ดํ ํ์ด์ง๋ CSR
- ์บ๋ฆฐ๋/๊ฒ์ํ/์ฑํ
/์ฑ๋ด์ ์ฌ์ฉ์๋ณ ๋ฐ์ดํฐ์ ์ค์๊ฐ ์ธํฐ๋์
์ด ํต์ฌ์ด๋ผ, ํ๋ฉด์ด ๊ณ์ ๋ณํ๊ณ ์ํ ๊ด๋ฆฌ๊ฐ ์ค์ํจ
- Next.js๋ CSR ๊ธฐ๋ฐ์ React ์ฑ์ ๊ทธ๋๋ก ๊ตฌ์ฑํ ์ ์๊ณ , ๋ผ์ฐํ /๋ ์ด์์/์ฝ๋ ์คํ๋ฆฌํ ๊ฐ์ ์ฑ ๊ตฌ์กฐ๋ฅผ ํ๋ ์์ํฌ ๊ท์น์ผ๋ก ์ ์งํ ์ ์์
(3) ํ๋ฉด์ด ๋ง์์๋ก โ๋ผ์ฐํ /๋ ์ด์์ ํ์คโ์ด ์ค์ํด์ง
- Devths๋ ๋๋ฉ์ธ์ด ์ฌ๋ฌ ๊ฐ(์บ๋ฆฐ๋/๊ฒ์ํ/์ฑ๋ด/์ฑํ
)๋ผ ๊ณตํต ๋ ์ด์์๊ณผ ์ ๊ทผ ์ ์ด(๋ก๊ทธ์ธ ์ /ํ)๊ฐ ๋ฐ๋ณต๋จ
- Next.js(App Router)๋
layout,loading,error๊ฐ์ ํ์ค ํ์ผ๋ก ๊ณตํต UI์ ์ํ UI๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ด ํ์ฅ ์ ๊ท์น์ด ํ๋ค๋ฆฌ์ง ์์
- Next.js(App Router)๋
(1) SSG (Static Site Generation)
๐ก๋น๋ ์์ ์ ํ์ด์ง HTML์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๊ณ , ์ฌ์ฉ์๊ฐ ์์ฒญํ๋ฉด ๊ทธ ์ ์ HTML์ ๊ทธ๋๋ก ๋น ๋ฅด๊ฒ ์ ๊ณตํ๋ ๋ฐฉ์
- ๋น๋/๋ฐฐํฌ ์์ ์ ์๋ฒ๊ฐ HTML์ ๋ฏธ๋ฆฌ ์์ฑํด๋๊ณ , ์ฌ์ฉ์๋ ๋ง๋ค์ด์ง ์ ์ HTML์ ๊ทธ๋๋ก ๋ฐ๋ ๋ฐฉ์
- ์ฌ์ฉ์๋ ์์ฒญํ์๋ง์ ์์ฑ๋ ํ๋ฉด์ ๋น ๋ฅด๊ฒ ๋ณด๊ฒ ๋จ
-
์ฅ์
- ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ HTML์ ๋ฐ๋ก ์ ๊ณตํ๋ฏ๋ก ์ฒซ ๋ก๋ฉ์ด ๋งค์ฐ ๋น ๋ฅด๊ณ , ์๋ฒ ๋ถ๋ด/๋น์ฉ์ด ๋ฎ์
- HTML์ด ์์ฑ๋ ์ํ๋ผ SEO/๊ณต์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ(OF)์๋ ์ ๋ฆฌํด ๋๋ฉ/์๊ฐ ํ์ด์ง์ ์ ํฉํจ
- ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ HTML์ ๋ฐ๋ก ์ ๊ณตํ๋ฏ๋ก ์ฒซ ๋ก๋ฉ์ด ๋งค์ฐ ๋น ๋ฅด๊ณ , ์๋ฒ ๋ถ๋ด/๋น์ฉ์ด ๋ฎ์
-
๋จ์
- ๋น๋ ์ดํ ๋ด์ฉ์ด ๋ฐ๋๋ฉด ์ฆ์ ๋ฐ์๋์ง ์์์, ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ ค๋ฉด ์ฌ๋น๋/์ฌ๋ฐฐํฌ(๋๋ ISR ๊ฐ์ ๋ณด์ ์ ๋ต)๊ฐ ํ์ํจ
Devths
- SSG๊ฐ ํ์ํ ํ์ด์ง/์ปดํฌ๋ํธ
- ํ์ด์ง: ๋๋ฉ ํ์ด์ง
(2) CSR (Client-Side Rendering)
๐ก์๋ฒ๋ ๋ณดํต
๋น HTML(๊ป๋ฐ๊ธฐ) + JS ํ์ผ
์ ์ฃผ๊ณ ,
๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ
JS๋ฅผ ๋ค์ด๋ก๋/์คํํด์ ํ๋ฉด์ ๋ ๋๋ง
ํ๋ ๋ฐฉ์
- ์๋ฒ๋ ๋น HTML + JS๋ฅผ ๋ด๋ ค์ฃผ๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ JS๋ฅผ ์คํํด ํ๋ฉด์ ๋ ๋๋งํ๋ ๋ฐฉ์
- ์ฌ์ฉ์๋ JS ๋ก๋ฉ ํ ๋ฐ์ดํฐ(API)๋ฅผ ๋ฐ์ ํ๋ฉด์ด ์์ฑ๋จ
-
์ฅ์
- ์ฌ์ฉ์๋ณ ๋ฐ์ดํฐ/์ค์๊ฐ ์ธํฐ๋์ ์ด ๋ง์ ํ์ด์ง์ ์ ๋ฆฌํจ
- ์ํ ๋ณํ์ ๋ฐ๋ผ UI๋ฅผ ์์ฃผ ๊ฐฑ์ ํด์ผํ๋ ์ฑ์์ ๊ตฌ์กฐ๊ฐ ๋จ์ํ๊ณ ์ ์ฐํ๊ฒ ๊ตฌํ ๊ฐ๋ฅํจ
-
๋จ์
- ์ด๊ธฐ ๋ก๋ฉ ์ JS ๋ค์ด๋ก๋, ์คํ์ด ํ์ํด์ ์ฒซ ํ๋ฉด์ด ๋ฆ๊ฒ ๋ฐ ์ ์๊ณ , SEO(๊ฒ์ ๋ ธ์ถ) ์ธก๋ฉด์์ ๋ถ๋ฆฌํ ์ ์์
CSR์ด ํ์ํ ํ์ด์ง/์ปดํฌ๋ํธ
- ํ์ด์ง: ์บ๋ฆฐ๋, ๊ฒ์ํ, ์ฑ๋ด, ์ฑํ , ํ๋กํ
- ์ปดํฌ๋ํธ
- ์บ๋ฆฐ๋
FullCalendar(์/์ฃผ/์ผ ์ ํ, ํด๋ฆญ, ๋๋๊ทธ)EventModal(ํผ ์ ๋ ฅ/์ ์ฅ)OcrUploadModal(์ ๋ก๋โ์ฒ๋ฆฌ์คโ๊ฒฐ๊ณผ ๋ฐ์)- ๊ฒ์ํ
PostList(๋ฌดํ์คํฌ๋กค)LikeButton(์ฆ์ ํ ๊ธ/๋๊ด์ ์ ๋ฐ์ดํธ)CommentList(์ถ๊ฐ/์์ /์ญ์ )WriteForm(์ ๋ ฅ/์ฒจ๋ถ)- ์ฑ๋ด/AI
ChatThread(๋ํ ๋์ )StreamingAnswer(์คํธ๋ฆฌ๋ฐ ์ถ๋ ฅ)- ์ฑํ
RoomList(์์ฝ์ ๋ฑ์ง ๊ฐฑ์ )
MessageList(์ค์๊ฐ ์์ + ๊ณผ๊ฑฐ ๋ก๋ฉ)
ChatInput(์ ์ก/์ฒจ๋ถ)โก๏ธ ๊ณตํต ํน์ง: ์ฌ์ฉ์ ์ ๋ ฅ/์๋ฒ ์์ฒญ/์ค์๊ฐ ์ด๋ฒคํธ๋ก ์ํ๊ฐ ๊ณ์ ๋ฐ๋
(3) SSR (Server-Side Rendering)
๐ก์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ฒ๊ฐ HTML์ ๋จผ์ ๋ ๋๋งํด์ ๋ด๋ ค์ฃผ๋ ๋ฐฉ์
- ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ์๋ฒ๊ฐ HTML์ ๋จผ์ ๋ ๋๋งํด์ ๋ด๋ ค์ฃผ๋ ๋ฐฉ์
- ์ฌ์ฉ์๋ ์์ฑ๋ ํ๋ฉด์ ๋ ๋นจ๋ฆฌ ๋ณด๊ฒ ๋จ
-
์ฅ์
- ์ฒซ ํ๋ฉด์ด ๋น ๋ฅด๊ฒ ๋ณด์ผ ์ ์๊ณ , ์๋ฒ๊ฐ ์์ฒญ ์์ ์ ์ต์ ๋ฐ์ดํฐ๋ก HTML์ ๋ง๋ค์ด์ ์ ๋ฌํ ์ ์์ด์ ์ด๊ธฐ UX์ ์ต์ ์ฑ์ด ์ค์ํ ํ์ด์ง์ ์ ๋ฆฌํจ
-
๋จ์
- ์์ฒญ๋ง๋ค ์๋ฒ๊ฐ ๋ ๋๋ง/๋ฐ์ดํฐ ํจ์นญ์ ํด์ผํด์ ์๋ฒ ๋ถํ์ ๋น์ฉ์ด ์ฆ๊ฐํ ์ ์๊ณ , ์บ์ฑ/์ธ์ฆ/์๋ฌ ์ฒ๋ฆฌ ๋ฑ ๊ตฌํ ๋ณต์ก๋๊ฐ ์ฌ๋ผ๊ฐ ์ ์์
Devths๋ ๋๋ฉ์ ์ ์ธํ๋ฉด ๋ก๊ทธ์ธ ํ ์ฌ์ฉ์๋ณ ๋ฐ์ดํฐ + ์ค์๊ฐ ์ธํฐ๋์ ์ด ํต์ฌ์ด๋ผ, SSR์ ์ฅ์ (๊ณต๊ฐ ํ์ด์ง SEO, ์ฒซ ํ๋ฉด ์์ฑ)์ด ํฌ๊ฒ ํ์ํ์ง ์์ โ ๋์ ์๋ฒ ๋ถํ, ์ธ์ฆ/์บ์/์๋ฌ ์ฒ๋ฆฌ ๋ณต์ก๋๋ง ๋ ์ ์์ด์ ๋ง์ง ์์
(4) ISR (Incremental Static Regeneration)
๐ก์ฒ์์ SSG์ฒ๋ผ ์ ์ HTML๋ก ๋น ๋ฅด๊ฒ ์ ๊ณตํ๋, ์ค์ ํ ์๊ฐ(๋๋ ์กฐ๊ฑด)๋ง๋ค ์๋ฒ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ํ์ด์ง๋ฅผ ๋ค์ ์์ฑํด ์ต์ ๋ด์ฉ์ผ๋ก ๊ฐฑ์ ํ๋ ๋ฐฉ์
- SSG์ฒ๋ผ HTML์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋, ์ค์ ํ ์ฃผ๊ธฐ๋ง๋ค ์๋ฒ๊ฐ ํ์ด์ง๋ฅผ ๋ค์ ์์ฑํด์ ์ ์ ํ์ด์ง๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์
- ์ฌ์ฉ์๋ ๋๋ถ๋ถ ์ ์ HTML์ ๋น ๋ฅด๊ฒ ๋ฐ๊ณ , ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ๋ด์ฉ์ด ์๋์ผ๋ก ์ต์ ์ผ๋ก ๊ฐฑ์ ๋จ
-
์ฅ์
- SSG์ ๋น ๋ฅธ ๋ก๋ฉ/๋ฎ์ ์๋ฒ ๋ถ๋ด์ ์ ์งํ๋ฉด์๋, ๊ณต์ง/๋ฐฐ๋/๋ญํน์ฒ๋ผ ๊ฐ๋ ๋ฐ๋๋ ์ฝํ ์ธ ๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ด ์ฑ๋ฅ๊ณผ ์ต์ ์ฑ์ ๊ท ํ์๊ฒ ๊ฐ์ ธ๊ฐ ์ ์์
-
๋จ์
- ์ฆ์ ์ต์ ์ ์๋๊ณ , ์ฃผ๊ธฐ ์ ๊น์ง๋ ์ด์ ๋ด์ฉ์ด ๋ณด์ผ ์ ์์.
- ๋ํ ์ฌ์์ฑ ํ์ด๋ฐ/์บ์ ์ ์ฑ ์ ์๋ชป ์ก์ผ๋ฉด ๋ฐ์ดํฐ ๊ฐฑ์ ์ด ์์๊ณผ ๋ค๋ฅด๊ฒ ๋๊ปด์ง ์ ์์
Devths์ ํต์ฌ ํ์ด์ง๋ค์ ๋ก๊ทธ์ธ ๊ธฐ๋ฐ ๊ฐ์ธํ + ์ค์๊ฐ/์ฆ์ ๋ฐ์ ๋ฐ์ดํฐ๋ผ์, ๊ณต๊ฐ ์ ์ ํ์ด์ง๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐฑ์ ํ๋ ISR์ ๊ฐ์ ์ ๊ฑฐ์ ๋ชป ์ โ ๋์ ๊ฐฑ์ ์ง์ฐ/์ค๋ณต ๊ตฌํ์ด ์๊ธธ ์ ์์
(1) App Router
-
/appํด๋ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ๋๋ Next.js์ ์ต์ ๋ผ์ฐํฐ -
layout.tsx๋ก ๊ณตํต ๋ ์ด์์์ ํด๋ ๋จ์๋ก ๊ธฐ๋ณธ ์ ๊ณตํ๊ณ ,loading.tsx / error.tsx / not-found.tsx๋ก ์ํ UI๋ฅผ ํ์ค ํ์ผ๋ก ๋ถ๋ฆฌํ ์ ์์ - Route Group์ผ๋ก URL์ ์ ์งํ๋ฉด์ ํด๋ ๊ตฌ์กฐ๋ง ๋ชฉ์ ๋ณ๋ก ๋ถ๋ฆฌ ๊ฐ๋ฅ
-
(marketing): ๋๋ฉ(SSG) -
(app): ๋ก๊ทธ์ธ ์ดํ ๋ชจ๋ ํ์ด์ง(CSR)
-
-
์ฅ์
- Devths์ฒ๋ผ ๊ณตํต ๋ ์ด์์(ํค๋/์ฌ์ด๋๋ฐ)์ด ๋ง์ ์๋น์ค์์ ๊ตฌ์กฐ๊ฐ ๊น๋ํด์ง
- ๋๋ฉ(SSG)๊ณผ ๋ก๊ทธ์ธ ํ ์ฑ(CSR) ์์ญ์ ํด๋ ๊ตฌ์กฐ๋ก ๋ช ํํ ๋๋ ํ ๊ท์น์ ์ ์งํ๊ธฐ ์ฌ์
- ๋ก๋ฉ/์๋ฌ UI๋ฅผ ํ์ค ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ ์ ์์ด ํ์ด์ง๊ฐ ๋์ด๋๋ UX๊ฐ ์ผ๊ด๋จ
-
๋จ์
- ๊ธฐ๋ณธ ๊ฐ๋
(์๋ฒ/ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ,
use client, ํด๋ ๊ท์น ๋ฑ)์ด Pages Router๋ณด๋ค ๋ฏ์ค์ด์ ์ด๊ธฐ ํ์ต ๋น์ฉ์ด ๋ ํผ - ์๋ชป ์ค๊ณํ๋ฉด ํด๋ผ์ด์ธํธ๋ก๋ง ์ธ ๊ฑด๋ฐ๋
use client๋ฒ์๊ฐ ์ปค์ ธ ์ฅ์ ์ด ์ฝํด์ง ์ ์์
- ๊ธฐ๋ณธ ๊ฐ๋
(์๋ฒ/ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๋ถ๋ฆฌ,
Devths๋ ๋๋ฉ SSG + ๋ก๊ทธ์ธ ํ CSR ์ฑ ๊ตฌ์กฐ๋ผ์, App Router์ ๋ ์ด์์/๋ผ์ฐํ ํ์คํ + ๋ง์ผํ /์ฑ ์์ญ ๋ถ๋ฆฌ(Route Group) ์ฅ์ ์ ๊ทธ๋๋ก ํ์ฉํ๊ธฐ ์ข์ โ ํ๋ฉด ์๊ฐ ๋์ด๋ ๊ตฌ์กฐ ๊ท์น์ด ํ๋ค๋ฆฌ์ง ์์
(2) Page Router
-
/pagesํด๋ ๊ธฐ๋ฐ์ ์ ํต์ ์ธ Next.js ๋ผ์ฐํฐ - ํ์ผ์ด ๊ณง URL์ด๋ฉฐ, ๋ฐ์ดํฐ ํจ์นญ์
getStaticProps/getServerSideProps๊ฐ์ ํ์ด์ง ํจ์ ์ค์ฌ์ผ๋ก ๊ตฌ์ฑ๋จ -
์ฅ์
- ๊ฐ๋ ์ด ๋จ์ํด์ Next.js๋ฅผ ์ฒ์ ์ฐ๋ ํ์๊ฒ ์ง์ ์ฅ๋ฒฝ์ด ๋ฎ์
- โํ์ด์ง ๋จ์๋ก SSR/SSGโ๊ฐ ์ง๊ด์ ์ด๋ผ ๋น ๋ฅด๊ฒ ๊ตฌํํ๊ธฐ ์ฌ์
-
๋จ์
- Devths์ฒ๋ผ ๊ณตํต ๋ ์ด์์์ด ๋ง๊ณ ํ์ด์ง๊ฐ ๋ง์ ์๋น์ค์์ ๋ ์ด์์/์ํ UI(๋ก๋ฉ/์๋ฌ) ํจํด์ ์ผ๊ด๋๊ฒ ์ ์งํ๋ ค๋ฉด ํ์ด ๊ท์น์ ๋ ๋ง์ด ์ง์ ์ ํด์ผ ํจ
- ๋๋ฉ(SSG)๊ณผ ์ฑ(CSR)์ ๊ตฌ์กฐ์ ์ผ๋ก ๋ถ๋ฆฌํ๋๋ผ๋, App Router๋งํผ โํด๋ ๋จ์ ๋ ์ด์์/์ํ UI ํ์คโ์ด ๊ฐํ์ง ์์ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๊ด๋ฆฌ ๋์ด๋๊ฐ ์ฌ๋ผ๊ฐ ์ ์์
Devths์์๋ Pages Router๋ก ๊ตฌํ์ ๊ฐ๋ฅํ์ง๋ง, ํ๋ฉด์ด ๋์ด๋ ์๋ก ๋ ์ด์์/์๋ฌ/๋ก๋ฉ ๊ท์น์ ํ์ด ์ง์ ๊ด๋ฆฌํด์ผ ํ๋ ๋น์ค์ด ์ปค์ง
โ ์ฅ๊ธฐ์ ์ผ๋ก๋ ๊ตฌ์กฐ ์ผ๊ด์ฑ ์ ์ง ๋น์ฉ์ด ๋ ๋ค ์ ์์
| ํญ๋ชฉ | Next.js | Vite + React |
|---|---|---|
| ๋ผ์ฐํ | ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ๋ด์ฅ | ์ง์ ๊ตฌ์ฑ ํ์ |
| SSR/SSG | ๊ธฐ๋ณธ ์ง์ | ์ง์ ๊ตฌ์ฑ |
| ๋ ์ด์์ ๊ด๋ฆฌ | layout ๊ตฌ์กฐ ์ ๊ณต | ์ง์ ์ค๊ณ |
| ์๋ฌ ํ์ด์ง ์ฒ๋ฆฌ | ๋ด์ฅ(error/not-found) | ์ง์ ๊ตฌํ |
| ํ๋ก์ ํธ ํ์ฅ์ฑ | ๋์ | ์ค๊ณ์ ๋ฐ๋ผ ํธ์ฐจ |
-
๋ผ์ฐํ /ํ์ด์ง ๊ตฌ์กฐ ๊ด๋ฆฌ
-
Vite + React๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ผ์ฐํ ์ด ๋ด์ฅ๋์ด ์์ง ์์, React Router ๋ฑ ์ธ๋ถ ๋ผ์ฐํฐ๋ฅผ ๋ถ์ด๊ณ (์ค์ฒฉ ๋ผ์ฐํ , ์ธ์ฆ ๊ฐ๋, ๋ฆฌ๋ค์ด๋ ํธ ๊ท์น ํฌํจ) ํ๋ก์ ํธ์์ ์ง์ ์ค๊ณํด์ผ ํจ.
-
ํ์ด์ง ์๊ฐ ๋์ด๋ ์๋ก ๋ผ์ฐํ ๊ท์น + ํด๋ ๊ตฌ์กฐ + ๋ ์ด์์ ์ ์ฉ ๋ฐฉ์์ด ํ ์ปจ๋ฒค์ ์ ์์กดํ๊ฒ ๋์ด ๊ตฌ์กฐ๊ฐ ํ๋ค๋ฆด ๊ฐ๋ฅ์ฑ์ด ์ปค์ง
โ๏ธ ๋ฐ๋ฉด Next.js๋ ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ด ๋ด์ฅ๋์ด ์์ด, ํด๋ ๊ตฌ์กฐ๊ฐ ๊ณง URL ๊ตฌ์กฐ๋ก ์ฐ๊ฒฐ๋๊ณ ๋ผ์ฐํ ๊ท์น์ด ์์ฐ์ค๋ฝ๊ฒ ํ์คํ๋จ. ๋ฐ๋ผ์ ํ์ด์ง๊ฐ ๋ง์์ ธ๋ ๊ตฌ์กฐ๋ฅผ ์ผ๊ด๋๊ฒ ์ ์งํ๊ธฐ์ ์ ๋ฆฌํจ
-
-
SSR/SSG ๋์ ๋น์ฉ๊ณผ ์ด์ ํ์ฅ์ฑ
-
Vite + React๋ ๊ธฐ๋ณธ์ด SPA ์ค์ฌ์ด๋ฏ๋ก SSR/SSG๊ฐ ํ์ํด์ง ๊ฒฝ์ฐ(๋๋ฉ ํ์ด์ง์ ์ด๊ธฐ ๋ก๋ฉ, ๊ณต์ /๊ฒ์ ๋ ธ์ถ ๋ฑ) ๋ณ๋ ํ๋ ์์ํฌ/๊ตฌ์ฑ(์: SSR ์๋ฒ ๊ตฌ์ฑ, ๋ผ์ฐํ /๋น๋ ํ์ดํ๋ผ์ธ ์ฌ์ค๊ณ)์ ์ถ๊ฐํด์ผ ํ ์ ์์
-
โ ๋ณ๊ฒฝ ๋น์ฉ ๋ฐ์
โ๏ธ ๋ฐ๋ฉด Next.js๋ SSR/SSG๋ฅผ ํ๋ ์์ํฌ๊ฐ ๊ธฐ๋ณธ ์ ๊ณตํ๋ฏ๋ก, ํ๋ฉด ํน์ฑ์ ๋ฐ๋ผ ๋ ๋๋ง ๋ฐฉ์์ ์ ํํ๊ธฐ ์ฝ๊ณ , ํฅํ ์๊ตฌ์ฌํญ ๋ณํ(๋๋ฉ ์ต์ ํ ๋ฑ)์ ๋์ํ๋ ๋น์ฉ์ด ์๋์ ์ผ๋ก ๋ฎ์
-
-
๊ณตํต ๋ ์ด์์ ๊ด๋ฆฌ ๋ฐฉ์
-
Vite + React์์๋ Header/Footer ๊ฐ์ ๊ณตํต ๋ ์ด์์์ ์ ์ฉํ๋ ค๋ฉด ๋ผ์ฐํฐ ์ค์ฒฉ ๊ตฌ์กฐ๋ ๋ ์ด์์ ์ปดํฌ๋ํธ ์ ์ฉ ๊ท์น์ ํ๋ก์ ํธ์์ ์ง์ ์ค๊ณํด์ผ ํจ.
-
ํ๋ฉด์ด ๋ง์์ง์๋ก ์ด๋ค ํ์ด์ง์ ์ด๋ค ๋ ์ด์์์ด ์ ์ฉ๋๋์ง๊ฐ ๋ณต์กํด์ง
โ๏ธ ๋ฐ๋ฉด Next.js(App Router)๋layout๊ตฌ์กฐ๊ฐ ํ๋ ์์ํฌ ๋ ๋ฒจ์์ ์ ๊ณต๋๊ธฐ ๋๋ฌธ์ ๊ณตํต ๋ ์ด์์์ ํ์ค ๋ฐฉ์์ผ๋ก ์ ์ฉํ ์ ์๊ณ , ํ์ด์ง ์ฆ๊ฐ ์์๋ ๋ ์ด์์ ๊ด๋ฆฌ๊ฐ ์์ ์ ์ผ๋ก ์ ์ง๋จ
-
-
์๋ฌ ํ์ด์ง ๋ฐ ๋ผ์ฐํ ์ ์ฑ ์ ํ์คํ
-
Vite + React๋ 404/500 ์ฒ๋ฆฌ, ์๋ฌ ๋ฐ์ด๋๋ฆฌ ๊ตฌ์ฑ, ๋ผ์ฐํ ์คํจ ์ฒ๋ฆฌ ๋ฑ์ ํ๋ก์ ํธ์์ ์ง์ ์ค๊ณํด์ผ ํ๋ฏ๋ก, ํ๋ฉด๋ณ ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๊ฑฐ๋ ๋๋ฝ๋ ์ํ์ด ์์.
-
ํนํ ์ธ์ฆ ํ๋ฆ(๋ก๊ทธ์ธ ์ /ํ ๋ถ๊ธฐ), ์๋ชป๋ ๊ฒฝ๋ก ์ ๊ทผ, ์๋ฒ ์ค๋ฅ ๋์ ๊ฐ์ ์ ์ฑ ์ฑ ๋ผ์ฐํ ์ด ๋ง์์ง์๋ก ๊ด๋ฆฌ ๋น์ฉ์ด ์ฆ๊ฐํจ
โ๏ธ ๋ฐ๋ฉด Next.js๋not-found.tsx,error.tsx๋ฑ ์๋ฌ ์ฒ๋ฆฌ ๊ตฌ์กฐ๊ฐ ๋ด์ฅ๋์ด ์์ด, ์๋ฌ ๋์์ ๋ผ์ฐํ ์ ์ฑ ์ ์ผ๋ถ๋ก ํ์คํํ๊ธฐ ์ฝ๊ณ ์ด์ ํ์ง์ ์ผ์ ํ๊ฒ ์ ์งํ๊ธฐ ์ ๋ฆฌํจ
-
-
ํ๋ก์ ํธ ํ์ฅ ์ ๋์ ๋น์ฉ(์ค๊ณ ๋ถ๋ด)
-
Vite + React๋ ์์์ด ๊ฐ๋ณ์ง๋ง, ์๋น์ค๊ฐ ์ปค์ง์๋ก ๋ผ์ฐํ /SSR/๋ ์ด์์/์๋ฌ ์ฒ๋ฆฌ ๊ฐ์ ์ฑ์ ๊ณจ๊ฒฉ์ ํ์ด ๊ณ์ ์ฑ ์์ ธ์ผ ํจ.
-
์ด ๋์ ๋น์ฉ์ด ์ปค์ง๋ฉด ๊ฐ๋ฐ ์๋๊ฐ ๋จ์ด์ง๊ณ , ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๋ฉฐ, ์ ์ง๋ณด์ ๋ฆฌ์คํฌ๊ฐ ์ฆ๊ฐํ ๊ฐ๋ฅ์ฑ์ด ์์.
โ๏ธ ๋ฐ๋ฉด Next.js๋ ์ด๋ฌํ ๊ณจ๊ฒฉ์ ํ๋ ์์ํฌ๊ฐ ํ์คํํด ์ ๊ณตํ๋ฏ๋ก, ํ์ Devths์ ํต์ฌ ๊ธฐ๋ฅ(์บ๋ฆฐ๋/๊ฒ์ํ/์ฑํ /์๋ฆผ ๋ฑ) ๊ตฌํ์ ๋ ์ง์คํ ์ ์๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ํ์ฅ์ฑ๊ณผ ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ ๋ฆฌํ ์ ํ์ด ๋จ
-
- Next.js 16
- 2025๋ 10์ 21์ผ ๋ฆด๋ฆฌ์ฆ
- ํน๋ณํ๊ฒ 16 ๋ฒ์ ์ ์ ํํ ์ด์
- 15๋ฒ์ ๊ณผ ๋ค๋ฅธ ์
- Turbopack ๊ฐ๋ฐ๋ฟ ์๋๋ผ ํ๋ก๋์
๋น๋๊น์ง ์์ + ๊ธฐ๋ณธ ๋ฒ๋ค๋ฌ๊ฐ ๋จ
- 15: Turbopack์ dev ์์ ํ ์ค์ฌ
- 16: dev + build๊น์ง ์์ ํ๋์ด ๋น๋/๋ฆฌํ๋ ์ ์ฑ๋ฅ ๊ฐ์ ๊ธฐ๋
- ๋ผ์ฐํ
/ํ๋ฆฌํจ์น(ํ์ด์ง ์ ํ) ์ต์ ํ ๊ฐํ
- Next(App Router)๋ ํ์ด์ง ์ด๋ํ ๋ ๊ณตํต ๋ ์ด์์(ํค๋/์ฌ์ด๋๋ฐ ๋ฑ)์ ์ฌ์ฌ์ฉํ๊ณ , ๋ณ๊ฒฝ๋๋ ํ์ด์ง ์์ญ๋ง ์๋ก ๋ก๋ํด ์ ํ์ ๋ ๋น ๋ฅด๊ฒ ๋๋ผ๊ฒ ํจ
- ๊ทธ๋ฆฌ๊ณ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ(ํ๋ฆฌํจ์น)๋ ํ์ํ ๋ฒ์๋ง ์ ์ง์ ์ผ๋ก ๊ฐ์ ธ์์ ๋ถํ์ํ ๋ค์ด๋ก๋๋ฅผ ์ค์ด๊ณ ๋คํธ์ํฌ ๋ญ๋น๋ฅผ ๊ฐ์์ํด
- 15๋ฒ์ ์์๋ ๊ณตํต ๋ ์ด์์์ด ์ค๋ณต ๋ค์ด๋ก๋๋ ์ ์์์
- Turbopack ๊ฐ๋ฐ๋ฟ ์๋๋ผ ํ๋ก๋์
๋น๋๊น์ง ์์ + ๊ธฐ๋ณธ ๋ฒ๋ค๋ฌ๊ฐ ๋จ
- 15๋ฒ์ ๊ณผ ๋ค๋ฅธ ์
- Devths์์ 16๋ฒ์ ์ด ๋ ๋์ ์ด์
- ๋๋ฉ(SSG) + ๋ก๊ทธ์ธ ํ (CSR) ๊ตฌ์กฐ์์, ํ์ด์ง ์ ํ์ด ์ฆ์ ์ฑ ์์ญ์์ ๊ณตํต ๋ ์ด์์ ์ฌ์ฌ์ฉ + ํ๋ฆฌํจ์น ์ต์ ํ๊ฐ ์ฒด๊ฐ ์ฑ๋ฅ์ ์ฌ๋ ค์ค
- ํค๋/ํธํฐ๊ฐ ๊ณ ์ ๋ ํ๋ฉด์ ์ฌ๋ฌ ํ์ด์ง๊ฐ ๊ณต์ ํ๋ ์๋น์ค์ผ์๋ก ์ค๋ณต ๋ค์ด๋ก๋๋ฅผ ์ค์ด๋ ๊ฐ์ ํจ๊ณผ๊ฐ ํผ
- ํ๋ฉด/์ปดํฌ๋ํธ ์๊ฐ ๋ง์์ง์๋ก ๊ฐ๋ฐ ์ค ์์ ์ด ์ฆ์๋ฐ, Turbopack์ด dev๋ฟ ์๋๋ผ build๊น์ง ์์ ํ๋๋ฉด์ ๋ก์ปฌ ๊ฐ๋ฐ ๋ฐ์ ์๋์ ๋ฐฐํฌ ๋น๋ ์๋ ์ธก๋ฉด์์ ๊ฐ๋ฐ ํจ์จ์ด ์ข์์ง
- ๋๋ฉ(SSG) + ๋ก๊ทธ์ธ ํ (CSR) ๊ตฌ์กฐ์์, ํ์ด์ง ์ ํ์ด ์ฆ์ ์ฑ ์์ญ์์ ๊ณตํต ๋ ์ด์์ ์ฌ์ฌ์ฉ + ํ๋ฆฌํจ์น ์ต์ ํ๊ฐ ์ฒด๊ฐ ์ฑ๋ฅ์ ์ฌ๋ ค์ค
- Devths๋ ๋๋ฉ์ SSG, ๋ก๊ทธ์ธ ์ดํ ์์ญ์ CSR๋ก ์ด์๋๋ ๊ตฌ์กฐ์ด๋ฉฐ, ์บ๋ฆฐ๋/๊ฒ์ํ/์ฑ๋ด/์ฑํ ์ฒ๋ผ ํ์ด์ง ์์ ๊ณตํต ๋ ์ด์์(ํค๋/ํธํฐ)์ด ๋ง์ ์๋น์ค์
- ๋ผ์ฐํ , ๋ ์ด์์, ๋ก๋ฉ/์๋ฌ UI ๊ฐ์ ์ฑ์ ๊ณจ๊ฒฉ์ ํ๋ ์์ํฌ ์ฐจ์์์ ํ์คํํด์ฃผ๋ Next.js(App Router)๊ฐ ๊ตฌ์กฐ๋ฅผ ์์ ์ ์ผ๋ก ์ ์งํ๋ ๋ฐ ์ ํฉํจ
- ๋ํ Next.js 16์ Turbopack์ ๋น๋ ์์ ํ์ ๋ผ์ฐํ /ํ๋ฆฌํจ์น ์ต์ ํ ๊ฐํ๋ก, ๊ฐ๋ฐ, ๋ฐฐํฌ ๊ณผ์ ์ ํจ์จ๊ณผ ํ์ด์ง ์ ํ ์ฒด๊ฐ์ ๊ฐ์ ํ ์ ์์ด Devths์ SSG + CSR ์ ๋ต๊ณผ ์ ๋ง์
- ๊ฐ๋ณ๊ณ ๋จ์ํ ์ ์ญ ์ํ ๊ด๋ฆฌ
- Redux์ฒ๋ผ ๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ๋ง์ง ์๊ณ , ํ์ํ ์ํ๋ง ๋น ๋ฅด๊ฒ ์ ์ญ์ผ๋ก ์ฌ๋ ค ๊ด๋ฆฌํ ์ ์์
- Hooks ๊ธฐ๋ฐ API๋ก ์ฌ์ฉ์ด ์ง๊ด์
-
useStore()ํํ๋ก ์ปดํฌ๋ํธ์์ ๋ฐ๋ก ์ํ๋ฅผ ์ฝ๊ณ /๋ณ๊ฒฝํ ์ ์์ด React ๊ฐ๋ฐ ํ๋ฆ๊ณผ ์๋ง์
-
- ์ ํ ๊ตฌ๋
(Selector)๋ก ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง ๊ฐ์
- ์ปดํฌ๋ํธ๊ฐ ํ์ํ ์ํ๋ง ์ ํ์ ์ ๊ตฌ๋ ํ ์ ์์ด, ์ํ๊ฐ ์์ฃผ ๋ฐ๋๋ ํ๋ฉด(์ฑํ /์๋ฆผ ๋ฑ)์์๋ ์ฑ๋ฅ ๊ด๋ฆฌ๊ฐ ์ฌ์
- ์ํ์ ์ก์
์ ํ ํ์ผ์ ์์ง
- ์ํ(state)์ ์ํ ๋ณ๊ฒฝ ํจ์(action)๋ฅผ ๊ฐ๊น์ด ๋๊ณ ๊ด๋ฆฌํ ์ ์์ด ์ด๋์ ์ํ๊ฐ ๋ฐ๋๋์ง ์ถ์ ์ด ์ฌ์
- ๋ฏธ๋ค์จ์ด ์ง์
-
persist(๋ก์ปฌ ์ ์ฅ),devtools(๋๋ฒ๊น ),subscribeWithSelector๋ฑ ํ์ฅ ๊ธฐ๋ฅ์ ๋ถ์ฌ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๊ตฌ์ฑ ๊ฐ๋ฅ
-
- Devths๋ ์บ๋ฆฐ๋ยท๊ฒ์ํยท์ฑํ
ยท์ฑ๋ด์ฒ๋ผ ๊ธฐ๋ฅ์ด ๋ง๊ณ , ํ์ด์ง๋ฅผ ๋๋๋ค๋ฉฐ ๊ณต์ ํด์ผ ํ๋ ์ํ๊ฐ ๋ง์.
- React์
useState๋ง์ผ๋ก๋ ์ํ ๊ด๋ฆฌ๋ ๊ฐ๋ฅํ์ง๋ง, ์ ์ญ์ผ๋ก ๊ณต์ ๋๋ ์ํ๋ฅผ ํ์ด์ง/์ปดํฌ๋ํธ๋ง๋ค props๋ก ์ ๋ฌํ๋ฉด ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง. - ๋ฐ๋ผ์ Devths์์๋ Zustand๋ก ์ฑ ์ ์ฒด์์ ๊ณต์ ๋๋ ์ํ๋ฅผ ํ ๊ณณ์์ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ ํ์๊ฐ ์์.
- React์
(1) ๋ก๊ทธ์ธ/์ ์ ์ ๋ณด์ฒ๋ผ ์ฑ ์ ์ญ์์ ์ฐธ์กฐ๋๋ ์ํ๊ฐ ์กด์ฌํจ
-
ํค๋(ํ๋กํ ํ์), ๊ฒ์ํ(์์ฑ์ ์ ๋ณด), ์ฑํ (๋ฐ์ ์/๊ถํ), ์ฑ๋ด(๊ฐ์ธํ) ๋ฑ ์ฌ๋ฌ ํ๋ฉด์์ ๋์ผํ ์ ์ ์ ๋ณด๊ฐ ํ์ํจ
โ
me,isLoggedIn๊ฐ์ ๊ฐ์ ์ ์ญ์ผ๋ก ๋๋ฉด ์ค๋ณต ์กฐํ/props ์ ๋ฌ์ ์ค์ด๊ณ UI ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์
(2) ์ ์ญ UI ์ํ(๋ชจ๋ฌ/ํ ์คํธ/๋ก๋ฉ)๋ฅผ ์ผ๊ด๋๊ฒ ์ ์ดํด์ผ ํจ
-
์: ์ฑ์ฉ๊ณต๊ณ ์ ๋ก๋ ํ OCR ์ฒ๋ฆฌ ์ โ๋๊ธฐ ๋ชจ๋ฌโ, ์ฒ๋ฆฌ ์คํจ ์ โ์๋ฌ ํ ์คํธโ, ์๋ฃ ์ โ๊ฒฐ๊ณผ ๊ฒํ ๋ชจ๋ฌโ ๋ฑ
โ ์ ์ญ UI ์ํ๋ฅผ Zustand๋ก ๊ด๋ฆฌํ๋ฉด ์ด๋ ํ์ด์ง์์๋ ๋์ผํ UX ํจํด์ผ๋ก ์ด๊ณ ๋ซ์ ์ ์์
(3) ์ฑํ ์ฒ๋ผ ์ํ ๋ณํ๊ฐ ์ฆ์ ๊ธฐ๋ฅ์์ ์ฑ๋ฅ/๊ตฌ์กฐ ๊ด๋ฆฌ๊ฐ ์ค์ํจ
-
์ฑํ ๋ฉ์์ง/์ฝ์ง ์์ ์/์ฐ๊ฒฐ ์ํ๋ ๋งค์ฐ ์์ฃผ ๋ฐ๋๋ฉฐ, ์๋ชป ๊ด๋ฆฌํ๋ฉด ํ๋ฉด ์ ์ฒด๊ฐ ๋ถํ์ํ๊ฒ ๋ฆฌ๋ ๋๋ง๋ ์ ์์
โ Zustand์ Selector(์ ํ ๊ตฌ๋ ) ๋ฅผ ํ์ฉํ๋ฉด ํ์ํ ์ปดํฌ๋ํธ๋ง ์ํ๋ฅผ ๊ตฌ๋ ํ๊ฒ ๋ง๋ค์ด ์ฑ๋ฅ์ ์์ ์ ์ผ๋ก ์ ์งํ ์ ์์
(4) ๊ธฐ๋ฅ์ด ํ์ฅ๋ ์๋ก โ์ํ ๋ณ๊ฒฝ ์์นโ๋ฅผ ์ถ์ ํ๊ธฐ ์ด๋ ค์์ง
-
์ผ์ ์ถ๊ฐ, ์ข์์ ํ ๊ธ, ์ฑํ ์์ ๋ฑ ์ํ ๋ณ๊ฒฝ์ด ์ฌ๊ธฐ์ ๊ธฐ์ ๋ฐ์ํ๋ฉด ์์ธ ์ถ์ ์ด ์ด๋ ค์
โ Zustand๋ ์ํ์ ์ก์ ์ ํ ์คํ ์ด์ ์์ง์์ผ ๋ณ๊ฒฝ ๊ฒฝ๋ก๋ฅผ ๋จ์ํํ๊ณ ๋๋ฒ๊น ์ ์ฝ๊ฒ ํจ
(5) ๋ฏธ๋ค์จ์ด๋ก Devths ์๊ตฌ์ฌํญ์ ๋น ๋ฅด๊ฒ ์ถฉ์กฑ ๊ฐ๋ฅํจ
-
persist: ๋ก๊ทธ์ธ ์ํ/์ฌ์ฉ์ ์ค์ ์ ๋ก์ปฌ์ ์ ์ฅํด ์๋ก๊ณ ์นจ์๋ ์ ์ง -
devtools: ์ํ ๋ณํ ์ถ์ (๋ฒ๊ทธ ์ฌํ/์์ธ ํ์ ) -
subscribeWithSelector: ํน์ ์ํ ๋ณํ์๋ง ๋ฐ์(์: unreadCount ๋ณํ ๋๋ง ๋ฑ์ง ์ ๋ฐ์ดํธ)โ โ์ถ๊ฐ ๊ตฌํโ ์์ด๋ ํต์ฌ UX๋ฅผ ๋น ๋ฅด๊ฒ ์์ ํํ ์ ์์
(1) Zustand์ ์ฌ๋ฆด ์ํ
-
์ธ์ฆ/์ ์
-
isLoggedIn(๋ก๊ทธ์ธ ์ฌ๋ถ) -
me(๋ด ์ ์ ์ ๋ณด: id, name, avatarUrl ๋ฑ)
-
-
์ ์ญ UI ์ํ (ํ์ด์ง๊ฐ ๋ฌ๋ผ๋ ๋์ผ UX)
- ์ ์ญ ๋ชจ๋ฌ ์ํ
- ํ ์คํธ
- ๊ณตํต ๋ค์ด์ผ๋ก๊ทธ: ํ์ธ/์ทจ์ ๋ชจ๋ฌ ์ํ
- ๋ ์ด์์ ์ํ
โ ํ์ด์ง ์๊ด์์ด ๋จ๋ UI๋ ํ ๊ณณ์์ ์ ์ดํ๋ ๊ฒ ๊น๋ํจ
-
์ฑํ (์ค์๊ฐ UI ์ค์ฌ)
-
activeRoomId(ํ์ฌ ๋ณด๊ณ ์๋ ๋ฐฉ) -
socketStatus(connected / reconnecting / disconnected)
โ ์ค์๊ฐ UI๋ ๋น ๋ฅด๊ฒ ์ํ ๋ฐ์์ด ์ค์ํ๊ณ , ์ฌ๋ฌ ์ปดํฌ๋ํธ(๋ฐฉ ๋ชฉ๋ก/์ฑํ ์ฐฝ)์์ ๋์์ ์
-
-
์ฌ์ฉ์ ์ค์
- ์บ๋ฆฐ๋ ๋ทฐ ์ค์ (์/์ฃผ ๊ธฐ๋ณธ๊ฐ), ํํฐ(ํ๊ทธ/์นดํ ๊ณ ๋ฆฌ) ๊ธฐ๋ณธ๊ฐ
โ ์๋ก๊ณ ์นจ/์ฌ์ ์์๋ ์ ์ง๋๋ฉด UX๊ฐ ์ข์์
persist๋ ๊ถํฉ ์ข์
(2) ๋ก์ปฌ(useState)๋ก ๋๋ ๊ฒ ์ข์ ์ํ (ํ ํ๋ฉด/ํ ์ปดํฌ๋ํธ ์ ์ฉ)
- ํผ ์
๋ ฅ๊ฐ
- ๋ก๊ทธ์ธ/ํ์๊ฐ์ ํผ ๊ฐ
- ๊ธ ์์ฑ ํผ ๊ฐ(์ ๋ชฉ/๋ณธ๋ฌธ/ํ๊ทธ ์ ๋ ฅ ์ค)
- ํ๋กํ ์์ ํผ ๊ฐ
| ํญ๋ชฉ | Zustand | Jotai | Recoil | Redux Toolkit | React Context |
|---|---|---|---|---|---|
| ์ค์ ๋ณต์ก๋ | ๋งค์ฐ ๋ฎ์ | ๋ฎ์ | ๋ณดํต | ๋น๊ต์ ๋์ | ๋ฎ์(๋จ, ๊ตฌ์กฐ ์ค๊ณ๋ ํ์) |
| ๋ณด์ผ๋ฌํ๋ ์ดํธ | ์ ์ | ์ ์ | ๋ณดํต | ๋ง์ | ์์ |
| ์ ์ญ ์ํ ๊ด๋ฆฌ ์ ํฉ์ฑ | ๋์(UI ์ํ์ ํนํ ๊ฐํจ) | ๋์(์ํ๋ฅผ ์๊ฒ ์ชผ๊ฐ๊ธฐ ์ข์) | ๋์(ํ์/์์กด ์ํ์ ๊ฐ์ ) | ๋งค์ฐ ๋์(ํ์คํยท๊ท๋ชจ์ ๊ฐํจ) | ์ค๊ฐ(๊ฐ๋จํ ์ ์ญ ๊ณต์ ์ ์ ํฉ) |
| ๋ฆฌ๋ ๋๋ง ์ ์ด | ์ฐ์(์ ํ ๊ตฌ๋ ) | ์ฐ์(atom ๋จ์) | ์ฐ์(์์กด์ฑ ๊ธฐ๋ฐ) | ์ฐ์(์ ๋ ํฐ/๋ฉ๋ชจํ ๋ฑ ์กฐํฉ) | ๊น๋ค๋ก์(Provider ๊ฐ ๋ณ๊ฒฝ ์ ์ํฅ ํผ) |
| Devths ์ ํฉ๋ | UI ์ ์ญ ์ํ์ ์ต์ | UI ์ํ/๊ฐ๋จ ์ ์ญ๋ ๊ฐ๋ฅ, atom ๊ด๋ฆฌ ๊ท์น ํ์ | ์ํ ๊ด๊ณ๊ฐ ๋ณต์กํ ๋ ์ ๋ฆฌ, ๊ตฌ์กฐ๊ฐ ์ปค์ง๋ฉด ์ค๊ณ ๋ถ๋ด | ๊ท๋ชจ ๋๋น ๋ค์ ๋ฌด๊ฑฐ์ธ ์ ์์(๊ท์นยท์ฝ๋๋ ์ฆ๊ฐ) | ์ํ ๋ง์์ง๋ฉด ๋ฆฌ๋ ๋๋ง/๊ตฌ์กฐ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ |
-
UI ์ ์ญ ์ํ์ ํ์คํ(Prop Drilling ๋ฐฉ์ง)
-
Redux Toolkit์ ์ ์ญ ์ํ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ง๋ง, ์ก์ /์ฌ๋ผ์ด์ค/๋์คํจ์น ๋ฑ ์ ์ญ ์ํ ์ด์์ ์ํ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ์ก์์ผ ํด์ UI ์ํ(ํ ์คํธ, ๋ชจ๋ฌ, ํญ) ์ค์ฌ์ ์๊ตฌ์์๋ ์ด๊ธฐ ์ฝ๋๋๊ณผ ์ด์ ๊ท์น์ด ๋น ๋ฅด๊ฒ ๋์ด๋ ์ ์์.
-
ํ๋ฉด์ด ๋ง์์ง์๋ก ์ํ ์ถ๊ฐ ์์ฒด์ ๋ถ๋ด์ด ์ปค์ง๊ณ , ๋จ์ UI ์ํ์๋ ํจํด์ ๊ณผํ๊ฒ ์ ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ ๋ฐ๋ฉด Zustand๋ ์คํ ์ด ํ๋์ ์ํ์ ์ ๋ฐ์ดํธ ํจ์๋ฅผ ํจ๊ป ๋๋ ๋ฐฉ์์ผ๋ก UI ์ ์ญ ์ํ๋ฅผ ๋น ๋ฅด๊ฒ ํ์คํํ ์ ์์ด, Devths์ฒ๋ผ ํ ์คํธ/์ ์ญ ๋ชจ๋ฌ/ํญ ํ์ฑ/ํํฐ ์ด๋ฆผ ๋ฑ โ๊ณต์ UI ์ํโ๊ฐ ๋ง์ ์๋น์ค์์ ๊ตฌํ ๋ฐฉ์์ด ํ๋ค๋ฆฌ์ง ์๋๋ก ๋ง๋ค๊ธฐ ์ ๋ฆฌํจ.
-
-
๋ฆฌ๋ ๋๋ง/์ฑ๋ฅ ๊ด๋ฆฌ์ ์ค์ฉ์ฑ
-
React Context๋ ๋์ ์ด ๊ฐ๋จํ์ง๋ง, Provider์ value๊ฐ ๋ฐ๋๋ฉด ํ์ ์ปดํฌ๋ํธ๊ฐ ๋๊ฒ ์ํฅ์ ๋ฐ๊ธฐ ์ฌ์(๊ตฌ์กฐ์ ๋ฐ๋ผ) ์ํ๊ฐ ๋ง์์ง์๋ก ๋ฆฌ๋ ๋๋ง ๋ฒ์๋ฅผ ์์ธกยทํต์ ํ๊ธฐ๊ฐ ์ด๋ ค์์ง ์ ์์.
-
ํนํ ์ ์ญ UI ์ํ๊ฐ ์์ฃผ ๋ฐ๋๋ ๊ฒฝ์ฐ(ํ ์คํธ ํ, ๋ชจ๋ฌ ์ด๋ฆผ/๋ซํ, ํญ ์ ํ) ์ฑ๋ฅ ์ด์๋ก ์ด์ด์ง ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ ๋ฐ๋ฉด Zustand๋ โํ์ํ ์ํ๋ง ์ ํํด์ ๊ตฌ๋ โํ๋ ๋ฐฉ์์ด ๊ธฐ๋ณธ์ด๋ผ, ์ค์ ๋ก ์ฌ์ฉ ์ค์ธ ๊ฐ์ด ๋ฐ๋ ๋๋ง ๋ฆฌ๋ ๋๋ง๋๋๋ก ๊ตฌ์ฑํ๊ธฐ ์ฝ๊ณ , UI ์ํธ์์ฉ์ด ๋ง์ Devths์์ ์ฒด๊ฐ ์ฑ๋ฅ๊ณผ ๊ตฌํ ๋์ด๋ ์ฌ์ด์ ๊ท ํ์ด ์ข์
-
-
ํ ๊ฐ๋ฐ/์ ์ง๋ณด์ ๊ด์ ์ ๋์ ๋น์ฉ
-
Recoil/Jotai๋ atom ๋จ์๋ก ์ํ๋ฅผ ์ชผ๊ฐ๊ธฐ ์ฌ์ ์ ์ฐํ์ง๋ง, ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก atom ์ค๊ณ/๋ช ๋ช /์์กด ๊ด๊ณ(ํ์ ์ํ ํฌํจ)์ ๋ํ ํ ๊ท์น์ด ํ์ํด์ง๊ณ , ๊ด๋ฆฌ ๊ธฐ์ค์ด ์ฝํ๋ฉด ์ํ๊ฐ ๋ถ์ฐ๋์ด ์ด๋์ ๋ญ๊ฐ ์๋์ง ์ถ์ ๋น์ฉ์ด ์ปค์ง ์ ์์
โ๏ธ ๋ฐ๋ฉด Zustand๋ โUI ์ ์ญ ์ํ๋ ์ด ์คํ ์ด(๋๋ ๋ช ๊ฐ ์คํ ์ด)์์ ๊ด๋ฆฌํ๋คโ์ฒ๋ผ ์ฑ ์ ๋ฒ์๋ฅผ ๋ช ํํ ์ก๊ธฐ ์ฌ์, ํ๋ฉด ์๊ฐ ๋์ด๋ ์ํ ์์น์ ๋ณ๊ฒฝ ์ง์ ์ ์ฐพ๋ ๋น์ฉ์ด ์๋์ ์ผ๋ก ๋ฎ๊ณ , Devths์ UI ์ ์ญ ์ํ ์ด์์ ๋ ์ ํฉํ๋ค๊ณ ํ๋จํจ
-
- v5.0.9
- 2025๋ 11์ 30์ผ์ ๋ฆด๋ฆฌ์ฆ
- ์ด์
- React 18+๋ฅผ ์ต์๋ก ๋ง์ถฐ ํ๋ React/Next ํ๊ฒฝ์ ๋ง๋ ์ด์์ ์ ์ ๋ก ํจ
- ๊ฐ์ฅ ์ต์ ํจ์น(5.0.9) ๋ฅผ ๊ณ ์ ํด์, ๋์ผ ๋ฉ์ด์ ๋ด ๋ฒ๊ทธ ์์ /๊ฐ์ ๋ถ์ ์ต๋ํ ๋ฐ์
- ๋งค์ฐ ์์ ๋ฒ๋ค ํฌ๊ธฐ(๊ฒฝ๋)๋ก ์ ์ญ ์ํ๋ฅผ ๋ถ์ผ ์ ์์
- persist/shallow ๋ฑ ์์ฃผ ์ฐ๋ ์ ํธ/๋ฏธ๋ค์จ์ด ์ชฝ ๋ฒ๊ทธ/๊ฐ์ ์ด ํจ์น๋ก ๋์ ๋จ
Devths๋ ์บ๋ฆฐ๋ยท๊ฒ์ํยท์ฑํ
ยท์ฑ๋ด์ฒ๋ผ ๊ธฐ๋ฅ์ด ๋ง๊ณ , ํ๋ฉด์ ๋๋๋ค๋ฉฐ ๊ณต์ ํด์ผ ํ๋ ์ํ(์ธ์ฆ/์ ์ , ์ ์ญ UI, ์ฑํ
์ฐ๊ฒฐ ์ํ ๋ฑ)๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ค. ์ด ์ํ๋ค์ useState + props ์ ๋ฌ๋ก๋ง ๊ด๋ฆฌํ๋ฉด prop drilling์ด ๋๊ณ , ์ํ ๋ณ๊ฒฝ ์ง์ ์ ์ถ์ ํ๊ธฐ ์ด๋ ค์์ง๋ฉฐ, ํ๋ฉด์ด ๋ง์์ง์๋ก ์ ์ง๋ณด์ ๋น์ฉ์ด ๊ธ๊ฒฉํ ์ฆ๊ฐํ๋ค.
๋ฐ๋ผ์ Devths์์๋ Zustand๋ฅผ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋๊ตฌ๋ก ์ฑํํ์ฌ
- ์ธ์ฆ/์ ์ ์ ๋ณด๋ฅผ ์ฑ ์ ๋ฐ์์ ์ผ๊ด๋๊ฒ ์ฐธ์กฐํ๊ณ ,
- ๋ชจ๋ฌ/ํ ์คํธ/๋ก๋ฉ ๊ฐ์ ์ ์ญ UI ์ํ๋ฅผ ํ์คํํ๋ฉฐ,
- ์ฑํ ์ฒ๋ผ ์ํ ๋ณํ๊ฐ ์ฆ์ ๊ธฐ๋ฅ์์ Selector ๊ธฐ๋ฐ ๊ตฌ๋ ์ผ๋ก ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ค์ฌ ์ฑ๋ฅ์ ์์ ํํจ
๋ํ persist, devtools, subscribeWithSelector ๊ฐ์ ๋ฏธ๋ค์จ์ด๋ฅผ ํ์ฉํด ์๋ก๊ณ ์นจ ์ํ ์ ์ง, ๋๋ฒ๊น
, ํน์ ์ํ ๋ณํ ํธ๋ฆฌ๊ฑฐ๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌ์ฑํ ์ ์์ด, Devths์ ์๊ตฌ์ฌํญ์ ํจ์จ์ ์ผ๋ก ์ถฉ์กฑํ ์ ์์
โ ๊ฒฐ๋ก ์ ์ผ๋ก Zustand๋ Devths์์ ๊ณต์ ์ํ๋ฅผ ๋จ์ํ๊ณ ์ผ๊ด๋๊ฒ ๊ด๋ฆฌํ๋ฉด์๋, ์ฑ๋ฅ๊ณผ ์ ์ง๋ณด์์ฑ์ ํจ๊ป ํ๋ณดํ ์ ์๋ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ ํฉํจ
-
์๋ฒ ์ํ(Server State) ์ ์ฉ ๊ด๋ฆฌ
- ์๋ฒ์์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ(๋ชฉ๋ก/์์ธ/๊ฒ์ ๊ฒฐ๊ณผ)๋ฅผ ์ ์ญ ์ํ๋ก ์ง์ ๋ค๊ณ ์์ง ์์๋, Query๊ฐ ์บ์ + ๋๊ธฐํ๋ฅผ ๋ด๋นํด์ค
-
์บ์ฑ(Caching) + ์๋ ์ฌ์กฐํ(Refetch)
- ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๊ณณ์์ ์จ๋ ์ค๋ณต ํธ์ถ์ ์ค์ด๊ณ , ์ธ์ ๋ค์ ๊ฐ์ ธ์ฌ์ง ์ ๋ต์ ์ธ์ธ ์ ์์(์: staleTime)
-
Mutation(๋ณ๊ฒฝ) ์ดํ ์บ์ ๋ฌดํจํ(invalidate) ํจํด ์ ๊ณต
- ๊ธ ์์ฑ/์์ /์ญ์ , ์ผ์ ์ถ๊ฐ/์์ ๊ฐ์ ๋ณ๊ฒฝ ์ดํ์ ๊ด๋ จ ๋ชฉ๋ก์ ๋๋ํ๊ฒ stale ์ฒ๋ฆฌํ๊ณ ์ฌ์กฐํ ๊ฐ๋ฅ
-
๋ฌดํ ์คํฌ๋กค(useInfiniteQuery) ์ง์
- ๊ฒ์ํ/๋๊ธ/์ฑํ
ํ์คํ ๋ฆฌ์ฒ๋ผ ํ์ด์ง๊ฐ ๊ธธ์ด์ง๋ UI์ ํ์ค ํจํด ์ ๊ณต (v5์์๋
maxPages๋ก ์ ์ฅ ํ์ด์ง ์ ์ ํ ๊ฐ๋ฅ)
- ๊ฒ์ํ/๋๊ธ/์ฑํ
ํ์คํ ๋ฆฌ์ฒ๋ผ ํ์ด์ง๊ฐ ๊ธธ์ด์ง๋ UI์ ํ์ค ํจํด ์ ๊ณต (v5์์๋
-
๋ก๋ฉ/์๋ฌ/์ฌ์๋ ๋ฑ ๋น๋๊ธฐ ์ํ ์ฒ๋ฆฌ ํ์คํ
-
isPending,isError๊ฐ์ ์ํ๋ก UI๋ฅผ ์ผ๊ด๋๊ฒ ๊ตฌ์ฑ ๊ฐ๋ฅ
-
-
v5์ API ๋จ์ํ(๊ฐ์ฒด ์๊ทธ๋์ฒ ์ค์ฌ)
- v5๋ API๋ฅผ ๋ ๋จ์/์ง๊ด์ ์ผ๋ก ์ ๋ฆฌํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ๋จ
- Devths๋ ์๋ฒ์์ ๊ฐ์ ธ์ค๋ ๋ฐ์ดํฐ๊ฐ ๋ง๊ณ , ๋ชฉ๋ก/์์ธ/๋ฌดํ์คํฌ๋กค/๊ฒ์/์์ ํ ๊ฐฑ์ ๊ฐ์ ํจํด์ด ๋ฐ๋ณต๋จ.
- ์ด๋ฅผ
useEffect + fetch๋ก ํ๋ฉด๋ง๋ค ์ง์ ๊ตฌํํ๋ฉด ์บ์ฑ/๋๊ธฐํ/๋ก๋ฉยท์๋ฌ ์ฒ๋ฆฌ ๋ก์ง์ด ๋ถ์ฐ๋์ด ์ ์ง๋ณด์ ๋น์ฉ์ด ๋น ๋ฅด๊ฒ ์ฆ๊ฐํจ - TanStack Query๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ ์ํ๋ฅผ ํ์ค ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํด ์ฝ๋ ์ค๋ณต๊ณผ ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์์
- ์ด๋ฅผ
(1) ๊ฒ์ํ: ๊ธ ๋ชฉ๋ก(๋ฌดํ์คํฌ๋กค), ์์ธ, ๋๊ธ, ์ข์์ ํ ๊ธ ํ ๋ชฉ๋ก/์์ธ ๋๊ธฐํ
(2) ์บ๋ฆฐ๋: ์/์ฃผ ๋จ์ ์ผ์ ์กฐํ + CRUD ์ดํ ์ฆ์ ๊ฐฑ์
(3) ์บ๋ฆฐ๋ AI(OCR): ์ ๋ก๋ โ ์ฒ๋ฆฌ ์ํ(job) ํ์ธ โ ๊ฒฐ๊ณผ ์ด์(draft) ์กฐํ/ํ์ (๋น๋๊ธฐ ํ๋ฆ)
(4) ์ฑํ : ์ค์๊ฐ ์์ ์ Socket.IO๋ก ์ฒ๋ฆฌํ๋, ๊ณผ๊ฑฐ ๋ฉ์์ง ํ์คํ ๋ฆฌ ๋ก๋ฉ์ ์๋ฒ ์ํ๋ก ๊ด๋ฆฌ๊ฐ ํธํจ
(1) ์บ๋ฆฐ๋ (์ผ์ ๋ชฉ๋ก/CRUD)
-
useQuery: โํ์ฌ ์/์ฃผโ ๊ธฐ์ค ์ผ์ ์กฐํ (queryKey์year-month๋๋rangeํฌํจ) -
useMutation: ์ผ์ ์ถ๊ฐ/์์ /์ญ์ - ์ฑ๊ณต ์
queryClient.invalidateQueries({ queryKey: ['calendarEvents', range] })๋ก ๋ชฉ๋ก ๊ฐฑ์
(2) ๊ฒ์ํ (๋ชฉ๋ก/๋ฌดํ์คํฌ๋กค)
-
useInfiniteQuery: ๊ธ ๋ชฉ๋ก ๋ฌดํ์คํฌ๋กค - v5์
maxPages๋ก โ์บ์์ ์ ์ฅํ ํ์ด์ง ์โ๋ฅผ ์ ํํด ์ฑ๋ฅ์ ์์ ํ - ๊ธ ์์ฑ/์ญ์ ํ ๋ชฉ๋ก invalidate๋ก ์ต์ ํ
(3) OCR ๊ธฐ๋ฐ ์๋ ์ผ์ ์ฝ์
-
useMutation: ํ์ผ ์ ๋ก๋ ์์ฒญ -
useQuery: job ์ํ ์กฐํ(ํ์ ์ polling) โ ์๋ฃ๋๋ฉด draft ์กฐํ - ํ์ ์ ์ฅ ์ฑ๊ณต ์ ์บ๋ฆฐ๋ ๋ชฉ๋ก invalidate
(4) ์ฑํ (ํ์คํ ๋ฆฌ ๋ก๋ฉ + ์ค์๊ฐ ๊ฒฐํฉ)
- ํ์คํ ๋ฆฌ(๊ณผ๊ฑฐ ๋ฉ์์ง)๋
useInfiniteQuery๋ก ํ์ด์ง ๋จ์ ๋ก๋ฉ - ์ค์๊ฐ ์ ๋ฉ์์ง๋ Socket.IO๋ก ๋ฐ๊ณ , ํ์ํ๋ฉด Query ์บ์์ ํฉ์ณ์(append) ํ๋ฉด์ ๋ฐ์
- โ์ค์๊ฐ ์์ โ๊ณผ โ์๋ฒ ํ์คํ ๋ฆฌโ ์ญํ ๋ถ๋ฆฌ๊ฐ ๋ช ํํด์ง
| ํญ๋ชฉ | TanStack Query | SWR | RTK Query |
|---|---|---|---|
| ํต์ฌ ๊ฐ๋ | ์๋ฒ ๋ฐ์ดํฐ ์บ์ฑ/๋๊ธฐํ์ ํนํ๋ ํ์ค ๋๊ตฌ | ๊ฐ๋จํ fetch + ์บ์(๊ฒฝ๋) | Redux ๊ธฐ๋ฐ์ผ๋ก API๋ฅผ ์คํ ์ด ์ค์ฌ์ผ๋ก ํตํฉ |
| ๋ฌดํ ์คํฌ๋กค/ํ์ด์ง๋ค์ด์ | ๊ธฐ๋ณธ ํจํด์ด ํํํ์ฌ ๊ตฌํ ๋ถ๋ด์ด ๋ฎ์ | ๊ตฌํ ๊ฐ๋ฅํ๋ ํ๋ก์ ํธ ์ค๊ณ ์์กด๋๊ฐ ๋์์ง ์ ์์ | ๊ฐ๋ฅํ๋ Redux ๊ตฌ์กฐ๋ฅผ ํจ๊ป ๊ณ ๋ คํด์ผ ํจ |
| ๋ณ๊ฒฝ ํ ๊ฐฑ์ | invalidate ์ค์ฌ์ผ๋ก ๊ฐฑ์ ํ๋ฆ์ ์ ์๋๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ | ๊ฐฑ์ ๊ฐ๋ฅํ๋ ์ปจ๋ฒค์ ์์กด์ด ์ปค์ง ์ ์์ | ํตํฉ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ ์ค์ /๊ตฌ์ฑ์ด ์๋์ ์ผ๋ก ํผ |
| ๋์ ๋ฌด๊ฒ | ์๋ฒ ์ํ์ ์ง์คํ์ฌ React ํ๋ก์ ํธ์ ์์ฐ์ค๋ฝ๊ฒ ๋์ ๊ฐ๋ฅ | ๊ฐ์ฅ ๊ฐ๋ณ๊ณ ๋จ์ | Redux ํฌํจ ์ ์ ๋ก ๊ท๋ชจ๊ฐ ์ปค์ง ์ ์์ |
| Devths ์ ํฉ๋ | ๋ชฉ๋ก/ํํฐ/๋ฌดํ ์คํฌ๋กค/๋๊ด์ UI๊ฐ ๋ง์ ๊ตฌ์กฐ์ ํนํ ์ ํฉ | ๋จ์ ์กฐํ ์์ฃผ์ ์์ ๊ท๋ชจ์ ์ ํฉ | ํ์ด Redux ํ์ค์ ์ด๋ฏธ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ณด |
-
์๋ฒ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ํ์คํ(์บ์ฑ/๋๊ธฐํ ์ค์ฌ)
-
SWR์ โ๊ฐ๋จํ fetch + ์บ์โ์ ๊ฐ์ ์ด ์์ง๋ง, ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก(์ฟผ๋ฆฌ ํค ์ค๊ณ, refetch ์กฐ๊ฑด, ๊ฐฑ์ ๊ท์น ๋ฑ) ํ ์ปจ๋ฒค์ ์ ์์กดํ๋ ๋ถ๋ถ์ด ๋์ด๋ ์ ์์.
-
์ด ๊ฒฝ์ฐ ํ๋ฉด๋ณ๋ก ๋ฐ์ดํฐ ๊ฐฑ์ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๊ฑฐ๋ ๋๋ฝ๋ ์ํ์ด ์ปค์ง
โ๏ธ ๋ฐ๋ฉด TanStack Query๋ ์๋ฒ ๋ฐ์ดํฐ ์บ์ฑ/๋๊ธฐํ๋ฅผ ๋ชฉ์ ์ผ๋ก ์ค๊ณ๋ ๋๊ตฌ๋ผqueryKey๊ธฐ๋ฐ ์บ์, ์๋ refetch ์ต์ , staleTime/cacheTime ๊ฐ์ ์ ์ฑ ์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ ์ฉํ๊ธฐ ์ฌ์ โ์๋ฒ ์ํ ๊ด๋ฆฌ ๋ฐฉ์โ์ ํ๋ก์ ํธ ํ์ค์ผ๋ก ๊ณ ์ ํ๊ธฐ ์ ๋ฆฌํจ
-
-
๋ฌดํ ์คํฌ๋กค/ํ์ด์ง๋ค์ด์ ๊ตฌํ ๋ถ๋ด ๊ฐ์
-
SWR๋ ๋ฌดํ ์คํฌ๋กค์ด ๊ฐ๋ฅํ์ง๋ง, ํ์ด์ง ํ๋ผ๋ฏธํฐ ๊ด๋ฆฌยท์ค๋ณต ์์ฒญ ๋ฐฉ์งยท๋ค์ ํ์ด์ง ๋ณํฉ ๋ฑ ์ค๊ณ๋ฅผ ํ๋ก์ ํธ์์ ๋ ์ง์ ์ฑ ์์ ธ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์
-
๋ฐ์ดํฐ ํจํด์ด ๋ค์ํด์ง์๋ก(๊ฒ์๊ธ/์๋ฆผ/์ฑํ ๋ฐฉ/๊ฒ์ ๊ฒฐ๊ณผ) ๊ตฌํ ๋ฐฉ์์ด ํ๋ฉด๋ง๋ค ๋ฌ๋ผ์ง ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ ๋ฐ๋ฉด TanStack Query๋useInfiniteQuery๊ฐ์ ํจํด์ด ์ ๊ตํ๊ฒ ์ ๊ณต๋์ด, ๋ชฉ๋ก๊ณผ ๋ค์ ํ์ด์ง ๋ก๋ฉ ์๊ตฌ๊ฐ ๋ง์ ์๋น์ค์์ ๊ตฌํ์ ํ์คํํ๊ธฐ ์ฝ๊ณ ๊ฐ๋ฐ ๋น์ฉ์ ๋ฎ์ถ ์ ์์
-
-
๋ณ๊ฒฝ ์์ ์ดํ ๊ฐฑ์ ํ๋ฆ์ ์ ์๋๋ก ๊ด๋ฆฌ
-
SWR์ ๊ฐฑ์ ์ด ๊ฐ๋ฅํ์ง๋ง, ์ด๋ค ๋ณ๊ฒฝ ํ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ต์ ํํ ์ง๋ฅผ ํ๋ฉด/ํ ๊ท์น์ผ๋ก ๋ง์ถฐ์ผ ํ๋ ๋น์ค์ด ์ปค์ง ์ ์์
-
์ข์์/๋๊ธ/์ผ์ CRUD์ฒ๋ผ ๋ณ๊ฒฝ ์ง์ ์ด ๋ง์์ง๋ฉด ๋๋ฝ์ด ๋ฐ์ํ๊ธฐ ์ฌ์
โ๏ธ ๋ฐ๋ฉด TanStack Query๋useMutation+invalidateQueries(๋๋ cache update) ํ๋ฆ์ด ํ์ค์ด๋ผ, ๋ณ๊ฒฝ ์ดํ ๊ด๋ จ ๋ชฉ๋ก/์์ธ๋ฅผ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๊ฐฑ์ ํด ๋ฐ์ดํฐ ์ ํฉ์ฑ์ ์ ์งํ๊ธฐ ์ ๋ฆฌํจ
-
-
๋์ ๋ฌด๊ฒ์ ์ญํ ๋ถ๋ฆฌ(์๋ฒ ์ํ์๋ง ์ง์ค)
-
RTK Query๋ Redux ๊ธฐ๋ฐ์ผ๋ก ์คํ ์ด ์ค์ฌ์ ํตํฉ ๊ด๋ฆฌ๊ฐ ์ฅ์ ์ด์ง๋ง, ๊ทธ ์ ์ ๋ก Redux ๊ตฌ์กฐ(์ฌ๋ผ์ด์ค/์คํ ์ด ๊ตฌ์ฑ)๋ฅผ ํจ๊ป ๊ฐ์ ธ๊ฐ์ผ ํ๋ฏ๋ก ํ๋ก์ ํธ ๊ท๋ชจ ๋๋น ๋์ ๋ฌด๊ฒ๊ฐ ์ปค์ง ์ ์์
-
ํนํ ์๋ฒ ์ํ์ UI ์ ์ญ ์ํ๋ฅผ ๋ถ๋ฆฌํด์ ๊ฐ์ ธ๊ฐ๋ ค๋ ๊ตฌ์กฐ์์๋ ๋ถํ์ํ๊ฒ ์ปค์ง ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ ๋ฐ๋ฉด TanStack Query๋ ์๋ฒ ์ํ์๋ง ์ง์คํด์ React์ ์์ฐ์ค๋ฝ๊ฒ ๋ถ์ผ ์ ์์ด, UI ์ ์ญ ์ํ(Zustand)์ ์ญํ ์ ๋ถ๋ฆฌํ๊ธฐ ์ฝ๊ณ ์ ์ฒด ์ํคํ ์ฒ๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ๋ ๋ฐ ์ ๋ฆฌํจ
-
- v 5.90.16
- 2025๋ 12 30์ผ ๋ฆด๋ฆฌ์ฆ
- ์ด์
- v5๋ API๋ฅผ ๋จ์ํ/์ ๋ฆฌํ๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ๋์ด, ์ ๊ท ํ๋ก์ ํธ์์ ํ์ค ํจํด์ ์ก๊ธฐ ์ข์
- invalidate / infinite query ๋ฑ Devths์ ํ์ํ ํต์ฌ ๊ธฐ๋ฅ์ ๊ณต์ ํจํด์ผ๋ก ์ ๊ณต
- invalidate
- ๊ฒ์ํ
- ๊ธ ์์ฑ/์ญ์ /์์ ์ฑ๊ณต โ
posts๋ชฉ๋ก invalidate - ๋๊ธ ์์ฑ/์ญ์ ์ฑ๊ณต โ
commentsinvalidate
- ๊ธ ์์ฑ/์ญ์ /์์ ์ฑ๊ณต โ
- ์บ๋ฆฐ๋
- ์ผ์ CRUD ์ฑ๊ณต โ
calendarEvents(ํด๋น ์/์ฃผ) invalidate
- ์ผ์ CRUD ์ฑ๊ณต โ
- OCR ์ผ์ ์์ฑ
- โํ์ ์ ์ฅโ ์ฑ๊ณต โ
calendarEventsinvalidate
- โํ์ ์ ์ฅโ ์ฑ๊ณต โ
- ๊ฒ์ํ
- invalidate
- ****๋์ผ ๋ฉ์ด์ ๋ผ์ธ์์ ์์ ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
- devths๋ ์๋ฒ ๋ฐ์ดํฐ(๋ชฉ๋ก/๊ฒ์/ํํฐ/๋ฌดํ ์คํฌ๋กค)์ ๋น์ค์ด ํฌ๊ณ , ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ดํ ๊ด๋ จ ํ๋ฉด์ ์ต์ ์ํ๋ก ๋๊ธฐํํด์ผ ํ๋ ์๊ตฌ๊ฐ ๋ง์
- ์ด์ ๋ฐ๋ผ ์๋ฒ ์ํ๋ฅผ ํ์คํํ์ฌ ๊ด๋ฆฌํ ์ ์๋ TanStack Query๋ฅผ ๋์ ํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ฑ๊ณผ ์ฑ๋ฅ ์ธก๋ฉด์์ ๊ฐ์ฅ ์ ํฉํ๋ค๊ณ ํ๋จํจ
| ๊ตฌ๋ถ | Build-time ์คํ์ผ๋ง | Runtime ์คํ์ผ๋ง |
|---|---|---|
| CSS ์์ฑ ์์ | ๋น๋ ์์ ์ CSS๋ฅผ ๋ฏธ๋ฆฌ ์์ฑ | ์คํ(๋ธ๋ผ์ฐ์ ๋ฐํ์) ์ค์ JS๋ก ์คํ์ผ ์์ฑ/์ฃผ์ |
| ๋ํ ์์ | Tailwind CSS, CSS Modules, SCSS | styled-components, emotion(๊ธฐ๋ณธ), ๊ธฐํ CSS-in-JS |
| ๋์ ๋ฐฉ์ | ์ฌ์ฉํ ํด๋์ค/์คํ์ผ์ ๋ถ์ํด ํ์ํ CSS๋ง ๋ฒ๋ค์ ํฌํจ | ์ปดํฌ๋ํธ ๋ ๋๋ง ์ ์คํ์ผ ๋ฌธ์์ด์ ๋ง๋ค๊ณ <style>์ inject
|
| ์ฑ๋ฅ ํน์ฑ | ๋ฐํ์ ์์ ์ด ์ ์ด ์์ธก ๊ฐ๋ฅํ๊ณ ๋น ๋ฅธ ํธ | ๋ฐํ์์ ์คํ์ผ ๊ณ์ฐ/์ฃผ์ ๋น์ฉ์ด ์๊ธธ ์ ์์ |
| ๋ฒ๋ค/CSS ํฌ๊ธฐ | โ์ด ๊ฒ๋ง ๋จ๊ธฐ๊ธฐโ ์ต์ ํ๊ฐ ์ฌ์ CSS๊ฐ ์์์ง๊ธฐ ์ฌ์ | JS ๋ฒ๋ค์ ์คํ์ผ ๋ก์ง์ด ํฌํจ๋ ์ ์์ด ๋ฒ๋ค ๋ณต์ก๋ ์ฆ๊ฐ ๊ฐ๋ฅ |
| ๋์ ์คํ์ผ ํํ | ์กฐ๊ฑด๋ถ ํด๋์ค ์กฐํฉ์ผ๋ก ๊ฐ๋ฅํ์ง๋ง, โ์์ ๋์ โ์ ์๋์ ์ผ๋ก ๋ถํธํ ์ ์์ | props/์ํ ๊ธฐ๋ฐ์ผ๋ก ๋์ ์คํ์ผ ํํ์ด ๋งค์ฐ ์ฌ์ |
| ์ ์ง๋ณด์/์ผ๊ด์ฑ | ๊ท์น(ํ ํฐ/์ ํธ) ๊ธฐ๋ฐ์ด๋ผ UI ์ผ๊ด์ฑ ์ ์ง์ ์ ๋ฆฌ | ํ ๊ท์น์ด ์์ผ๋ฉด ์คํ์ผ์ด ํผ์ง ์ ์์ด ์ปจ๋ฒค์ ๊ด๋ฆฌ๊ฐ ์ค์ |
| Devths ์ ํฉ๋ | ํ๋ฉด/์ปดํฌ๋ํธ ๋ง๊ณ ๋ฐ๋ณต UI๊ฐ ๋ง์ ๋ ์ ๋ฆฌ(๋ฆฌ์คํธ/์ฑํ /๋ชจ๋ฌ ๋ฑ) | ๊ฐํ ํ ๋ง/๋์ ์คํ์ผ์ด ํต์ฌ์ผ ๋ ์ ๋ฆฌ(๊ท์น ์์ผ๋ฉด ๋ณต์ก๋โ) |
-
์ ํธ๋ฆฌํฐ ํด๋์ค(Utility-first) ๊ธฐ๋ฐ
-
p-4,text-sm,flex,gap-2๊ฐ์ ํด๋์ค๋ฅผ ์กฐํฉํด UI๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ด๋ผ, CSS ํ์ผ์ ๋ฐ๋ก ํฌ๊ฒ ๋ง๋ค์ง ์๊ณ ๋ ๋น ๋ฅด๊ฒ ํ๋ฉด์ ๊ตฌํํ ์ ์์
-
-
์ผ๊ด๋ ๋์์ธ ์์คํ
์ ์ง
- spacing/์์/ํฐํธ ํฌ๊ธฐ ๋ฑ์ด ๊ท์นํ๋ ํ ํฐ ๊ธฐ๋ฐ์ผ๋ก ๊ด๋ฆฌ๋์ด, ํ์ด์ง๊ฐ ๋ง์์ ธ๋ UI ์คํ์ผ์ด ๋ค์ญ๋ ์ญํด์ง์ง ์์
-
๋ฐ์ํ/์ํ ์คํ์ผ๋ง์ด ์ง๊ด์
-
sm:,md:๊ฐ์ ๋ฐ์ํ ํ๋ฆฌํฝ์ค์hover:,focus:๊ฐ์ ์ํ ํด๋์ค ์กฐํฉ์ผ๋ก ๋ค์ํ UI ์ํ๋ฅผ ํ ์ค์์ ๊ด๋ฆฌ ๊ฐ๋ฅ
-
-
์์ฐ์ฑ ํฅ์
- ์ปดํฌ๋ํธ ๊ฐ๋ฐ ์ โCSS ์์ฑ โ ํด๋์ค ์ ์ฉโ ์๋ณต์ด ์ค์ด๋ค์ด ๊ฐ๋ฐ ์๋๊ฐ ๋น ๋ฅด๊ณ , ๋์์ธ ๋ณ๊ฒฝ๋ ํด๋์ค ์์ ๋ง์ผ๋ก ๋์ ๊ฐ๋ฅ
-
๋ฒ๋ค ์ต์ ํ(์ฌ์ฉํ ํด๋์ค๋ง ๋น๋)
- ์ฌ์ฉํ์ง ์๋ CSS๋ ๋น๋ ๋จ๊ณ์์ ์ ๊ฑฐ๋์ด(์ต์ ํ) ์คํ์ผ ์ํธ ์ฉ๋์ ์ค์ผ ์ ์์
- Devths๋ ์บ๋ฆฐ๋/๊ฒ์ํ/์ฑํ
/AI ๋ฑ ํ๋ฉด ์๊ฐ ๋ง๊ณ ๊ณตํต UI(๋ฒํผ, ๋ชจ๋ฌ, ์
๋ ฅํผ, ์นด๋, ๋ฆฌ์คํธ)๊ฐ ๋ฐ๋ณต๋๋ ์๋น์ค์
- Tailwind CSS๋ฅผ ์ ์ฉํ๋ฉด ๋ฐ๋ณต UI๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌํํ๋ฉด์๋ ๋์์ธ ๊ท์น์ ์ผ๊ด๋๊ฒ ์ ์งํ ์ ์์
(1) ํ์ด์ง ์๊ฐ ๋ง์ โ์คํ์ผ ์ผ๊ด์ฑโ์ด ์ค์ํจ
-
ํ๋ฉด๋ง๋ค ๋ค๋ฅธ CSS ๋ฐฉ์์ผ๋ก ์์ฑํ๋ฉด ํฐํธ/๊ฐ๊ฒฉ/์์์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง๊ธฐ ์ฌ์
โ Tailwind์ ๊ท์นํ๋ ์ ํธ๋ฆฌํฐ๋ก ๊ธฐ๋ณธ ํค์ ํต์ผ ๊ฐ๋ฅ
(2) ๊ณตํต ์ปดํฌ๋ํธ(๋ชจ๋ฌ/๋ฒํผ/์ ๋ ฅํผ) ๊ฐ๋ฐ ์๋๊ฐ ๋นจ๋ผ์ง
-
Devths๋ OCR ์ฒ๋ฆฌ ๋ชจ๋ฌ, ๊ธ ์์ฑ ํผ, ์ฑํ ์ ๋ ฅ์ฐฝ ๋ฑ ๊ณตํต UI๊ฐ ๋ง์
โ Tailwind๋ก ๋น ๋ฅด๊ฒ ํ๋กํ ํ์ดํํ๊ณ , ์ปดํฌ๋ํธ ๋จ์๋ก ์ฌ์ฌ์ฉํ๊ธฐ ์ข์
(3) ๋ฐ์ํ UI ๊ตฌํ์ด ๊ฐ๋จํจ
-
์บ๋ฆฐ๋/์ฑํ ์ ๋ฐ์คํฌํ๊ณผ ๋ชจ๋ฐ์ผ ๋ ์ด์์์ด ๋ฌ๋ผ์ง ์ ์์
โ
md:flex,sm:hidden๊ฐ์ ๋ฐฉ์์ผ๋ก ํ์ด์ง๋ง๋ค ๋ฐ์ํ ์ฒ๋ฆฌ๊ฐ ์ฌ์
| ํญ๋ชฉ | Tailwind CSS | styled-components | CSS Modules(Sass ํฌํจ) |
|---|---|---|---|
| ๊ฐ๋ฐ ๋ฐฉ์ | ์ ํธ๋ฆฌํฐ ํด๋์ค ์กฐํฉ | ์ปดํฌ๋ํธ์ CSS-in-JS ์์ฑ | ํ์ผ ๋จ์๋ก ํด๋์ค ์์ฑ |
| UI ๋ณ๊ฒฝ ์๋ | JSX์์ ์ฆ์ ์์ ๊ฐ๋ฅ | ์คํ์ผ ์ ์ ํ์ผ๋ก ์ด๋ ํ์ | ์คํ์ผ ํ์ผ ์์ ํ์ |
| ์ํ๋ณ ์คํ์ผ๋ง |
hover:, focus:, data-* ๋ฑ ํจํดํ ์ฌ์ |
์กฐ๊ฑด๋ถ ์คํ์ผ ๋ถ๊ธฐ ๊ตฌํ | ํด๋์ค ์กฐํฉ/๋ถ๊ธฐ ํ์ |
| ๋์์ธ ์ผ๊ด์ฑ | config ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ์ฌ์ | ํ ๋ง๋ก ๊ฐ๋ฅ(์ค๊ณ ํ์) | ์ปจ๋ฒค์ ์์กด๋๊ฐ ํผ |
| ์ ์ง๋ณด์ ํฌ์ธํธ | ํด๋์ค๊ฐ ๊ธธ์ด์ง ์ ์์ด ๊ด๋ฆฌ ๊ท์น ํ์ | ํ์ผ/์คํ์ผ ๋ถ๋ฆฌ๋ก ๊ท๋ชจ ์ปค์ง์๋ก ๊ด๋ฆฌ ๋ณต์ก | ํ์ผ ์ฆ๊ฐ/๋ค์ด๋ฐ ๊ด๋ฆฌ ๋ถ๋ด |
-
UI ๋ณ๊ฒฝ ์๋ ๋ฐ ๋ฐ๋ณต UI ์์ฐ์ฑ
-
styled-components / CSS Modules๋ ์คํ์ผ์ ๋ณ๋ ํ์ผ(๋๋ CSS-in-JS ์์ญ)์์ ๊ด๋ฆฌํ๋ ๋น์ค์ด ์ปค์, ๋ฒํผ/ํญ/๋ฐฐ์ง/์นด๋/๋ชจ๋ฌ์ฒ๋ผ UI๊ฐ ๋ง์ด ๋ฐ๋ณต๋๋ ์๋น์ค์์๋ โ๋งํฌ์ ์์ โ ์คํ์ผ ํ์ผ ์ด๋โ ํ๋ฆ์ด ์์ฃผ ๋ฐ์ํจ. ์ด ๊ฒฝ์ฐ ํ๋ฉด ๋จ์ ์์ ๋์ด ๋์ ๋ ์๋ก ์์ ๋น์ฉ์ด ์ปค์ง ์ ์์
โ๏ธ ๋ฐ๋ฉด Tailwind CSS๋ JSX ์์์ ์ ํธ๋ฆฌํฐ ํด๋์ค๋ฅผ ์กฐํฉํด ์ฆ์ ์คํ์ผ์ ์ ์ฉยท์์ ํ ์ ์์ด, ํ๋ฉด ์๊ฐ ๋ง๊ณ UI ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋ณต๋๋ Devths์์ ๊ฐ๋ฐ ์๋์ ๋ฐ๋ณต ์์ ํจ์จ์ ํ๋ณดํ๊ธฐ ์ ๋ฆฌํจ
-
-
์ํ๋ณ ์คํ์ผ๋ง์ ํ์คํ
-
CSS Modules / styled-components๋ ์ํ๋ณ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํ์ง๋ง, ์กฐ๊ฑด ๋ถ๊ธฐ(ํด๋์ค ์กฐํฉ, props ๊ธฐ๋ฐ ๋ถ๊ธฐ)๊ฐ ํ๋ฉด๋ง๋ค ๋ค๋ฅด๊ฒ ๊ตฌํ๋๋ฉด ์คํ์ผ ๊ท์น์ด ๋ถ์ฐ๋๊ณ ๋๋ฝ๋ ์ํ์ด ์์
-
ํนํ ํ์ฑ/๋นํ์ฑ/์๋ฌ/์ ํ/hover/focus ๊ฐ์ ์ํ๊ฐ ๋ง์ UI์์๋ ๋ถ๊ธฐ ๋ก์ง์ด ๋์ด๋ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ์ฆ๊ฐํ ์ ์์
โ๏ธ ๋ฐ๋ฉด Tailwind CSS๋hover:,focus:,disabled:,data-*๋ฑ ์ํ ํํ์ ํด๋์ค ๋ ๋ฒจ์์ ํจํดํํ๊ธฐ ์ฌ์, ์ํ๋ณ UI ๊ท์น์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ ์ฉยทํ์ฅํ๋ ๋ฐ ์ ๋ฆฌํจ
-
-
๋์์ธ ์ผ๊ด์ฑ ์ ์ง ๋ฐฉ์
-
CSS Modules๋ ๋ค์ด๋ฐ/๊ตฌ์กฐ๊ฐ ํ ์ปจ๋ฒค์ ์ ํฌ๊ฒ ์์กดํ๊ณ , styled-components๋ ํ ๋ง ์ค๊ณ๋ฅผ ํตํด ํต์ผํ ์ ์์ง๋ง ์ด๊ธฐ ์ค๊ณ์ ํ ํฉ์๊ฐ ํ์ํ๋ค. ํ๋ก์ ํธ๊ฐ ์ปค์ง์๋ก ์ด๋ค ๊ฐ์ด ํ์ค์ธ์ง๊ฐ ํ๋ ค์ง ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ ๋ฐ๋ฉด Tailwind CSS๋ config(์์, ๊ฐ๊ฒฉ, ํฐํธ, ๋ธ๋ ์ดํฌํฌ์ธํธ ๋ฑ)๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ์ผ์ ๊ฐ์ ํ๊ธฐ ์ฌ์, ์ฌ๋ฌ ํ๋ฉด์ ๋ณ๋ ฌ๋ก ๊ฐ๋ฐํ๋๋ผ๋ ํค์ค๋งค๋๋ฅผ ์ ์งํ๋ ๋ฐ ์ ํฉํจ
-
-
์ ์ง๋ณด์ ๋ฆฌ์คํฌ์ ํํ
-
Tailwind CSS๋ ํด๋์ค๊ฐ ๊ธธ์ด์ง ์ ์์ด ๊ท์น(์: ๊ณตํต ์ปดํฌ๋ํธํ, ํด๋์ค ์ ๋ฆฌ ๊ธฐ์ค)์ด ํ์ํ๋ค๋ ๊ด๋ฆฌ ํฌ์ธํธ๊ฐ ์กด์ฌํจ
โ๏ธ ๋ค๋ง Devths์ฒ๋ผ UI๊ฐ ๋ง๊ณ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ด ์ฆ์ ํ๊ฒฝ์์๋ ํ์ผ ์ฆ๊ฐ/๋ค์ด๋ฐ ๊ด๋ฆฌ/CSS ๋ถ๊ธฐ ๋ก์ง ์ฆ๊ฐ๊ฐ ๋์ ๋๋ ๋ฐฉ์๋ณด๋ค, ํด๋์ค ์กฐํฉ ์ค์ฌ์ผ๋ก ๋น ๋ฅด๊ฒ ์์ ๊ฐ๋ฅํ Tailwind์ ์ ์ง๋ณด์ ํํ๊ฐ ๋ ์ ํฉํ๋ค๊ณ ํ๋จ๋จ
-
-
๊ณตํต ๋ฒํผ
- primary/secondary/disabled๋ฅผ ํด๋์ค ์กฐํฉ์ผ๋ก ํต์ผ
-
์ ์ญ ๋ชจ๋ฌ
- OCR ์ฒ๋ฆฌ ๋๊ธฐ ๋ชจ๋ฌ, ๊ฒฐ๊ณผ ๊ฒํ ๋ชจ๋ฌ ๋ฑ ๋ ์ด์ด UI๋ฅผ ๊ฐ์ ์คํ์ผ ๊ท์น์ผ๋ก ๊ตฌ์ฑ
-
๋ฆฌ์คํธ UI
- ๊ฒ์๊ธ ๋ชฉ๋ก, ์ฑํ
๋ฉ์์ง ๋ชฉ๋ก์ฒ๋ผ ๋ฐ๋ณต๋๋ UI๋ฅผ spacing ๊ท์น(
gap,py,border)์ผ๋ก ๊น๋ํ๊ฒ ์ ์ง
- ๊ฒ์๊ธ ๋ชฉ๋ก, ์ฑํ
๋ฉ์์ง ๋ชฉ๋ก์ฒ๋ผ ๋ฐ๋ณต๋๋ UI๋ฅผ spacing ๊ท์น(
- v4.1
- 2025๋ 4์ 1์ผ์ ๋ฆด๋ฆฌ์ฆ
- Tailwind CSS๋ ๋ฉ์ด์ ๋ฒ์ ์ด ๋ฐ๋ ๋ ์ค์ /๋น๋ ๋ฐฉ์์ด ๋ฌ๋ผ์ง ์ ์์ผ๋ฏ๋ก, ์ต์ ์์ ๋ฒ์ ์ธ 4.1์ ๊ธฐ์ค์ผ๋ก ์ก์ผ๋ฉด ๋ฌธ์์ ๋์ผํ ํ๋ฆ์ผ๋ก ์ ์ฉํ๊ธฐ ์ฌ์
- ๋์ผ ๋ฉ์ด์ (4.x) ์์์ ํจ์น ์ ๋ฐ์ดํธ๋ก ๋ฒ๊ทธ ์์ ๊ณผ ์์ ์ฑ ๊ฐ์ ์ ๋ฐ๋ ๋ฐฉ์์ด ์ ์ง๋ณด์์ ์ ๋ฆฌํ๋ฏ๋ก, ํ๋ก์ ํธ ๊ธฐ๋ณธ ๋ฒ์ ์ 4.1๋ก ๊ณ ์ ํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ํ๋จ
- devths๋ ๋ฐ๋ณต UI์ ์ํ ๋ณํ๊ฐ ๋ง์ ํ๋ฉด์ด ๋ง๊ธฐ ๋๋ฌธ์, ์คํ์ผ์ ๋น ๋ฅด๊ฒ ์กฐํฉํ๊ณ ์์ ํ ์ ์์ผ๋ฉฐ ํํ ๋ฐฉ์์ด ํต์ผ๋๊ธฐ ์ฌ์ด Tailwind CSS๊ฐ ์ ํฉํ๋ค๊ณ ํ๋จํจ.
-
ํ์ํ ์ปดํฌ๋ํธ๋ง ์ค์นํด์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์
-
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํต์งธ๋ก ์์กดํ๋ ๊ฒ ์๋๋ผ, ํ์ํ UI๋ง ํ๋ก์ ํธ์ ์ถ๊ฐํด์ ์ฌ์ฉํจ
โ ๋ถํ์ํ ๋ฒ๋ค ์ฆ๊ฐ๋ฅผ ์ค์ด๊ณ ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ปค์คํฐ๋ง์ด์งํ๊ธฐ ์ฌ์
-
-
์ปดํฌ๋ํธ ์ฝ๋๊ฐ ํ๋ก์ ํธ ๋ด๋ถ์ ์กด์ฌ
-
์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ปดํฌ๋ํธ๋ฅผ ๊ทธ๋๋ก ์ฐ๋ ๊ฒ์ด ์๋๋ผ, ์์ฑ๋ ์ปดํฌ๋ํธ ์ฝ๋๊ฐ ์ฐ๋ฆฌ ๋ ํฌ ์์ ๋ค์ด์ด
โ ๋์์ธ/๋์์ ์ฐ๋ฆฌ ์๋น์ค์ ๋ง๊ฒ ์์ ํ๊ธฐ ์ฝ๊ณ , ์ ์ง๋ณด์๋ ํฌ๋ช ํจ
-
-
Radix UI ๊ธฐ๋ฐ์ ์ ๊ทผ์ฑ(A11y)
-
Dialog, Dropdown, Tabs ๊ฐ์ ๋ณต์กํ UI๋ฅผ ์ ๊ทผ์ฑ ๊ณ ๋ ค๋ ํจํด์ผ๋ก ๊ตฌ์ฑํ ์ ์์
โ ๋ชจ๋ฌ/๋๋กญ๋ค์ด/ํญ ๋ฑ ์ธํฐ๋์ ์ด ๋ง์ ์๋น์ค์์ ์์ ์
-
-
Tailwind CSS์ ๊ถํฉ์ด ์ข์
- ๊ธฐ๋ณธ ์คํ์ผ๋ง์ด Tailwind ๊ธฐ๋ฐ์ด๋ผ, Devths์ ์คํ์ผ๋ง ์ ๋ต(Tailwind)๊ณผ ์ผ๊ด๋๊ฒ ํตํฉ ๊ฐ๋ฅ
-
์ผ๊ด๋ UI ํ์ง
- ๋ฒํผ/์ ๋ ฅ/๋ชจ๋ฌ/ํ ์คํธ ๋ฑ ๊ณตํต UI๋ฅผ ํ์ค ์ปดํฌ๋ํธ๋ก ์ฌ์ฌ์ฉํด์ ํ๋ฉด์ด ๋ง์์ ธ๋ ๋์์ธ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ฌ์
Devths๋ ์บ๋ฆฐ๋/๊ฒ์ํ/์ฑํ /AI ๊ธฐ๋ฅ ์ ๋ฐ์์ ๊ณตํต UI ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋ณต์ ์ผ๋ก ๋ฑ์ฅํจ
โ shadcn/ui๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณตํต UI๋ฅผ ๋น ๋ฅด๊ฒ ๊ตฌ์ฑํ๋ฉด์๋, ์ปดํฌ๋ํธ ์ฝ๋๊ฐ ํ๋ก์ ํธ ๋ด๋ถ์ ์์ด Devths ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ปค์คํฐ๋ง์ด์ง์ด ๊ฐ๋ฅ
(1) ๊ณตํต UI๊ฐ ๋งค์ฐ ๋ง์
-
์: ๋ฒํผ, ์ ๋ ฅํผ, ๋๋กญ๋ค์ด, ํญ, ๋ชจ๋ฌ(Dialog), ํ ์คํธ, ์นด๋, ๋ฐฐ์ง
-
OCR ์ฒ๋ฆฌ ๋๊ธฐ ๋ชจ๋ฌ / ๊ฒฐ๊ณผ ๊ฒํ ๋ชจ๋ฌ ๊ฐ์ ๋ ์ด์ด UI๊ฐ ์์ฃผ ๋ฑ์ฅ
โ shadcn/ui๋ก ๊ธฐ๋ณธ ํ๋ฆฌํฐ๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ณด
(2) ๋์์ธ ์ผ๊ด์ฑ๊ณผ ๊ฐ๋ฐ ์๋๋ฅผ ๋์์ ์ก์ ์ ์์
-
ํ์ด์ง๊ฐ ๋์๋ก ๊ฐ์ ๋ง๋ ๋ฒํผ/๋ชจ๋ฌ์ด ์๊ธฐ๋ฉด UI๊ฐ ํ๋ค๋ฆผ
โ ํ์ค ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ํต์ผํ๋ฉด ํ์ง์ด ์์ ์
(3) ์ปค์คํฐ๋ง์ด์ง์ด ์ฌ์
-
Devths๋ ์๋น์ค ํค(์/์ฌ๋ฐฑ/ํ์ดํฌ)๊ณผ UX(๋ชจ๋ฌ ๋จ๊ณ, ํผ ๊ฒ์ฆ ๋ฉ์์ง ๋ฑ)๊ฐ ์ค์
โ ์ปดํฌ๋ํธ ์ฝ๋๊ฐ ๋ด๋ถ์ ์์ผ๋ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์์ ๊ฐ๋ฅ
-
์บ๋ฆฐ๋
- ์ผ์ ์ถ๊ฐ/์์ :
Dialog+Input+Select+Button - OCR ์
๋ก๋/์ฒ๋ฆฌ ๋๊ธฐ/๊ฒฐ๊ณผ ๊ฒํ :
Dialog/Sheet+Progress(๋ก๋ฉ UI) +Toast
- ์ผ์ ์ถ๊ฐ/์์ :
-
๊ฒ์ํ
- ๊ธ ๋ชฉ๋ก ์นด๋:
Card - ๊ฒ์/ํํฐ:
Input,DropdownMenu,Tabs - ๋๊ธ ์์ญ:
Textarea,Button,Separator
- ๊ธ ๋ชฉ๋ก ์นด๋:
-
์ฑํ
- ๋ฐฉ ๋ชฉ๋ก/๋ฉ์์ง ํจ๋ ๋ ์ด์์:
Sheet(๋ชจ๋ฐ์ผ),ScrollArea - ๋ฉ์์ง ์
๋ ฅ:
Textarea/Input+Button - ์์คํ
์๋ฆผ/์๋ฌ ์๋ด:
Toast
- ๋ฐฉ ๋ชฉ๋ก/๋ฉ์์ง ํจ๋ ๋ ์ด์์:
| ํญ๋ชฉ | shadcn/ui | MUI (Material UI) | Ant Design |
|---|---|---|---|
| ์ฌ์ฉ ๋ฐฉ์ | ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ํ๋ก์ ํธ์ ์ถ๊ฐํ์ฌ ์์ | ํจํค์ง ์ค์น ํ ์ปดํฌ๋ํธ ์ฌ์ฉ | ํจํค์ง ์ค์น ํ ์ปดํฌ๋ํธ ์ฌ์ฉ |
| ์ปค์คํฐ๋ง์ด์ง | ์ฝ๋ ์์ ์ผ๋ก ์ง์ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ | ํ ๋ง/์ค๋ฒ๋ผ์ด๋ ์ค์ฌ(๊ท์น ํ์ต ํ์) | ํ ๋ง ์ค์ฌ(๋์์ธ ์์คํ ์ฑ๊ฒฉ ๊ฐํจ) |
| ๋์์ธ ์ผ๊ด์ฑ | ํ๋ก์ ํธ ๊ท์น ์ค์ฌ์ผ๋ก ์ค๊ณ ๊ฐ๋ฅ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ณธ ๋์์ธ ์ฒด๊ณ๊ฐ ์กด์ฌ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ณธ ๋์์ธ ์ฒด๊ณ๊ฐ ๊ฐํจ |
| ์ ๋ฐ์ดํธ ์ํฅ | ํ์ ์์๋ง ๋ฐ์(์ ํ์ ) | ์ ๋ฐ์ดํธ์ ๋ฐ๋ฅธ ์ํฅ ๊ฐ๋ฅ | ์ ๋ฐ์ดํธ์ ๋ฐ๋ฅธ ์ํฅ ๊ฐ๋ฅ |
| ์ ํฉํ ์ํฉ | ์๋น์ค ๊ณ ์ UI๊ฐ ๋ง๊ณ ์ฝ๋ ์์ ๋ฅผ ์ ํธํ ๋ | ํ์ค UI๋ก ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ ๋ | ๋์๋ณด๋/๊ด๋ฆฌ์ ์ฑ๊ฒฉ UI์ ์ ๋ฆฌ |
-
์๋น์ค ๊ณ ์ UI ๋ฐ์(์ปค์คํฐ๋ง์ด์ง ๋น์ฉ)
-
MUI / Ant Design์ ๊ธฐ๋ณธ ๋์์ธ ์์คํ ์ด ๊ฐํด์, ์๋น์ค๋ง์ ํค์ค๋งค๋(๊ฐ๊ฒฉ/ํฐํธ/๋ฒํผ ํํ/๋ชจ๋ฌ ๋์)๋ฅผ ๋ง์ถ๋ ค๋ฉด ํ ๋ง ์ค์ ยท์ค๋ฒ๋ผ์ด๋ ๊ท์น์ ๊น๊ฒ ์ดํดํด์ผ ํ๊ณ , ์ปค์คํ ๋ฒ์๊ฐ ์ปค์ง์๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐฉ์์ ๋ง์ถฐ ์์ ํ๋ ๋น์ฉ์ด ๋์ ๋ ์ ์์
โ๏ธ ๋ฐ๋ฉด shadcn/ui๋ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ํ๋ก์ ํธ์ ์ง์ ๊ฐ์ ธ์ ์ฝ๋ ์์ฒด๋ฅผ ์์ ํ๋ ๊ตฌ์กฐ๋ผ, Devths์ฒ๋ผ ํ๋ฉด์ด ๋ง๊ณ UI ๋ํ ์ผ์ด ์์ฃผ ๋ฐ๋๋ ํ๋ก์ ํธ์์ ์๊ตฌ์ฌํญ์ ๋น ๋ฅด๊ฒ ๋ฐ์ํ๊ณ ์ผ๊ด๋ ์คํ์ผ ๊ท์น์ ์ ์งํ๊ธฐ ์ ๋ฆฌํจ
-
-
์ฝ๋ ์์ ๊ถ๊ณผ ์ ๋ฐ์ดํธ ๋ฆฌ์คํฌ ํต์
-
MUI / Ant Design์ ํจํค์ง์ ์์กดํ๋ ๋ฐฉ์์ด๋ผ, ๋ฒ์ ์ ๋ฐ์ดํธ ์ ๋ด๋ถ ๋ณ๊ฒฝ์ ๋ฐ๋ผ ์คํ์ผ/๋์์ด ์ํฅ์ ๋ฐ์ ์ ์๊ณ (ํนํ ์ปค์คํ ์ค๋ฒ๋ผ์ด๋๊ฐ ๋ง์์๋ก) ํ๊ท ์ด์ ๋์ ๋น์ฉ์ด ์ปค์ง ์ ์์
โ๏ธ ๋ฐ๋ฉด shadcn/ui๋ ํ์ํ ์ปดํฌ๋ํธ๋ง ํ๋ก์ ํธ์ ์ถ๊ฐํ๊ณ , ์ ๋ฐ์ดํธ๋ ํ์ํ ๋๋ง ์ ํ์ ์ผ๋ก ๋ฐ์ํ ์ ์์ด, ์ ๋ฐ์ดํธ ์ํฅ ๋ฒ์๋ฅผ ํ์ด ํต์ ํ๊ธฐ ์ฌ์
-
-
์ ๊ทผ์ฑ(ARIA/ํค๋ณด๋ ํฌ์ปค์ค) ํ์ง ํ๋ณด
-
๋ชจ๋ฌ/๋๋กญ๋ค์ด/ํญ/ํดํ ๊ฐ์ ์ปดํฌ๋ํธ๋ ํค๋ณด๋ ํฌ์ปค์ค ์ด๋, aria ์์ฑ, ์คํฌ๋ฆฐ๋ฆฌ๋ ๋์ ๋ฑ ์ ๊ทผ์ฑ ์๊ตฌ๋ฅผ ์ ๋๋ก ๋ง์ถ์ง ์์ผ๋ฉด ํ์ง ํธ์ฐจ๊ฐ ์๊ธฐ๊ธฐ ์ฌ์
โ๏ธ shadcn/ui๋ Radix UI ๊ธฐ๋ฐ ํจํด์ ํ์ฉํ๋ฏ๋ก, Devths์์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ํ ์ํธ์์ฉ UI๋ฅผ ์ ๊ทผ์ฑ ๊ธฐ์ค์ ๋ง์ถฐ ํ์คํ๋ ํ์ง๋ก ๊ฐ์ ธ๊ฐ๊ธฐ ์ ๋ฆฌํจ
-
-
Tailwind ๊ธฐ๋ฐ ์คํ์ผ๋ง๊ณผ์ ์ ํฉ์ฑ
-
Devths๋ Tailwind๋ฅผ ์คํ์ผ๋ง ์ ๋ต์ผ๋ก ์ฑํํ๊ธฐ ๋๋ฌธ์, ์ปดํฌ๋ํธ ๋ ๋ฒจ์์๋ Tailwind ์ ํธ๋ฆฌํฐ๋ก ์คํ์ผ์ ํต์ผํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ์ ๋ฆฌํจ
โ๏ธ shadcn/ui๋ Tailwind ์ค์ฌ์ผ๋ก ๊ตฌ์ฑ/ํ์ฅํ๋ ํ๋ฆ๊ณผ ์ ๋ง์, ์ ์ญ ๋์์ธ ๊ท์น(config) + ์ปดํฌ๋ํธ ๊ตฌํ์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ด์ํ๊ธฐ ์ฌ์
-
- devths๋ ๋ค์์ ํ๋ฉด๊ณผ ๋ฐ๋ณต๋๋ ์ํธ์์ฉ UI๊ฐ ์กด์ฌํ๋ฉฐ, ์ ์ญ ๋ชจ๋ฌ/ํญ/๋๋กญ๋ค์ด ๋ฑ ์ ๊ทผ์ฑ๊น์ง ๊ณ ๋ คํด์ผ ํ๋ ์ปดํฌ๋ํธ์ ๋น์ค์ด ๋์
- shadcn/ui๋ ์ปดํฌ๋ํธ ์ฝ๋๋ฅผ ํ๋ก์ ํธ๊ฐ ์ง์ ์์ ํ์ฌ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์์ , ํ์ฅํ ์ ์์ผ๋ฏ๋ก, devths์ UI ํ์คํ์ ์ ์ง๋ณด์์ฑ ํ๋ณด๋ฅผ ์ํด ์ ํฉํ ์ ํ์ผ๋ก ํ๋จํจ
-
์/์ฃผ/์ผ ๋ทฐ ๋ฑ ์บ๋ฆฐ๋ UI๋ฅผ ์์ฑ๋ ๋๊ฒ ์ ๊ณต
- ๊ธฐ๋ณธ์ผ๋ก Month/Week/Day ๋ทฐ๋ฅผ ์ง์ํ๊ณ , ์ผ์ (์ด๋ฒคํธ)์ ์บ๋ฆฐ๋ ํํ๋ก ์๊ฐํํ๋ ๊ธฐ๋ฅ์ด ์ ๊ฐ์ถฐ์ ธ ์์
-
๊ฐ๋ ฅํ ์ธํฐ๋์
์ง์
- ๋ ์ง ํด๋ฆญ, ์ผ์ ํด๋ฆญ, ๋๋๊ทธ&๋๋กญ ์ด๋, ๋ฆฌ์ฌ์ด์ฆ(์๊ฐ ๋๋ฆฌ๊ธฐ) ๋ฑ ์บ๋ฆฐ๋์์ ๊ธฐ๋ํ๋ UX๋ฅผ ํ์ค ๊ธฐ๋ฅ์ผ๋ก ์ ๊ณต
-
์ด๋ฒคํธ ๋ฐ์ดํฐ ๋ ๋๋ง/์ปค์คํฐ๋ง์ด์ง์ด ์ ์ฐํจ
- ์ด๋ฒคํธ ์์, ํ์ ํํ, ํดํ/ํ์ค๋ฒ, ์ปค์คํ ๋ ๋๋ง ๋ฑ UI ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ
-
ํ๋ฌ๊ทธ์ธ ๊ตฌ์กฐ
- ํ์ํ ๋ทฐ/๊ธฐ๋ฅ๋ง ์ถ๊ฐํด ์ฌ์ฉํ ์ ์์ด, ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๊ตฌ์ฑํ๊ธฐ ์ข์
- ์: dayGrid, timeGrid, interaction ๋ฑ
-
React ์ฐ๋ ์ง์
- React์ฉ ํจํค์ง๋ฅผ ์ ๊ณตํด ์ปดํฌ๋ํธ ํํ๋ก ์บ๋ฆฐ๋๋ฅผ ๋ถ์ผ ์ ์๊ณ , ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ React ์ํ/๋ก์ง๊ณผ ์ฐ๊ฒฐํ๊ธฐ ์ฌ์
Devths์ ์บ๋ฆฐ๋๋ ๋จ์ ์ผ์ ํ์๊ฐ ์๋๋ผ ์ผ์ CRUD + ์ฌ์ฉ์ ์ธํฐ๋์ + AI(OCR) ๊ธฐ๋ฐ ์ผ์ ์๋ ์ฝ์ ๊น์ง ํฌํจํ๋ ํต์ฌ ๊ธฐ๋ฅ์
- FullCalendar๋ ์์ฑ๋ ์บ๋ฆฐ๋ UI + ๊ฐ๋ ฅํ ์ธํฐ๋์ ์ ๊ธฐ๋ณธ ์ ๊ณตํ๋ฏ๋ก, ์ง์ ์บ๋ฆฐ๋๋ฅผ ๊ตฌํํ๋ ๋น์ฉ์ ์ค์ด๊ณ ํต์ฌ ๊ธฐ๋ฅ ๊ฐ๋ฐ(OCR/AI, ์ผ์ ๊ด๋ฆฌ ๋ก์ง)์ ์ง์คํ ์ ์์
(1) ์/์ฃผ ๋ทฐ๊ฐ ํ์์ธ ์๋น์ค ์๊ตฌ์ฌํญ์ ์ ํฉ
-
์ฑ์ฉ ์ผ์ /๋ง๊ฐ/๋ฉด์ ์ผ์ ์ ์/์ฃผ ๋จ์๋ก ๋ณด๋ ๋์ฆ๊ฐ ํผ
โ FullCalendar๋ ์ด ๋ทฐ๋ฅผ ๊ธฐ๋ณธ ์ง์
(2) ์ผ์ ํธ์ง UX(ํด๋ฆญ/๋๋๊ทธ/๋ฆฌ์ฌ์ด์ฆ)๊ฐ ์ค์
- ์ผ์ ํด๋ฆญ โ ์์ธ/์์ ๋ชจ๋ฌ
- ๋๋๊ทธ๋ก ๋ ์ง ์ด๋, ๋ฆฌ์ฌ์ด์ฆ๋ก ์๊ฐ ์กฐ์ ๊ฐ์ UX๋ฅผ ์ ๊ณตํ๋ฉด ์บ๋ฆฐ๋ ์ฌ์ฉ์ฑ์ด ํฌ๊ฒ ์ฌ๋ผ๊ฐ
(3) OCR๋ก ์์ฑ๋ โ์ด์ ์ผ์ โ์ ์์ฐ์ค๋ฝ๊ฒ ๋ฐ์ ๊ฐ๋ฅ
- OCR ๊ฒฐ๊ณผ๋ก ์์ฑ๋ ์ด๋ฒคํธ๋ฅผ ์บ๋ฆฐ๋์ ์ฆ์ ๋ฏธ๋ฆฌ ๋ณด์ฌ์ฃผ๊ณ (์ด์ ํ์),
- ์ฌ์ฉ์ ํ์ธ ํ ์ ์ฅํ๋ ํ๋ฆ์ ๋ง์ถฐ ์ด๋ฒคํธ ๋ ๋๋ง/์ ๋ฐ์ดํธ๋ฅผ ์ ์ฐํ๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ
-
์ด๋ฒคํธ ํ์
๊ณ ์ (TypeScript)
- ์๋ฒ์์ ๋ฐ์ ์ด๋ฒคํธ๋ฅผ
CalendarEventํ์ ์ผ๋ก ๊ณ ์ ํ๊ณ , FullCalendar๊ฐ ์๊ตฌํ๋ ํํ๋ก ๋ณํ ํจ์๋ก ๋งคํ
- ์๋ฒ์์ ๋ฐ์ ์ด๋ฒคํธ๋ฅผ
-
ํต์ฌ ์ธํฐ๋์
์ฐ๊ฒฐ
- ๋ ์ง ํด๋ฆญ: ์ผ์ ์ถ๊ฐ ๋ชจ๋ฌ ์คํ
- ์ด๋ฒคํธ ํด๋ฆญ: ์ผ์ ์์ธ/์์ ๋ชจ๋ฌ ์คํ
- ๋๋๊ทธ/๋ฆฌ์ฌ์ด์ฆ: ์ผ์ ์์ API ํธ์ถ โ ์ฑ๊ณต ์ ์ผ์ ๋ชฉ๋ก ๊ฐฑ์
-
OCR ์๋ ์ฝ์
- ์ ๋ก๋ โ ์ฒ๋ฆฌ์ค ๋ชจ๋ฌ โ ๊ฒฐ๊ณผ ์ด์ ์์ฑ โ ์บ๋ฆฐ๋์ ์์ ํ์ โ ์ฌ์ฉ์ ํ์ ์ ์ ์ฅ
| ํญ๋ชฉ | FullCalendar | react-big-calendar | ์ง์ ๊ตฌํ |
|---|---|---|---|
| ๊ตฌํ ๋ฒ์ | ๋ฌ๋ ฅ UI ๊ธฐ๋ฅ ํญ์ด ๋๊ณ , ๋ทฐ/์ด๋ฒคํธ ๋ฐฐ์น/์ํธ์์ฉ ์ง์์ด ์ฒด๊ณ์ | ๊ธฐ๋ณธ ๋ฌ๋ ฅ ๊ตฌํ์ ๊ฐ๋ฅํ๋, ๋ณต์กํ ํํ ๊ท์น์ด ๋ง์์๋ก ์ปค์คํ ๋ถ๋ด ์ฆ๊ฐ | ์์ ์์ ์ด๋ ๋ ์ง ๊ณ์ฐ/๋ฐฐ์น/๊ฒน์นจ/์ ๊ทผ์ฑ/์ฑ๋ฅ์ ๋ชจ๋ ์ง์ ๊ตฌํํด์ผ ํจ |
| ์ปค์คํฐ๋ง์ด์ง | ์ด๋ฒคํธ ํ์ ๋ฐฉ์ ์ปค์คํ ์ ๊ฐํจ | ์ปค์คํ ๊ฐ๋ฅํ๋ ์๊ตฌ์ฌํญ์ด ๋ง์ผ๋ฉด ์ค๊ณ ๋์ด๋ ์ฆ๊ฐ | ์์ ๋ ์ต๊ณ (๋์ ์ ์ง๋ณด์ ๋น์ฉ ์ต๊ณ ) |
| ๋ฆฌ์คํฌ/์ผ์ | ๊ฒ์ฆ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ๋ฌ๋ ฅ ํน์ ์์ธ ์ผ์ด์ค ๋ฆฌ์คํฌ ๊ฐ์ | ๋จ์ ์๊ตฌ์๋ ์ ํฉ, ๋ณต์ก ์๊ตฌ์๋ ์ถ๊ฐ ๋น์ฉ ๋ฐ์ ๊ฐ๋ฅ | ๊ฐ๋ฐ ๊ธฐ๊ฐ/๋ฒ๊ทธ/์ฑ๋ฅ ๋ฆฌ์คํฌ๊ฐ ํผ |
| Devths ์ ํฉ๋ | ๊ท์น์ด ๋ง์ ์บ๋ฆฐ๋ UIโ์ ์ ํฉ | ๋จ์ ๋ฌ๋ ฅ ์์ค์ด๋ฉด ํ๋ณด | ๊ณผ์ /๊ธฐ๊ฐ ์ ํ ์ํฉ์์๋ ๋น์ถ์ฒ |
-
๊ตฌํ ๋ฒ์์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์ปค๋ฒ๋ฆฌ์ง
-
react-big-calendar๋ ๊ธฐ๋ณธ์ ์ธ ๋ฌ๋ ฅ ํ๋ฉด ๊ตฌ์ฑ์ ๊ฐ๋ฅํ์ง๋ง, ์/์ฃผ ์ ํ + ์ผ์ ๋ฐฐ์น + ํด๋ฆญ ์ํธ์์ฉ + ๋ค์ํ ํํ ๊ท์น์ฒ๋ผ ์๊ตฌ์ฌํญ์ด ๋์ด๋ ์๋ก ์ถ๊ฐ ๊ตฌํ ๋ฒ์๊ฐ ๋น ๋ฅด๊ฒ ์ปค์ง ์ ์์
-
์ง์ ๊ตฌํ์ ์์ ๋๋ ๋์ง๋ง, ๋ ์ง ๊ทธ๋ฆฌ๋ ๊ตฌ์ฑ/์ยท์ฃผ ๊ณ์ฐ/์ด๋ฒคํธ ๋ฐฐ์น/๊ฒน์นจ ์ฒ๋ฆฌ ๊ฐ์ ๋ฌ๋ ฅ ํต์ฌ ๋ก์ง๊น์ง ์ ๋ถ ์ง์ ์ฑ ์์ ธ์ผ ํด์ ๊ฐ๋ฐ ๋์ด๋์ ์ผ์ ๋ถ๋ด์ด ๋งค์ฐ ํผ
โ๏ธ ๋ฐ๋ฉด FullCalendar๋ ๋ฌ๋ ฅ UI์์ ๋ฐ๋ณต์ ์ผ๋ก ํ์ํ ๋ทฐ ์ ํ, ์ด๋ฒคํธ ๋ฐฐ์น, ์ํธ์์ฉ ์ฒ๋ฆฌ๊ฐ ์ฒด๊ณ์ ์ผ๋ก ์ ๊ณต๋์ด, Devths๋ ๋ฌ๋ ฅ ์์ง์ ์๋ก ๋ง๋ค๊ธฐ๋ณด๋ค ์๋น์ค ์๊ตฌ์ฌํญ์ ์ง์คํ๊ธฐ ์ ๋ฆฌํจ
-
-
์ปค์คํฐ๋ง์ด์ง ๋น์ฉ๊ณผ ํ์ฅ์ฑ
-
Devths ์บ๋ฆฐ๋๋ ๋จ์ํ ์ผ์ ๋ชฉ๋ก ํ์๊ฐ ์๋๋ผ, ์ /์ ํํ, ํ๊ทธยท๋จ๊ณยทํ์ฌ ๊ฐ์ ๋ถ๊ฐ ์ ๋ณด ํ์, ํํฐ UX ๋ฑ ์ปค์คํฐ๋ง์ด์ง ์์๊ฐ ๋์ด๋ ๊ฐ๋ฅ์ฑ์ด ํผ
-
react-big-calendar์์๋ ์ปค์คํ ์ ๊ฐ๋ฅํ์ง๋ง, ์๊ตฌ์ฌํญ์ด ๋ณต์กํด์ง์๋ก ์ค๊ณ ๋์ด๋์ ์ ์ง๋ณด์ ๋น์ฉ์ด ์ฆ๊ฐํ ์ ์์
-
์ง์ ๊ตฌํ์ ์ํ๋ ๊ฑด ๋ค ํ ์ ์์ง๋ง, ๊ทธ๋งํผ ๊ตฌํยทํ ์คํธยท์ ์ง๋ณด์ ์ฑ ์์ด ์ ๋ถ ํ๋ก์ ํธ์ ๋จ์
โ๏ธ FullCalendar๋ ์ด๋ฒคํธ ๋ ๋๋ง ์ปค์คํฐ๋ง์ด์ง์ ์ ์ ๋ก ํ ๊ตฌ์กฐ๊ฐ ํํํด, ํํ ๊ท์น์ด ๋ง์ ์บ๋ฆฐ๋์์ ๋ณ๊ฒฝ ๋์ ๋น์ฉ์ ๋ฎ์ถ๋ ๋ฐ ์ ๋ฆฌํจ.
-
-
๋ฆฌ์คํฌ์ ์ผ์ (๋ฌ๋ ฅ ํน์ ์์ธ ์ผ์ด์ค)
-
๋ฌ๋ ฅ์ ์๊ฐ๋ณด๋ค ์์ธ ์ผ์ด์ค๊ฐ ๋ง์(์ ๊ฒฝ๊ณ, ์ฃผ์ฐจ ๊ณ์ฐ, ํ์์กด/์ข ์ผ ์ผ์ , ๊ธฐ๊ฐ ์ผ์ ์ ์์ยท๋ ์ฒ๋ฆฌ, ์ด๋ฒคํธ ๊ฒน์นจ ๋ฑ).
-
์ง์ ๊ตฌํ์ ์ด๋ฐ ์์ธ ์ผ์ด์ค๋ฅผ ๋ชจ๋ ์ง์ ํด๊ฒฐํด์ผ ํ๋ฏ๋ก ๋ฒ๊ทธ/์ฑ๋ฅ/์ผ์ ๋ฆฌ์คํฌ๊ฐ ๊ฐ์ฅ ํผ.
-
react-big-calendar๋ ๋จ์ ์๊ตฌ์ ์ ํฉํ์ง๋ง, ๋ณต์กํ ๊ท์น์ด ์ถ๊ฐ๋ ์๋ก ์ถ๊ฐ ๊ตฌํ + ์์ธ ์ผ์ด์ค ์ฒ๋ฆฌ๊ฐ ๋์ ๋ ์ ์์.
โ๏ธ FullCalendar๋ ๊ฒ์ฆ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ๋ฌ๋ ฅ ํต์ฌ ์์ธ ์ผ์ด์ค๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ํก์ํด, ๊ธฐ๊ฐ ์ ํ ํ๊ฒฝ์์ ์์ ์ ์ธ ์ ํ์ด ๋จ
-
-
Devths ์๊ตฌ์ฌํญ ์ ํฉ์ฑ
-
Devths๋ ๊ท์น์ด ๋ง์ ์บ๋ฆฐ๋ UI๊ฐ ์ค์ฌ ๊ธฐ๋ฅ ์ค ํ๋์ด๋ฏ๋ก, ๋จ์ ๋ฌ๋ ฅ ์์ค์ ์ต์ ํ๋ ์ ํ๋ณด๋ค ํํ๋ ฅ/ํ์ฅ์ฑ/์์ ์ฑ์ด ์ค์ํจ.
โ๏ธ ๋ฐ๋ผ์ Devths์์๋ FullCalendar๋ฅผ ์ฑํํ์ฌ ๋ฌ๋ ฅ์ ํต์ฌ ์์ง์ ๊ฒ์ฆ๋ ๋๊ตฌ์ ๋งก๊ธฐ๊ณ , ์๋น์ค ๊ณ ์ ์๊ตฌ์ฌํญ(ํํฐ๋ง, ์ปค์คํ ๋ ๋๋ง, ์์ธ ์นด๋/๋ชจ๋ฌ ํ๋ก์ฐ)์ ๊ฐ๋ฐ ์ญ๋์ ์ง์คํ๋ ๊ตฌ์ฑ์ด ํฉ๋ฆฌ์ ์.
-
- v6.1.20
- 2025๋ 12์ 23์ผ์ ๋ฆด๋ฆฌ์ฆ๋จ
- ์ด์
- ์์ ์ ์ธ(Stable) ๋ฒ์ ๋ผ์ธ์ ๊ธฐ์ค์ผ๋ก ์ ์ ํ์ฌ, ๊ณผ์ /์๋น์ค ๊ฐ๋ฐ์์ ๋ฐ์ํ ์ ์๋ ์๊ธฐ์น ๋ชปํ ๋ณ๊ฒฝ(๋ฒ ํ ๊ธฐ๋ฅ/๋ถ์์ ์ฑ) ๋ฆฌ์คํฌ๋ฅผ ์ค์
- React ํ๊ฒฝ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ตฌ์ฑ(React ์ปดํฌ๋ํธ ์ ๊ณต)์ ๊ธฐ๋ฐ์ผ๋ก Next.js ํ๋ก์ ํธ์ ์ ์ฉ์ด ์ฉ์ดํจ
- Devths ์บ๋ฆฐ๋๋ Google Calendar API๋ฅผ ํตํด ์ผ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋, ํ๋ฉด ์๊ตฌ์ฌํญ(์/์ฃผ ์ ํ, ์ผ์ ์ /์ ํํ, ์์ธ ์นด๋/๋ชจ๋ฌ ์ฐ๋, ํํฐ UX ๋ฑ)์ ํ๋ก ํธ์์ ๊ตฌํํด์ผ ํจ
- FullCalendar๋ ๋ฌ๋ ฅ UI์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ ์ด๋ฒคํธ ๋ฐฐ์น/์ํธ์์ฉ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ์๊ตฌ์ฌํญ ์ถฉ์กฑ์ ์ ํฉํ๋ฉฐ, ๊ฐ๋ฐ ํจ์จ ๋ฐ ์ ์ง๋ณด์ ์ธก๋ฉด์์๋ ์ ๋ฆฌํจ
-
๋น ๋ฅด๊ณ ๋์คํฌ ํจ์จ์ ์ธ ํจํค์ง ๋งค๋์
- npm/yarn์ฒ๋ผ
node_modules๋ฅผ ์ค์นํ์ง๋ง, ์ค์น ์๋์ ๋์คํฌ ์ฌ์ฉ๋ ์ต์ ํ์ ๊ฐ์ ์ด ์์.
- npm/yarn์ฒ๋ผ
-
๋ฒ์ ๊ณ ์ (์ฌํ ๊ฐ๋ฅํ ์ค์น) ์ง์
- Corepack์ ์ฐ๋ฉด ํ๋ก์ ํธ
package.json์packageManagerํ๋๋ก pnpm ๋ฒ์ ์ ๊ณ ์ ํด์, ํ์/CI ํ๊ฒฝ์ด ๋ฌ๋ผ๋ ๊ฐ์ ๋ฒ์ ์ผ๋ก ์ค์น๋๊ฒ ๋ง๋ค ์ ์์.
- Corepack์ ์ฐ๋ฉด ํ๋ก์ ํธ
-
์ํฌ์คํ์ด์ค(๋ชจ๋
ธ๋ ํฌ) ๊ตฌ์ฑ์ ์ ํฉ
-
pnpm-workspace.yaml๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ํจํค์ง๋ฅผ ํ ๋ ํฌ์์ ๊ด๋ฆฌํ๊ธฐ ์ฌ์.
-
-
์ค์ /๊ท์น์ ํ ๊ณณ์์ ๊ด๋ฆฌ ๊ฐ๋ฅ
- ์ค์ ์ CLI / ํ๊ฒฝ๋ณ์ /
pnpm-workspace.yaml/.npmrc์์ ๊ฐ์ ธ์ค๋ฉฐ, ํ ๊ณตํต ๊ท์น์ ์ ํ๊ธฐ ์ข์.
- ์ค์ ์ CLI / ํ๊ฒฝ๋ณ์ /
Devths๋ ํ๋ก ํธ(Next/React/TS) + ํ ์คํธ/๋ฆฐํธ/๋น๋ ๋๊ตฌ + ๋ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์์กด์ฑ์ด ๋ง์์ง ๊ฐ๋ฅ์ฑ์ด ํฌ๊ณ , ํ ํ์ ํ๊ฒฝ์์๋ ์ค์น ๊ฒฐ๊ณผ๊ฐ ๋งค๋ฒ ๊ฐ์์ผ ์์ ์ ์.
(1) ํ ํ์ ์์ ์ค์น ํ๊ฒฝ์ ํต์ผํด์ผ ํจ
-
ํ์๋ง๋ค pnpm ๋ฒ์ ์ด ๋ค๋ฅด๋ฉด ์ค์น ๊ฒฐ๊ณผ/๋ฝํ์ผ ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ฌ๋ผ์ ธ ์ถฉ๋์ด ๋ ์ ์์
โ Corepack์ผ๋ก pnpm ๋ฒ์ ์ ํ๋ก์ ํธ์ ๊ณ ์ ํ๋ฉด ํ๊ฒฝ ์ฐจ์ด๋ฅผ ์ค์ผ ์ ์์.
(2) ์ํฌ์คํ์ด์ค๋ก ํ์ฅ ๊ฐ๋ฅ
- ์ดํ
apps/web,packages/ui,packages/shared๊ฐ์ ๊ตฌ์กฐ๋ก ์ปค์ง ๋pnpm-workspace.yaml๊ธฐ๋ฐ ๊ด๋ฆฌ๊ฐ ํธํจ.
(3) CI(๋น๋/ํ ์คํธ)์์ ์ค์น ์๊ฐ์ ์ค์ด๊ธฐ ์ ๋ฆฌ
- pnpm์ ์บ์/์คํ ์ด ๊ธฐ๋ฐ ์ค์น ์ ๋ต์ ์ ๊ณตํด์ ๋ฐ๋ณต ์ค์น ์ํฉ(๋ก์ปฌ/CI)์์ ํจ์จ์ ๊ธฐ๋ํ ์ ์์.
-
Corepack์ผ๋ก pnpm ํ์ฑํ & ๋ฒ์ ๊ณ ์
-
Corepack ํ์ฑํ:
corepack enable pnpm -
ํ๋ก์ ํธ์์ pnpm ๋ฒ์ ๊ณ ์ :
corepack use [email protected]โ
package.json์packageManager๊ฐ ๊ธฐ๋ก๋์ด ํ ์ ์ฒด๊ฐ ๊ฐ์ ๋ฒ์ ์ ์ฐ๊ธฐ ์ฌ์.
-
-
๊ธฐ๋ณธ ๋ช ๋ น์ด
- ์์กด์ฑ ์ค์น:
pnpm install - ํจํค์ง ์ถ๊ฐ:
pnpm add <pkg>(๊ฐ๋ฐ ์์กด์ฑ์D) - ์คํฌ๋ฆฝํธ ์คํ:
pnpm dev,pnpm build,pnpm lint(package.json scripts ๊ธฐ์ค)
- ์์กด์ฑ ์ค์น:
| ํญ๋ชฉ | pnpm | npm | Yarn |
|---|---|---|---|
| ์ค์น/์ฉ๋ ํจ์จ | ์ ์ญ ์ ์ฅ์(๊ณต์ฉ) ํ์ฉ์ผ๋ก ์ค๋ณต ์ค์น ๋ญ๋น๋ฅผ ์ค์ด๋ ๋ฐฉํฅ | ํ๋ก์ ํธ๋ณ ์ค์น ์ค์ฌ(์ค๋ณต์ด ์๊ธฐ๊ธฐ ์ฌ์) | ์ค์ /๋ฒ์ ์ ๋ฐ๋ผ ์ ๋ต์ด ๋ค๋ฆ(ํ๋ก์ ํธ ํ์ค์ ์์กด) |
| ์์กด์ฑ โ์๊ฒฉํจโ | ์ ์ธํ ์์กด์ฑ ์ค์ฌ์ผ๋ก ๋ ์๊ฒฉํ ๊ตฌ์กฐ ์งํฅ โ ์จ์ ์์กด์ฑ ์ค์ ๋ฐฉ์ง์ ์ ๋ฆฌ | ๋น๊ต์ ๊ด๋ํ ํธ์ด๋ผ ์ค์๊ฐ ๋ฆ๊ฒ ๋๋ฌ๋ ์ ์์ | PnP ๋ฑ ์ ํ์ง๋ก ์๊ฒฉํ๊ฒ ๋ง๋ค ์ ์์ผ๋ ํ ํฉ์/ํ์ต์ด ํ์ํ ์ ์์ |
| ํ/CI ์ฌํ์ฑ | lockfile ๊ธฐ๋ฐ ์ฌํ์ ์ด์ | lockfile ๊ธฐ๋ฐ์ด์ง๋ง ํ๊ฒฝ ์ฐจ์ด ๊ด๋ฆฌ๊ฐ ๊ณผ์ ๊ฐ ๋ ์ ์์ | lockfile ๊ธฐ๋ฐ, ๋ค๋ง ์กฐ์ง/๋ ํฌ ํ์ค์ ๋ฐ๋ผ ํธ์ฐจ |
-
์ค์น/์ฉ๋ ํจ์จ
-
npm/Yarn์ ํ๋ก์ ํธ๋ณ
node_modules๊ตฌ์กฐ ํน์ฑ์ ๊ฐ์ ํจํค์ง๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ด๋ ค๋ฐ์ ์ ์ฅํ๋ ์ํฉ์ด ๋ฐ๋ณต๋๊ธฐ ์ฌ์, ์์กด์ฑ์ด ๋์ด๋ ์๋ก ์ค์น ์๊ฐ๊ณผ ๋์คํฌ ์ฌ์ฉ๋์ด ๋์ ๋ ๊ฐ๋ฅ์ฑ์ด ํผโ๏ธ ๋ฐ๋ฉด pnpm์ ๊ณต์ฉ ์ ์ฅ์(content-addressable store)์ ํจํค์ง๋ฅผ ํ ๋ฒ ์ ์ฅํ๊ณ ํ๋ก์ ํธ์์๋ ๋งํฌ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ด๋ผ, ํ ํ๋ก์ ํธ์์ ๋ฐ๋ณต ์ค์น ๋น์ฉ์ด ์ค์ด๋ค๊ณ ๋ก์ปฌยทCI ํ๊ฒฝ ๋ชจ๋์์ ํจ์จ์ด ์ข์์ง ์ ์์
-
-
์์กด์ฑ ์ค๋ฅ๋ฅผ ๋นจ๋ฆฌ ๋๋ฌ๋ด๋ ๊ตฌ์กฐ
-
npm/Yarn(์ผ๋ฐ์ ์ธ node_modules ๊ตฌ์ฑ)์์๋ ๊ฐ์ ์ ์ผ๋ก ์ค์น๋ ํจํค์ง๊ฐ ์ฐ์ฐํ ์ ๊ทผ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ์์ด, ์ค์ ๋ก๋ ์ ์ธ๋์ง ์์ ์์กด์ฑ์ ๊ธฐ๋๋ ์ฝ๋๊ฐ ๋ฆ๊ฒ ๋ฐ๊ฒฌ๋ ์ ์์
โ๏ธ ๋ฐ๋ฉด pnpm์ ์ ์ธํ ์์กด์ฑ ์ค์ฌ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ ๋ ์๊ฒฉํ ์ค์น ๊ตฌ์กฐ๋ฅผ ์งํฅํ๋ฏ๋ก, ์จ์ ์์กด์ฑ/๋ชจ๋ ํด์ ๋ฌธ์ ๋ฅผ ๊ฐ๋ฐ ์ด๊ธฐ์ ๋๋ฌ๋ด๋ ๋ฐ ์ ๋ฆฌํจ
-
-
CI/๋ฐฐํฌ ์ฌํ์ฑ
-
npm/Yarn๋ lockfile์ ์ ๊ณตํ์ง๋ง, ํ์ด ์ฌ์ฉํ๋ ๋ฒ์ /ํ๊ฒฝ ์ฐจ์ด์ ๋ฐ๋ผ ์ค์น ๊ฒฐ๊ณผ๋ฅผ ๋์ผํ๊ฒ ์ ์งํ๊ธฐ ์ํด ์ถ๊ฐ ๊ด๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์
โ๏ธ ๋ฐ๋ฉด pnpm์ lockfile ๊ธฐ๋ฐ ์ฌํ์ฑ์ ์ด์ ์ ๋๊ณ , ์ค์น ๊ตฌ์กฐ๊ฐ ๋น๊ต์ ์ผ๊ด๋๊ฒ ์ ์ง๋๋ ํธ์ด๋ผ CI์์ ๊ฒฐ๊ณผ๋ฅผ ๊ณ ์ ํ๊ธฐ์ ์ ๋ฆฌํ๋ฉฐ, ๋ฐฐํฌ/๊ณผ์ ํ๊ฒฝ์์ ์์ธก ๋ถ๊ฐ๋ฅํ ์์กด์ฑ ์ด์๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋จ
-
- v10.27.0
- 2025๋ 12์ 30์ผ์ ๋ฆด๋ฆฌ์ฆ
- ์ด์
- pnpm์ ๋ฉ์ด์ ๋ฒ์ ๋ด์์ ํจ์น ๋ฒ์ ์ ์ต์ ์ผ๋ก ์ ์งํ๋ ๋ฐฉ์์ด ์ผ๋ฐ์ ์ผ๋ก ์์ ์ ์ด๋ฉฐ(๋ฒ๊ทธ ์์ /๊ฐ์ ๋ฐ์), v10.27.0์ pnpm ๊ณต์ ๋ฆด๋ฆฌ์ฆ๋ก ์ ๊ณต๋๋ ๋ฒ์ ์
- ๋ฐ๋ผ์ Devths์์๋ ๋ฉ์ด์ ๋ฒ์ (10.x)์ ์ ์งํ๋, ์ต์ ์์ ํจ์น(v10.27.0) ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ์ฌ ์ค์น/CI/์ด์ ๊ณผ์ ์์์ ์์ ์ฑ์ ํ๋ณดํ๋ ์ ๋ต์ ์ฑํํจ
- Devths๋ ํ๋ก ํธ์๋ ์์กด์ฑ์ด ์ปค์ง ๊ฐ๋ฅ์ฑ์ด ๋์ ํ๋ก์ ํธ์ด๋ฏ๋ก, ์ค์น ํจ์จ(์๋/์ฉ๋)๊ณผ ํ ๋จ์ ์ฌํ์ฑ(๋ฒ์ ๊ณ ์ /CI ์์ ์ฑ)์ ๋์์ ํ๋ณดํ๋ ๊ฒ์ด ์ค์ํจ
- ์ด์ ๋ฐ๋ผ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ๋ก pnpm(ํ๋ก์ ํธ ๋ฒ์ ๊ณ ์ ํฌํจ)์ ์ฑํํ๋ ๊ฒ์ด ์ ์ ํ๋ค๊ณ ํ๋จํจ
Devths๋ Next.js 16์ ์ฐ๋ ์ ์ ๋ก, ๋ฒ๋ค๋ฌ๋ ๋ณ๋ ์ค์น๊ฐ ์๋๋ผ Next.js์ ๋ด์ฅ๋ Turbopack์ ์ฌ์ฉํ๋ค๊ณ ์ฐ๋ฉด ์์ฐ์ค๋ฌ์
-
Next.js ๋ด์ฅ ๋ฒ๋ค๋ฌ(๊ธฐ๋ณธ๊ฐ)
- Next.js 16์์ Turbopack์ด ๊ธฐ๋ณธ ๋ฒ๋ค๋ฌ๊ฐ ๋์ด, ๋ณ๋ ํ๋๊ทธ ์์ด๋ ๊ฐ๋ฐ/๋น๋์์ ์ฌ์ฉ๋จ
-
๊ฐ๋ฐ ๊ฒฝํ(DX) ์ต์ ํ: ๋น ๋ฅธ dev ์๋ฒ/๊ฐฑ์
- ๋น ๋ฅธ ๊ฐ๋ฐ ์๋ฒ ์์, ์ฝ๋ ๋ณ๊ฒฝ ์ ๋น ๋ฅธ ๋ฆฌํ๋ ์(๊ฐ๋ฐ ์ํฌํ๋ก์ฐ ๊ฐ์ )๋ฅผ ๋ชฉํ๋ก ์ค๊ณ๋จ
-
ํ๋ก๋์
๋น๋๊น์ง ์ง์ ๋ฒ์ ํ๋
- Next.js 15.5๋ถํฐ
next build์ง์์ด ๋ฒ ํ๋ก ๋ค์ด๊ฐ๊ณ , Next.js 16์์๋ dev/build ๋ชจ๋ โ๊ธฐ๋ณธโ ํ๋ฆ์ผ๋ก ์ ๋ฆฌ๋จ
- Next.js 15.5๋ถํฐ
-
Webpack loader ์ค์ ์ ๋ ์์กด
- Next.js์ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ๋ฒ์(CSS/JS ์ปดํ์ผ ๋ฑ)๋ Turbopack์์ ๋ก๋ ์ค์ ์์ด๋ ๋์ํ๋๋ก ์๋ด๋จ
-
(1) ํ๋ฉด/๊ธฐ๋ฅ์ด ๋ง์ ๊ฐ๋ฐ ์ค ์์ ยท๊ฒ์ฆ ์ฌ์ดํด์ด ๋งค์ฐ ์์ฃผ ๋ฐ์
-
์บ๋ฆฐ๋(์/์ฃผ ๋ทฐ ์ ํ), ๊ฒ์ํ(๋ฌดํ์คํฌ๋กค), ์ฑํ (์ค์๊ฐ UI), OCR ์ ๋ก๋/๋ชจ๋ฌ ๋ฑ์ ๊ฐ๋ฐ ์ค ๋ณ๊ฒฝ์ด ์ฆ์
โ Turbopack์ ๊ฐ๋ฐ ์ํฌํ๋ก์ฐ ์๋ ๊ฐ์ ์ ํต์ฌ ๋ชฉํ๋ก ํ๊ณ , Next 16.1์์๋ Turbopack/ํด๋ง ๊ฐ์ ์ ๊ฐ์กฐํจ
-
-
(2) Next.js 16์ ํ์ค(๊ธฐ๋ณธ) ๋ฒ๋ค๋ฌ๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด ํ ๊ท์น์ด ๋จ์ํด์ง
- ๋ฐ๋ก
-turbopackํ๋๊ทธ๋ฅผ ๊ด๋ฆฌํ์ง ์์๋ ๋๊ณ , Next.js ์ ๊ทธ๋ ์ด๋ ๊ฐ์ด๋์์๋ โ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉโ์ ์ ์ ๋ก ์ค๋ช ๋จ
- ๋ฐ๋ก
๊ธฐ๋ณธ ์ฌ์ฉ(Next.js 16)
-
pnpm devโ ๋ด๋ถ์ ์ผ๋กnext dev์คํ ์ Turbopack์ด ๊ธฐ๋ณธ ์ ์ฉ -
pnpm buildโnext build๋ ๊ธฐ๋ณธ์ผ๋ก Turbopack ์ฌ์ฉ
| ํญ๋ชฉ | Turbopack (Next.js ๊ธฐ๋ณธ) | Webpack (Next.js์์ --webpack) |
Vite (์ผ๋ฐ์ ์ผ๋ก Vite + React) |
|---|---|---|---|
| Next.js ํตํฉ | Next์ ๋ด์ฅ, ๊ธฐ๋ณธ ๋ฒ๋ค๋ฌ | Next์์ ์ ํ์ ์ผ๋ก ์ฌ์ฉ | Next ํ๋ ์์ํฌ ๋์ฒด(๋ณ๋ ๋ผ์ฐํ /SSR ๊ตฌ์ฑ ํ์) |
| ์ค์ ๋์ด๋ | ๊ณตํต ์ผ์ด์ค โ๋ฌด์ค์ โ์ ๊ฐ๊น์ | ํ์ํ ์ค์ /ํ๋ฌ๊ทธ์ธ ์กฐํฉ์ด ๋ ์ ์์ | ๋น ๋ฅด๊ฒ ์์ ๊ฐ๋ฅํ์ง๋ง ์ฑ ๊ตฌ์กฐ ์ปค์ง๋ฉด ์กฐํฉ ์ค๊ณ ๋ถ๋ด |
| ๊ฐ๋ฐ ์ฒด๊ฐ ์๋ ๋ชฉํ | ๋๊ท๋ชจ ์ฑ์์ ๋น ๋ฅธ dev ๊ฒฝํ์ ๋ชฉํ๋ก ์ค๊ณ | ํ์ค/์ฑ์, ๋ค๋ง dev ์๋๋ ํ๋ก์ ํธ์ ๋ฐ๋ผ ๋ถ๋ด | dev ์๋ฒ ๋น ๋ฅธ ํธ(๋จ, Next ๊ธฐ๋ฅ์ ์ง์ ๋ถ์ฌ์ผ ํจ) |
| ํธํ์ฑ/ํ์ฅ | Next ๊ณตํต ์ฌ์ฉ์ ์ ์ง์, ๋ค๋ง ์ผ๋ถ๋ โwebpack ๋๋น ๊ฐญโ ์กด์ฌ(์: webpack ํ๋ฌ๊ทธ์ธ) | webpack ์ํ๊ณ(๋ก๋/ํ๋ฌ๊ทธ์ธ) ํ์ฉ ํญ์ด ํผ | ๋ฒ๋ค๋ฌ ์์ฒด ์ํ๊ณ๋ ํ๋ถํ์ง๋ง Next์ SSR/๋ผ์ฐํ ์ ๋ณ๋ ์ค๊ณ |
| ์ถ์ฒ ์ํฉ | Next.js ํ์ค ํ๋ฆ(์ค์ ์ ๊ฒ, ๋น ๋ฅธ dev) | webpack ํ๋ฌ๊ทธ์ธ/ํน์ ๋ก๋๊ฐ ๊ผญ ํ์ํ ๋ | Next๊ฐ ์๋๋ผ SPA ์ค์ฌ์ผ๋ก ๊ฐ๋ณ๊ฒ ๊ตฌ์ฑํ ๋ |
-
Next.js ํ์ค ํ๋ฆ ์ ์ง(ํตํฉ์ฑ)
-
Webpack(Next์์ --webpack)์ ํน์ ๋ก๋/ํ๋ฌ๊ทธ์ธ ์๊ตฌ๊ฐ ์๊ธฐ๋ฉด ์ปค์คํ ์ค์ ์ด ๋์ด๋ ์ ์๊ณ , ์ค์ ์ด ๋์ด๋ ์๋ก Next ๊ธฐ๋ณธ ์ต์ ํ/์ ๋ฐ์ดํธ ํ๋ฆ๊ณผ ์ถฉ๋ํ๊ฑฐ๋ ์ ์ง๋ณด์ ํฌ์ธํธ๊ฐ ์ฆ๊ฐํ ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ ๋ฐ๋ฉด Turbopack(Next.js ๊ธฐ๋ณธ)์ Next์ ๋ด์ฅ๋ ๊ธฐ๋ณธ ๋ฒ๋ค๋ฌ๋ก ๋์ํ๋ฏ๋ก, ํ๋ ์์ํฌ๊ฐ ์๋ํ ๊ฐ๋ฐยท๋น๋ ํ์ดํ๋ผ์ธ์ ๊ทธ๋๋ก ๋ฐ๋ฅด๊ธฐ ์ฌ์ ํตํฉ ๊ด์ ์ ๋ฆฌ์คํฌ(์ค์ ์ถฉ๋/์ถ๊ฐ ๊ด๋ฆฌ)๋ฅผ ์ค์ด๋ ๋ฐ ์ ๋ฆฌํจ
-
-
๊ฐ๋ฐ ์์ฐ์ฑ(๊ฐ๋ฐ ์ฒด๊ฐ ์๋) ์ค์ฌ์ ์ ํ
-
Webpack์ ํ์ค์ ์ด์ง๋ง, ํ๋ก์ ํธ ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ๊ฐ๋ฐ ์๋ฒ ์ฒด๊ฐ ์๋(์ฌ๋น๋/ํซ๋ฆฌ๋ก๋)๊ฐ ๋ถ๋ด์ด ๋ ์ ์์ผ๋ฉฐ, ์๋ ์ด์๊ฐ ๋ฐ์ํ๋ฉด ์ต์ ํ ์์ ์ด ๋ณ๋ ๊ณผ์ ๊ฐ ๋ ์ ์์
โ๏ธ Turbopack์ ๋๊ท๋ชจ ์ฑ์์ ๋น ๋ฅธ ๊ฐ๋ฐ ๊ฒฝํ์ ๋ชฉํ๋ก ์ค๊ณ๋ Next ๊ธฐ๋ณธ ์ ํ์ง์ด๋ฏ๋ก, ์ด๊ธฐ๋ถํฐ ์ค์ ๋น์ฉ ์์ด ๊ฐ๋ฐ ์์ฐ์ฑ์ ํ๋ณดํ๋ ๋ฐฉํฅ์ ๋ ์ ํฉํจ
-
-
ํ๋ก์ ํธ ํ์ฅ ์ ๋์ ๋น์ฉ(์ค๊ณยท์ด์ ๋ถ๋ด) ์ต์ํ
-
Vite(์ผ๋ฐ์ ์ผ๋ก Vite + React)๋ dev ์๋ฒ๊ฐ ๋น ๋ฅด๊ณ ์์์ด ๊ฐ๋ณ์ง๋ง, Next์ ๋ผ์ฐํ /SSR/SSG/์๋ฒ ๊ธฐ๋ฅ์ ํ๋ ์์ํฌ ์ฐจ์์์ ์ ๊ณตํ์ง ์๊ธฐ ๋๋ฌธ์, ๊ฐ์ ๋ชฉ์ ์ ๋ฌ์ฑํ๋ ค๋ฉด ๋ณ๋ ์กฐํฉ ์ค๊ณ(๋ผ์ฐํ , SSR ์ ๋ต, ์๋ฌ ์ฒ๋ฆฌ, ๋ฐฐํฌ ๊ตฌ์กฐ ๋ฑ)๊ฐ ํ์ํด์ง ์ ์์
โ๏ธ Devths๋ Next.js ๊ธฐ๋ฐ์ผ๋ก ๊ธฐ๋ฅ ํ์ฅ์ด ์์๋๋ ๊ตฌ์กฐ์ด๋ฏ๋ก, ๋ฒ๋ค๋ฌ๋ Next ๋ด์ฅ ๊ธฐ๋ณธ๊ฐ(Turbopack)์ ์ฑํํด ํ๋ ์์ํฌ ์ ๊ณต ๊ธฐ๋ฅ + ๋ฒ๋ค๋ฌ๋ฅผ ํ ํ๋ฆ์ผ๋ก ๋ฌถ๋ ๊ฒ์ด ํ์ฅ/์ ์ง๋ณด์ ๊ด์ ์์ ํฉ๋ฆฌ์ ์
-
- devths๋ Next.js ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉด๊ณผ ๊ธฐ๋ฅ์ด ํ์ฅ๋๋ ๊ตฌ์กฐ์ด๋ฏ๋ก, Next.js์ ๊ธฐ๋ณธ์ผ๋ก ํตํฉ๋ Turbopack์ ์ฌ์ฉํด ๊ฐ๋ฐ ๊ฒฝํ์ ํ์คํํ๋ ๊ฒ์ด ์ ์ ํจ
-
์คํค๋ง ๊ธฐ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ
- ์ด ๋ฐ์ดํฐ๋ ์ด๋ฐ ํํ์ฌ์ผ ํ๋ค๋ฅผ ์คํค๋ง(schema) ๋ก ์ ์ํ๊ณ , ์ ๋ ฅ๊ฐ/์๋ต๊ฐ์ด ๊ทธ ๊ท์น์ ๋ง์กฑํ๋์ง ๊ฒ์ฌํจ
-
TypeScript์ ๊ฐํ๊ฒ ์ฐ๊ฒฐ๋จ (ํ์ ์ถ๋ก )
-
z.object({...})๋ก ์คํค๋ง๋ฅผ ๋ง๋ค๋ฉด, ๊ทธ ์คํค๋ง์์ ํ์ ์ ์๋์ผ๋ก ๋ฝ์(z.infer) ํ๋ก ํธ ์ ๋ฐ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅโ โ๊ฒ์ฆ ๊ท์นโ๊ณผ โํ์ โ์ด ๋ฐ๋ก ๋์ง ์์(๋๊ธฐํ๋จ)
-
-
๋ฐํ์ ๊ฒ์ฆ ๊ฐ๋ฅ
- TypeScript๋ ์ปดํ์ผ ๋จ๊ณ์์๋ง ์ฒดํฌํ์ง๋ง, Zod๋ ์ค์ ์คํ ์ค(๋ฐํ์)์ ๋ค์ด์จ ๊ฐ์ ๊ฒ์ฌํด์ ์๋ฒ ์๋ต/์ธ๋ถ ์ ๋ ฅ์ ์ด์๊ฐ์ ๋ง์ ์ ์์
-
์๋ฌ ๋ฉ์์ง ๊ตฌ์กฐํ
- ์ด๋ค ํ๋๊ฐ ์ ์คํจํ๋์ง ์๋ฌ ์ ๋ณด๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ์ป์ ์ ์์ด, ํผ ์๋ฌ UI์ ์ฐ๊ฒฐํ๊ธฐ ์ข์
-
safeParse๋ก ์์ ํ๊ฒ ์ฒ๋ฆฌ- ์์ธ๋ฅผ ๋์ง๋ ๋์ ์ฑ๊ณต/์คํจ๋ฅผ ๊ฐ์ฒด๋ก ๋ฐํํด, ์คํจ ์ผ์ด์ค๋ฅผ ์์ ์ ์ผ๋ก ๋ถ๊ธฐ ์ฒ๋ฆฌํ๊ธฐ ์ฌ์
Devths๋ ํผ ์ ๋ ฅ + ํ์ผ ์ ๋ก๋ + AI/OCR ๊ฒฐ๊ณผ + ์ค์๊ฐ/๋ชฉ๋ก ๋ฐ์ดํฐ์ฒ๋ผ ์ธ๋ถ์์ ๋ค์ด์ค๋ ๋ฐ์ดํฐ๊ฐ ๋ง์์, ํด๋ผ์ด์ธํธ์์ ๋ฐ์ดํฐ ํํ๋ฅผ ํ์คํ ๊ณ ์ ํด๋๋ ๊ฒ ์ค์ํจ.
(1) ํผ์ด ๋ง์ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ์ด ๋ฐ๋ณต๋จ
-
๋ก๊ทธ์ธ/ํ์๊ฐ์ , ํ๋กํ ์์ , ๊ฒ์๊ธ ์์ฑ, ํ์ผ ์ ๋ก๋ ๋ฑ
โ Zod๋ก ์คํค๋ง๋ฅผ ๊ณตํตํํ๋ฉด ํผ๋ง๋ค ๊ฒ์ฆ ๊ท์น์ ์ค๋ณต์ผ๋ก ๊ตฌํํ์ง ์๊ณ ์ผ๊ด๋ ๊ธฐ์ค์ ์ ์ฉํ ์ ์์
(2) ์๋ฒ ์๋ต์ด ํญ์ โ์ ์โ์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉด ์ํํจ
-
๊ฒ์๊ธ ๋ชฉ๋ก, ๋๊ธ, ์บ๋ฆฐ๋ ์ด๋ฒคํธ, ์ฑํ ๋ฐฉ ๋ชฉ๋ก ๋ฑ์ API ์๋ต ๊ตฌ์กฐ๊ฐ ์กฐ๊ธ๋ง ๋ฐ๋์ด๋ ํ๋ฉด์ด ๊นจ์ง ์ ์์
โ Zod๋ก ์๋ต์ ๋ฐํ์์์ ๊ฒ์ฆํ๋ฉด ์กฐ์ฉํ ๊นจ์ง๋ ๋ฒ๊ทธ๋ฅผ ์ค์ด๊ณ , ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๋น ๋ฅด๊ฒ ๊ฐ์ง ๊ฐ๋ฅ
(3) OCR/AI ๊ฒฐ๊ณผ๋ ํนํ ๋ถํ์คํ ์ ๋ ฅ
-
๋ ์ง/์๊ฐ/์ฅ์๊ฐ ๋๋ฝ๋๊ฑฐ๋ ํ์์ด ์ ๋งคํ ๊ฐ์ด ๋ค์ด์ฌ ์ ์์
โ Zod๋ก โ์ต์ํ ์ด ํ๋๋ ์์ด์ผ ํ๋ค/์์ผ๋ฉด ๋ณด์ UI๋ก ์ ๋โ ๊ฐ์ ๊ท์น์ ๋ง๋ค๊ธฐ ์ข์
| ํญ๋ชฉ | Zod | Yup | Joi |
|---|---|---|---|
| TypeScript ๊ถํฉ | ์คํค๋ง์์ ํ์ ์ถ๋ก ์ค์ฌ์ด๋ผ TS์ ๊ฒฐํฉ์ด ์์ฐ์ค๋ฌ์ | TS ์ฌ์ฉ์ ๊ฐ๋ฅํ์ง๋ง ํ์ ์ถ๋ก ์ด Zod๋งํผ ์์ฐ์ค๋ฝ๊ฒ ์คํค๋ง=ํ์ ์ผ๋ก ์ด์ด์ง์ง ์๋ ํธ | ์ฃผ๋ก ๋ฐํ์ ๊ฒ์ฆ ์ค์ฌ์ด๋ฉฐ ํ๋ก ํธ TS ํ์ ํ๋ฆ๊ณผ ์ผ์ฒดํ๋ ์ถ๊ฐ ์์ ์ด ํ์ํ ์ ์์ |
| ๊ท์น ๊ด๋ฆฌ ๋ฐฉ์ | ๊ฒ์ฆ ๊ท์น์ ์คํค๋ง๋ก ๊ณ ์ ํ๊ณ ์ฌ์ฌ์ฉํ๊ธฐ ์ข์ | ์คํค๋ง ๊ธฐ๋ฐ์ด์ง๋ง ํ๋ก์ ํธ๋ง๋ค ํ์ ยท๊ฒ์ฆ ๋๊ธฐํ ์ ๋ต์ ๋ฐ๋ก ์ก๋ ๊ฒฝ์ฐ๊ฐ ์์ | ๊ฐ๋ ฅํ ๊ฒ์ฆ ๊ธฐ๋ฅ์ด ์์ง๋ง ํ๋ก ํธ ํผ ์ค์ฌ ์ด์์์๋ ๋ค์ ๋ฌด๊ฒ๊ฒ ๋๊ปด์ง ์ ์์ |
| Devths ์ ํฉ ํฌ์ธํธ | ํผ/์ ๋ ฅ ๊ท์น์ด ๋ง๊ณ , TS ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์กฐ๋ฅผ ํ์คํํ๊ณ ์ถ์ ๋ ์ ๋ฆฌ | ๊ธฐ์กด Yup ๊ธฐ๋ฐ ๋ ๊ฑฐ์/ํ ๊ฒฝํ์ด ๋ง๋ค๋ฉด ํ๋ณด | ๊ฒ์ฆ ์คํ์ด ๋งค์ฐ ๋ณต์กํ๊ณ ๋ฐํ์ ๊ฒ์ฆ์ ๊ฐํ๊ฒ ๊ฐ์ ธ๊ฐ์ผ ํ ๋ ํ๋ณด |
-
TypeScript์์ ๊ฒฐํฉ(์คํค๋ง=ํ์ ํ๋ฆ)
-
Yup์ TypeScript ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง, ์คํค๋ง๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ๊ทธ๊ฒ ๊ณง๋ฐ๋ก ํ๋ก ํธ ํ์ ์ ๊ทผ๊ฑฐ๋ก ์์ฐ์ค๋ฝ๊ฒ ์ด์ด์ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์์ด, ํ์ ๊ณผ ๊ฒ์ฆ ๊ท์น์ด ๋ฐ๋ก ๋ ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ ๋ฐ๋ฉด Zod๋ ์คํค๋ง์์ ํ์ ์ ์ถ๋ก ํ๋ ํ๋ฆ์ด ์ค์ฌ์ด๋ผ, ๊ฒ์ฆ ๊ท์น(์คํค๋ง)๊ณผ TypeScript ํ์ ์ ํ ๋ฉ์ด๋ฆฌ๋ก ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ , ํ๋ ๋๋ฝ/nullable ์ฐฉ๊ฐ/ํ์ ๋ถ์ผ์น ๊ฐ์ ์ค์ ๋น์ฉ์ ์ค์ด๋ ๋ฐ ์ ๋ฆฌํจ
-
-
๊ท์น์ ํ์คํ ๋ฐ ์ฌ์ฌ์ฉ(์ ์ฑ ์ ์ฝ๋๋ก ๊ณ ์ )
-
Yup๋ ์คํค๋ง ๊ธฐ๋ฐ์ด์ง๋ง, ํ๋ก์ ํธ์์ ํ์ ยท๊ฒ์ฆ์ ์ด๋ป๊ฒ ๋๊ธฐํํ ์ง๋ฅผ ๋ณ๋ ์ ๋ต์ผ๋ก ์ก์์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์์ด, ํ๋ฉด์ด ๋์ด๋๋ฉด ๊ท์น ๊ด๋ฆฌ๊ฐ ํ ์ปจ๋ฒค์ ์ ๋ ์์กดํ ์ ์์
โ๏ธ Zod๋ ์คํค๋ง๋ฅผ ๋ง๋ค๋ฉด ๊ทธ ์์ฒด๊ฐ ํ์ ๊ณผ ๊ฒ์ฆ์ ๊ธฐ์ค์ด ๋๊ธฐ ์ฌ์, ํ์๊ฐ์ /๊ฒ์๊ธ/๋๊ธ/์ผ์ /๊ฒ์/ํ์ผ ์ ๋ก๋์ฒ๋ผ ์ ๋ ฅ ๊ท์น์ด ๋ฐ๋ณต๋๋ Devths์์ ๊ท์น์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฌ์ฉํ๊ธฐ ์ข์
-
-
ํ๋ก ํธ ํผ ์ด์ ์ ํฉ์ฑ
-
Joi๋ ๋ฐํ์ ๊ฒ์ฆ ๊ธฐ๋ฅ์ด ๊ฐ๋ ฅํ์ง๋ง, ํ๋ก ํธ ํผ ์ค์ฌ์ผ๋ก ์ฌ์ฉํ๊ธฐ์ ์๋์ ์ผ๋ก ๋ฌด๊ฒ๊ฒ ๋๊ปด์ง ์ ์๊ณ , TypeScript ํ์ ํ๋ฆ๊ณผ ์์ ํ ์ผ์ฒดํํ๋ ค๋ฉด ์ถ๊ฐ ์์ ์ด ๋ค์ด๊ฐ ์ ์์
โ๏ธ Zod๋ ํ๋ก ํธ์์ ์ ๋ ฅ๊ฐ ๊ฒ์ฆ + ํ์ ์ ํฉ์ฑ ์ ์ง ๋ชฉ์ ์ ๋ง๊ฒ ๊ฐ๋ณ๊ณ ์ง๊ด์ ์ผ๋ก ์ ์ฉ ๊ฐ๋ฅํด, Devths์ฒ๋ผ ํผ์ด ๋ง์ ์๋น์ค์์ ์ด์ ๋ถ๋ด์ด ๋ฎ์
-
- Zod v4.3.4
- 2026๋ 1์ 2์ผ ๋ฆด๋ฆฌ์ฆ
- ์ด์
- v4 ๋ผ์ธ์ ํ์ฌ ๋ฌธ์/์ํ๊ณ ํ๋ฆ์ ๊ธฐ์ค์ผ๋ก ์ก๊ธฐ ์ข๊ณ , ์ต์ ํจ์น ๋ฒ์ ์ ์ฑํํ๋ฉด ๋ฒ๊ทธ ์์ ๋ฐ ์์ ์ฑ ๊ฐ์ ์ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ ์ง๋ณด์์ ์ ๋ฆฌํจ
- ์ด์ ์ ๋ต์ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ผํ๊ฒ ๋ฉ์ด์ (v4)๋ ์ ์ง, ํจ์น/๋ง์ด๋๋ ์ ๊ธฐ ๋ฐ์ํจ
- Devths๋ ์ ๋ ฅ/ํผ์ด ๋ง๊ณ ๊ฒ์ฆ ๊ท์น์ด ์ธ๋ฐํด์ง ๊ฐ๋ฅ์ฑ์ด ํฐ ์๋น์ค์ด๋ฏ๋ก, ๊ฒ์ฆ ๊ท์น์ ์คํค๋ง๋ก ํ์คํํ๊ณ TypeScript ํ์ ๊น์ง ํจ๊ป ์ ๋ฆฌํ ์ ์๋ Zod๋ฅผ ์ฑํํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ฑ๊ณผ ์์ ์ฑ ์ธก๋ฉด์์ ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ํ๋จํจ
-
ํผ(Form) ์ํ ๊ด๋ฆฌ๋ฅผ ๊ฐ๋จํ๊ฒ
- ์ ๋ ฅ๊ฐ(value), ์๋ฌ(errors), ์ ์ถ(submit), ๋ก๋ฉ ์ํ ๋ฑ์ ํผ ๋จ์๋ก ํ ๋ฒ์ ๊ด๋ฆฌํ ์ ์์
-
register,handleSubmit,formState๊ฐ์ ๊ธฐ๋ณธ API๋ก ํ๋ฆ์ด ๋จ์ํจ
-
๋ฆฌ๋ ๋๋ง์ด ์ ์ด์ ์ฑ๋ฅ์ ์ ๋ฆฌ
- ์ ๋ ฅํ ๋๋ง๋ค ์ ์ฒด ์ปดํฌ๋ํธ๊ฐ ๊ณ์ ๋ฆฌ๋ ๋๋๋ ๋ฐฉ์์ด ์๋๋ผ, ํผ ์ํ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ค๋ค์ ์ ๋ ฅ ํ๋๊ฐ ๋ง์๋ ์ฑ๋ฅ์ด ๋น๊ต์ ์์ ์ ์
-
๊ฒ์ฆ(Validation) ์ฐ๊ฒฐ์ด ์ฌ์
- ๊ธฐ๋ณธ ๊ฒ์ฆ(required/minLength ๋ฑ)๋ ๊ฐ๋ฅํ๊ณ ,
- Zod ๊ฐ์ ์คํค๋ง ๊ฒ์ฆ๋ resolver๋ก ์ฝ๊ฒ ์ฐ๊ฒฐ ๊ฐ๋ฅ โ ํ ๊ณณ์์ ๊ท์น ๊ด๋ฆฌ ๊ฐ๋ฅ
-
์๋ฌ ๋ฉ์์ง/UI ์ฐ๊ฒฐ์ด ๊น๋ํจ
-
errors.email?.message์ฒ๋ผ ํ๋๋ณ ์๋ฌ๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ์ ๊ทผํ ์ ์์ด, ์ ๋ ฅํผ UI(์๋ฌ ํ ์คํธ/๋นจ๊ฐ ํ ๋๋ฆฌ) ๋ถ์ด๊ธฐ ์ฌ์
-
-
๋ณต์กํ ํผ ๊ธฐ๋ฅ ์ง์
- ๋์ ํ๋(์ถ๊ฐ/์ญ์ )
useFieldArray - ํน์ ๊ฐ ๊ฐ์
watch - ์ปค์คํ
- ๋์ ํ๋(์ถ๊ฐ/์ญ์ )
Devths๋ ์ ๋ ฅ ํผ์ด ๋ง์ ์๋น์ค๋ผ์, ํผ ์ฒ๋ฆฌ ๋ฐฉ์์ด ํ์คํ๋์ง ์์ผ๋ฉด ํ์ด์ง๋ง๋ค ๊ตฌํ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๊ณ ๋ฒ๊ทธ๊ฐ ๋์ด๋๊ธฐ ์ฌ์.
- React Hook Form์ ๋์ ํ๋ฉด ํผ ์ ๋ ฅ โ ๊ฒ์ฆ โ ์๋ฌ ํ์ โ ์ ์ถ ํ๋ฆ์ ๊ณตํต ํจํด์ผ๋ก ํต์ผํ ์ ์์
(1) ํผ์ด ๋ง์ ์๋น์ค ๊ตฌ์กฐ
- ๋ก๊ทธ์ธ/ํ์๊ฐ์
- ํ๋กํ ์์ (๋๋ค์/๋น๋ฐ๋ฒํธ/์ด๋ฏธ์ง)
- ๊ฒ์๊ธ ์์ฑ/์์ (์ ๋ชฉ/๋ณธ๋ฌธ/ํ๊ทธ/์ฒจ๋ถ)
- ์บ๋ฆฐ๋ ์ผ์ ์ถ๊ฐ/์์ (์๊ฐ/์ฅ์/๋ฉ๋ชจ)
- OCR ๊ฒฐ๊ณผ ์ผ์ ์ด์(draft) ๊ฒํ /๋ณด์ ์ ๋ ฅ
โ ํผ์ด ๋ง์์๋ก โ๊ฒ์ฆ/์๋ฌ UI/์ ์ถ ๋ก์งโ์ ๋งค๋ฒ ์ง์ ์ง๋ฉด ์ค๋ณต์ด ์ปค์ง
โ RHF๋ก ๊ณตํต ํ๋ฆ์ ์ก์ผ๋ฉด ์ ์ง๋ณด์ ๋น์ฉ์ด ์ค์ด๋ฆ
(2) Zod์ ์กฐํฉํด์ โ๊ฒ์ฆ ๊ท์นโ์ ํ ๊ณณ์ ๋ชจ์ ์ ์์
-
Devths๋ ์ด๋ฏธ Zod๋ฅผ ์ฐ๋ ๋ฐฉํฅ์ด๋ฏ๋ก,
-
RHF + Zod resolver ์กฐํฉ์ด๋ฉด ํ์ /๊ฒ์ฆ/์๋ฌ๋ฉ์์ง๊ฐ ํ ๋ฉ์ด๋ฆฌ๋ก ๊ด๋ฆฌ๋จ
โ ํผ๋ง๋ค ๊ฒ์ฆ ๊ท์น์ด ๋ค์ญ๋ ์ญํด์ง๋ ๋ฌธ์ ๋ฅผ ์ค์
(3) OCR/AI ๊ฒฐ๊ณผ์ฒ๋ผ ๋ถ์์ ํ ์ ๋ ฅ์ ๋ณด์ ํ๋ UX์ ์ ํฉ
-
OCR์ด ๋ ์ง/์๊ฐ์ ๋ชป ๋ฝ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ์๊ฐ ์ง์ ์ฑ์ ๋ฃ๋ ํผ์ด ํ์ํจ
โ RHF๋ก ๋ถ๋ถ ์ ๋ ฅ + ์ฆ์ ๊ฒ์ฆ + ์ ์ฅ ํ๋ก์ฐ๋ฅผ ์์ ์ ์ผ๋ก ๋ง๋ค๊ธฐ ์ข์
| ํญ๋ชฉ | React Hook Form | Formik | React ๋จ๋ (useState๋ก ์ง์ ๊ตฌํ) |
|---|---|---|---|
| ํผ ์ํ ๊ด๋ฆฌ ๋ฐฉ์ | ํ์ํ ์ํ๋ฅผ ์ ํ์ ์ผ๋ก ๊ตฌ๋ ํ๋ ํจํด์ ๊ฐ์ | ํผ ์ํ๋ฅผ ํ ๋ฉ์ด๋ฆฌ๋ก ๋ค๋ฃจ๋ ๋ฐฉ์์ด ํํจ | ํ๋ฉด๋ง๋ค ์ ๊ฐ๊ฐ ๊ตฌํ๋ ๊ฐ๋ฅ์ฑ์ด ํผ |
| ๋ ๋๋ง/์ฑ๋ฅ ๊ด์ | ํฐ ํผ/์ ๋ ฅ ๋ง์ ๋ ๋ฆฌ๋ ๋๋ง ์ ์ด์ ์ ๋ฆฌ | ๊ท๋ชจ ์ปค์ง๋ฉด ์ต์ ํ๊ฐ ์ถ๊ฐ๋ก ํ์ํด์ง ์ ์์ | ์ต์ ํ/ํจํดํ ๋ชจ๋ ์ง์ ์ฑ ์ |
| ๊ฒ์ฆ ๋๊ตฌ ๊ฒฐํฉ | Zod ๋ฑ ์คํค๋ง ๊ฒ์ฆ๊ณผ ๊ฒฐํฉ ํจํด์ด ๋๋ฆฌ ์ฐ์ | Yup ์กฐํฉ์ด ํํ์ง๋ง ๊ตฌ์ฑ์ ๋ฐ๋ผ ๋ค๋ฆ | ๊ฒ์ฆ/์๋ฌ ๋งคํ ๋ก์ง์ ์ง์ ๋ค ๋ง๋ค์ด์ผ ํจ |
| Devths ์ ํฉ๋ | ์ ๋ ฅ ํ๋ฉด/๊ท์น์ด ๋ง์ ์๋น์ค์ ์ ํฉ | ํ์ด Formik ํ์ค์ ์ด๋ฏธ ์ฐ๋ฉด ํ๋ณด | ์ฅ๊ธฐ์ ์ผ๋ก ์ ์ง๋ณด์ ๋น์ฉ์ด ์ปค์ง๊ธฐ ์ฌ์ |
-
ํผ ์ํ ๊ด๋ฆฌ์ ํ์คํ(๊ตฌํ ๋ฐฉ์ ํ๋ค๋ฆผ ๋ฐฉ์ง)
-
**React ๋จ๋ (useState)**์ ํ๋ฉด๋ง๋ค ์ ๋ ฅ๊ฐ/์๋ฌ/ํฐ์น ์ฌ๋ถ/์ ์ถ ์ํ๋ฅผ ๊ฐ๊ฐ ์ง์ ๊ตฌํํด์ผ ํด์, ํ์ด์ง๊ฐ ๋์ด๋ ์๋ก ๊ตฌํ ๋ฐฉ์์ด ์ ๊ฐ๊ฐ์ด ๋๊ณ ๋๋ฝ(์: ์๋ฌ ํ์, ์ ์ถ ์ค ๋นํ์ฑ, ์ด๊ธฐํ)์ด ๋ฐ์ํ๊ธฐ ์ฌ์
โ๏ธ ๋ฐ๋ฉด React Hook Form์ ํผ ์ํ ๊ด๋ฆฌ ํ๋ฆ(๋ฑ๋ก, ์ ์ถ, ์๋ฌ ๊ด๋ฆฌ)์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ ๋ฒจ์์ ํ์คํํ๋ฏ๋ก, Devths์ฒ๋ผ ์ ๋ ฅ ํ๋ฉด์ด ๋ง์ ๊ตฌ์กฐ์์ ์ผ๊ด๋ ๊ตฌํ ํจํด์ ์ ์งํ๊ธฐ ์ ๋ฆฌํจ
-
-
๋ ๋๋ง/์ฑ๋ฅ ๊ด์
-
Formik์ ํผ ์ํ๋ฅผ ํ ๋ฉ์ด๋ฆฌ๋ก ๋ค๋ฃจ๋ ๋ฐฉ์์ด ํํด, ํผ์ด ์ปค์ง๊ฑฐ๋ ์ ๋ ฅ์ด ๋ง์์ง์๋ก ๋ฆฌ๋ ๋๋ง ์ต์ ํ๊ฐ ์ถ๊ฐ๋ก ํ์ํด์ง ์ ์์
โ๏ธ React Hook Form์ ํ์ํ ์ํ๋ง ์ ํ์ ์ผ๋ก ๊ตฌ๋ ํ๋ ํจํด์ ๊ฐ์ ์ด ์์ด, ํฐ ํผ/์ ๋ ฅ ์๊ฐ ๋ง์ ํ๋ฉด์์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ์ค์ด๋ ์ค๊ณ์ ์ ๋ฆฌํจ
-
-
๊ฒ์ฆ ๋๊ตฌ ๊ฒฐํฉ์ ๋ช ํ์ฑ
-
**React ๋จ๋ (useState)**์ ๊ฒ์ฆ ๋ก์ง๊ณผ ์๋ฌ ๋ฉ์์ง ๋งคํ์ ํ๋ฉด๋ง๋ค ์ง์ ๋ง๋ค์ด์ผ ํ๋ฏ๋ก, ๊ท์น์ด ๋ง์์ง์๋ก ์ค๋ณต๊ณผ ๋ถ์ผ์น๊ฐ ๋์ด๋ ๊ฐ๋ฅ์ฑ์ด ํผ
-
Formik์ Yup ์กฐํฉ์ด ํํ์ง๋ง, ํ๋ก์ ํธ ๊ตฌ์ฑ์ ๋ฐ๋ผ ๊ฒ์ฆ ํ๋ฆ์ด ๋ฌ๋ผ์ง ์ ์์ด ํ ์ปจ๋ฒค์ ์์กด์ด ์ปค์ง ์ ์์
โ๏ธ React Hook Form์ Zod ๊ฐ์ ์คํค๋ง ๊ฒ์ฆ๊ณผ ๊ฒฐํฉํ๋ ์ค๋ฌด ํจํด์ด ๋๋ฆฌ ์ ์ฐฉ๋์ด ์์ด, โํผ ์ ๋ ฅ โ ์คํค๋ง ๊ฒ์ฆ โ ์๋ฌ ๋งคํโ ํ๋ฆ์ ์์ ์ ์ผ๋ก ๊ณ ์ ํ๊ธฐ ์ข์
-
- v7.70.0
- 2026๋ 1์ 4์ผ์ ๋ฆด๋ฆฌ์ฆ๋จ
- ์ด์
- GitHub ๋ฆด๋ฆฌ์ฆ ๊ธฐ์ค์ผ๋ก v7.70.0์ด ์์ ๋ฆด๋ฆฌ์ฆ๋ก ๋ฐฐํฌ๋์ด ์์
- ํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฑ ์ ์ญ์ ์ํฅ์ด ํฌ๋ฏ๋ก(๋ชจ๋ ์ ๋ ฅ ํ๋ฉด์ ๊ฑธ๋ฆผ), ๋ฉ์ด์ ๋ฅผ ์์ฃผ ํ๋ค๊ธฐ๋ณด๋ค ๋ฉ์ด์ ๋ผ์ธ์ ๊ณ ์ ํ๊ณ ํจ์น ์ ๋ฐ์ดํธ๋ก ์์ ์ฑ(๋ฒ๊ทธ ์์ )์ ๋ฐ๋ ์ ๋ต์ด ์ด์ ๊ด์ ์์ ๋ณด์์ ์ผ๋ก ์์ ํ๋ค๊ณ ํ๋จํ์
- Devths๋ ์ ๋ ฅ ํ๋ฉด์ด ๋ง๊ณ ์ ๋ ฅ ๊ท์น์ด ๋ณต์กํด์ง ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ๋ฐ๋ผ์ ํผ ๊ตฌํ์ ํ๋ฉด๋ง๋ค ๋ถ์ฐ์ํค๊ธฐ๋ณด๋ค, React Hook Form์ ๋์ ํด ํผ ์ํ/์ ์ถ/์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ์คํํ๊ณ , Zod์ ๊ฒฐํฉํ์ฌ ๊ฒ์ฆ ๊ท์น์ ์ผ๊ด๋๊ฒ ์ ์งํ๋ ๊ตฌ์ฑ์ด ์ ํฉํ๋ค๊ณ ํ๋จํ์
- ๋ธ๋ผ์ฐ์ ์ Node.js ํ๊ฒฝ์์ HTTP ์์ฒญ์ ์ฝ๊ฒ ๋ณด๋ด๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์์ฒญ/์๋ต ์ค์ ์ ๊ฐ์ฒด(config)๋ก ๊ด๋ฆฌํ๊ณ ๊ณตํต ๋ก์ง์ ์ธํฐ์ ํฐ๋ก ํ์คํํ ์ ์์
-
baseURL,headers,params,timeout,withCredentials๋ฑ ๋คํธ์ํฌ ์ต์ ์ ํ ๊ณณ์์ ์ ์ธ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์์ - ๋ชจ๋ ์์ฒญ ์ ์ ํ ํฐ/์ธ์ ์ ์๋ ์ฒจ๋ถํ๊ฑฐ๋, ๋ชจ๋ ์๋ต์์ 401/500 ๊ฐ์ ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ ๋ฒ์ ์ ์ฉํ ์ ์์
- ํ๋ฉด ์ด๋/ํญ ์ ํ/๊ฒ์์ด ๋ณ๊ฒฝ์ฒ๋ผ ์ด์ ์์ฒญ์ ๋ฒ๋ ค์ผ ํ๋ ์ํฉ์์ ์์ฒญ ์ทจ์ ํ๋ฆ์ ์ค๊ณํ ์ ์์
- ์ด๋ฏธ์ง/ํ์ผ ์ฒจ๋ถ ๊ธฐ๋ฅ์์ multipart ์ ๋ก๋๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ฌ์
- Google OAuth ์ดํ API ํธ์ถ๋ง๋ค ํ ํฐ/์ธ์ ์ ๋ณด๋ฅผ ๊ณตํต์ผ๋ก ๋ถ์ฌ์ผ ํ๋ฏ๋ก, ์ธํฐ์ ํฐ ๊ธฐ๋ฐ์ผ๋ก ์๋ ์ฃผ์ + ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํ์คํํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ์ ๋ฆฌํ๋ค๊ณ ํ๋จํจ
- ๊ฒ์๊ธ/์ฑํ /ํ๋กํ ๋ฑ์์ ์ฒจ๋ถ๋ฅผ ๋ค๋ฃจ๊ฒ ๋๋ฉด multipart ์ ๋ก๋๊ฐ ํต์ฌ์ด ๋๋ฏ๋ก Axios์ ์ ๋ก๋ ๊ตฌ์ฑ ๋ฐฉ์์ด ์ ํฉํ๋ค๊ณ ํ๋จํจ
- ํ์ด์ง๊ฐ ๋ง์์ง์๋ก ๋ก๋ฉ/์๋ฌ/์ฌ์๋/์ทจ์ ๊ฐ์ ๋คํธ์ํฌ UX๊ฐ ํ๋ค๋ฆฌ๊ธฐ ์ฌ์ด๋ฐ, Axios๋ ์ค์ (config)๊ณผ ์ธํฐ์ ํฐ๋ก ์ ์ฑ ์ ํ ๊ณณ์ ๋ชจ์ผ๊ธฐ ์ข์
| ํญ๋ชฉ | Axios | fetch(๋ด์ฅ) |
|---|---|---|
| ๊ณตํต ํค๋/ํ ํฐ ์ฃผ์ | ์ธํฐ์ ํฐ๋ก ํ์คํ ๊ฐ๋ฅ | ์ง์ ๋ํผ ํจ์๋ฅผ ๋ง๋ค์ด์ผ ํจ |
| ์์ฒญ ์ต์ ๊ด๋ฆฌ | config ๊ฐ์ฒด๋ก ์ผ๊ด๋๊ฒ ๊ด๋ฆฌ | ์ต์ ์ ํธ์ถ๋ง๋ค ๊ตฌ์ฑ(์ปจ๋ฒค์ ํ์) |
| ์์ฒญ ์ทจ์ | ์ทจ์ ํ๋ฆ ์ง์ | AbortController๋ฅผ ์ง์ ์ค๊ณํด์ผ ํจ |
| ํ์ผ ์ ๋ก๋ | multipart ์์/ํจํด์ด ๋ช ํ | FormData ๊ตฌ์ฑ์ ๊ฐ๋ฅํ์ง๋ง ํจํด ํ์คํ๋ ์ง์ ํ์ |
| ํ ์ผ๊ด์ฑ | ์ธ์คํด์ค 1๊ฐ๋ก ์ ์ฑ ๊ณ ์ ์ด ์ฌ์ | ํ ์ปจ๋ฒค์ ์ ๋ฐ๋ผ ํธ์ฐจ ๋ฐ์ ๊ฐ๋ฅ |
-
๊ณตํต ํค๋/ํ ํฐ ์ฃผ์ ์ ํ์คํ
-
**fetch(๋ด์ฅ)**์ ์์ฒญ๋ง๋ค ํค๋๋ฅผ ๋ถ์ด๊ฑฐ๋, ๋ณ๋์ ๋ํผ ํจ์๋ฅผ ๋ง๋ค์ด โํ ํฐ ์ฃผ์ ๊ท์นโ์ ํ์ด ์ง์ ๊ฐ์ ํด์ผ ํ๋ฏ๋ก, ํ๋ฉด/๊ธฐ๋ฅ์ด ๋์ด๋ ์๋ก ๋๋ฝ(์: ํน์ API๋ง ํ ํฐ ๋น ์ง) ๊ฐ๋ฅ์ฑ์ด ์ฆ๊ฐํจ
โ๏ธ ๋ฐ๋ฉด Axios๋ ์ธํฐ์ ํฐ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆ ํ ํฐ, ์ธ์ ํค๋, ๊ณตํต ํค๋ ์ ์ฑ ์ ํ ๊ณณ์์ ์ฒ๋ฆฌํ ์ ์์ด, Devths์ฒ๋ผ ์ธ์ฆ/๊ถํ์ด ์ฌ๋ฌ API์ ๊ฑธ์น ๊ตฌ์กฐ์์ ์ ์ฑ ์ ํ์คํํ๊ธฐ ์ ๋ฆฌํจ
-
-
์์ฒญ ์ต์ ๊ด๋ฆฌ์ ์ผ๊ด์ฑ
-
**fetch(๋ด์ฅ)**์ ๊ฐ ํธ์ถ๋ง๋ค ์ต์ ์ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ด์ด์, timeout/credentials/baseURL/์๋ฌ ์ฒ๋ฆฌ ๋ฑ ๊ณตํต ๊ท์น์ ํ ์ปจ๋ฒค์ ์ผ๋ก ์ ์งํด์ผ ํ๊ณ ๊ตฌํ ํธ์ฐจ๊ฐ ์๊ธฐ๊ธฐ ์ฌ์
โ๏ธ Axios๋ ์ธ์คํด์ค์config๋ก baseURL, timeout, ๊ณตํต ํค๋, withCredentials ๊ฐ์ ์ ์ฑ ์ ๊ณ ์ ํ ์ ์์ด, ํ๋ก์ ํธ ์ ๋ฐ์์ ๋์ผํ ์์ฒญ ๊ท์น์ ์ ์งํ๊ธฐ ์ฌ์
-
-
์์ฒญ ์ทจ์(Abort) ํ๋ฆ์ ์ด์ ๋์ด๋
-
**fetch(๋ด์ฅ)**์
AbortController๋ฅผ ํ๋ฉด๋ง๋ค ์ค๊ณํด์ผ ํ๋ฏ๋ก, ๊ฒ์/์๋์์ฑ/๋ฌดํ์คํฌ๋กค์ฒ๋ผ ์ด์ ์์ฒญ ์ทจ์๊ฐ ํ์ํ ํ๋ฉด์ด ๋์ด๋๋ฉด ์ฝ๋ ์ค๋ณต๊ณผ ๋๋ฝ ์ํ์ด ์ปค์ง ์ ์์โ๏ธ Axios๋ ์ทจ์ ํ๋ฆ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ค์์ ์ง์ํ๋ฉฐ, ๊ณตํต ์์ฒญ ์ ํธ๊ณผ ๊ฒฐํฉํด ์ทจ์ ์ ์ฑ ์ ํจํดํํ๊ธฐ ์ ๋ฆฌํจ
-
-
ํ์ผ ์ ๋ก๋ ํจํด์ ํ์คํ
-
**fetch(๋ด์ฅ)**๋
FormData๋ก ์ ๋ก๋๋ ๊ฐ๋ฅํ์ง๋ง, ๋ฉํฐํํธ ์์ฒญ ๊ตฌ์ฑ/์๋ฌ ์ฒ๋ฆฌ/์งํ ์ํ/๊ณตํต ํค๋ ์ ์ฑ ์ ํ์ด ์ง์ ํ์คํํด์ผ ํจโ๏ธ Axios๋ multipart ์ ๋ก๋์ ๋ํ ์ค๋ฌด ํจํด๊ณผ ๋ ํผ๋ฐ์ค๊ฐ ๋ง๊ณ , ์ธ์คํด์ค/์ธํฐ์ ํฐ์ ๊ฒฐํฉํด ์ ๋ก๋ ์ ์ฑ (์: ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ, ์ธ์ฆ ํค๋)์ ์ผ๊ด๋๊ฒ ์ ์ฉํ๊ธฐ ์ฉ์ดํจ
-
-
ํ ์ผ๊ด์ฑ(์ด์ ์ ์ฑ ๊ณ ์ )
-
**fetch(๋ด์ฅ)**์ ๊ฐ์ fetch๋ฅผ ์ด๋ป๊ฒ ๊ฐ์์ง์ ๋ฐ๋ผ ์ฝ๋ ์คํ์ผ๊ณผ ์๋ฌ ์ฒ๋ฆฌ ๋ฐฉ์์ด ๋ฌ๋ผ์ง ์ ์์ด, ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ํธ์ฐจ๊ฐ ๋์ ๋ ์ ์์
โ๏ธ Axios๋ ์ธ์คํด์ค 1๊ฐ๋ก ์์ฒญ/์๋ต ์ ์ฑ ์ ์ค์ํํ ์ ์์ด, Devths์ฒ๋ผ ํ๋ฉด/๊ธฐ๋ฅ์ด ๋ง์ ํ๋ก์ ํธ์์ ํ ๋จ์ ์ผ๊ด์ฑ ํ๋ณด์ ์ ๋ฆฌํจ
-
- v1.13.2
- 2025๋ 11์ 4์ผ์ ๋ฆด๋ฆฌ์ฆ๋จ
- ์ด์
- ์ต์ ์์ (stable) ๋ฐฐํฌ ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ์ ํํ์ฌ, ๋ฒ๊ทธ ์์ ๋ฐ ์์ ์ฑ ๊ฐ์ ์ ๋ฐ์ํ ์ ์์
- ์ด์ ์ ๋ต์ ๋ฉ์ด์ ๋ ์ ์งํ๊ณ , ํจ์น/๋ง์ด๋ ์
๋ฐ์ดํธ๋ ์ ๊ธฐ ๋ฐ์ํ๋ ๋ฐฉ์์ด ํฉ๋ฆฌ์ ์ด๋ผ๊ณ ์๊ฐํจ
- ์์กด์ฑ ์ถฉ๋ ๋ฆฌ์คํฌ๋ ๋ฎ์ถ๊ณ , ์์ ์ฑ ํจ์น๋ ๋ฐ๋ผ๊ฐ๊ธฐ ์ํจ
- devths๋ ์ธ์ฆ ๊ธฐ๋ฐ API ํธ์ถ์ด ๋ง๊ณ ํ์ผ ์ ๋ก๋ ๋ฐ ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ ์๊ตฌ๊ฐ ์ปค์ง ๊ฐ๋ฅ์ฑ์ด ๋์ผ๋ฏ๋ก, ์ธํฐ์ ํฐ์ config ์ค์ฌ์ผ๋ก ๋คํธ์ํฌ ์ ์ฑ ์ ํ์คํํ ์ ์๋ Axios๋ฅผ API ํต์ ์คํ์ผ๋ก ์ ํํจ
- Vitest๋ JavaScript/TypeScript ํ๊ฒฝ์์ ๋จ์ ํ ์คํธ ๋ฐ ์ปดํฌ๋ํธ ํ ์คํธ๋ฅผ ์คํํ๊ธฐ ์ํ ํ ์คํธ๋ฌ๋์
- Node.js์์ ํ
์คํธ๋ฅผ ์ํํ๋ฉฐ, DOM์ด ํ์ํ ๊ฒฝ์ฐ
jsdom๊ณผ ๊ฐ์ ๊ฐ์ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ํตํด UI ํ ์คํธ๋ฅผ ์ง์ํจ
- ํ ์คํธ ์คํ ์๋๊ฐ ๋น ๋ฅธ ํธ์ผ๋ก, ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ฐ๋ณต ์คํ(์์ -๊ฒ์ฆ)์ ์ํํ๊ธฐ์ ์ ํฉํจ
- TypeScript ํ๋ก์ ํธ์ ์์ฐ์ค๋ฝ๊ฒ ์ ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ํ์ ๊ธฐ๋ฐ ์ฝ๋ ๊ตฌ์กฐ์์ ๊ฒฐํฉ์ด ์ฉ์ดํจ
-
describe,it,expect๋ฑ ์ผ๋ฐ์ ์ธ ํ ์คํธ ์์ฑ ๋ฐฉ์๊ณผ ์ ์ฌํ API๋ฅผ ์ ๊ณตํ์ฌ ๋์ ๋์ด๋๊ฐ ๋ฎ์ -
mock,spy๊ธฐ๋ฅ์ ํตํด ์ธ๋ถ ์์กด์ฑ(API ํจ์, ์ ํธ ํจ์ ๋ฑ)์ ๋ถ๋ฆฌํ ์ํ์์ ๋ก์ง ๊ฒ์ฆ์ด ๊ฐ๋ฅํจ - React Testing Library์ ํจ๊ป ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ ๋ ๋๋ง ๋ฐ ์ฌ์ฉ์ ์ํธ์์ฉ ์์ค์ ํ ์คํธ๋ฅผ ๊ตฌ์ฑํ ์ ์์
- devths๋ ํ๋ฉด ์๊ฐ ๋ง๊ณ ์ ๋ ฅ ๊ท์น, ์ํ ๋ณํ, ์กฐ๊ฑด๋ถ ๋ ๋๋ง์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ฑ์ฅํ๋ ๊ตฌ์กฐ์ด๋ฏ๋ก, ๋จ์/์ปดํฌ๋ํธ ํ ์คํธ์ ์ ์ฉ ๊ฐ์น๊ฐ ๋๋ค๊ณ ํ๋จํจ.
- ํ์ง ํธ์ฐจ์ ํ๊ท ์ํ์ ์ค์ผ ์ ์๋ค๊ณ ํ๋จํจ
- ์ ๋ ฅ ๊ฒ์ฆ ๋ก์ง(๋๋ค์ ๊ท์น, ๊ธธ์ด ์ ํ, ๋ ์ง ๋ฒ์, ํ์ผ ์ ํ ๋ฑ)์ ๋ณ๊ฒฝ ๊ฐ๋ฅ์ฑ์ด ๋๊ณ ๋๋ฝ ์ ์ค๋ฅ๋ก ์ฐ๊ฒฐ๋๊ธฐ ์ฌ์ ์๋ํ ๊ฒ์ฆ์ด ํ์ํจ
- ๋ก๋ฉ/์๋ฌ/์ฑ๊ณต ์ํ์ ๋ฐ๋ฅธ UI ๋ถ๊ธฐ, ์ธ์ฆ ์ํ์ ๋ฐ๋ฅธ ํ๋ฉด ๋ถ๊ธฐ ๋ฑ์ ๊ธฐ๋ฅ ์ถ๊ฐ ๊ณผ์ ์์ ์ฝ๊ฒ ๊นจ์ง ์ ์์ด ํ ์คํธ๋ก ๊ณ ์ ํ๋ ํธ์ด ์์ ์ ์
- ๋ชจ๋ฌ/ํญ/ํํฐ ๋ฑ UI ์ํ ์ ํ ๋ก์ง์ด ๋ง์, ์ฌ์ฉ์ ์ธํฐ๋์ ์ ๋ฐ๋ฅธ ๊ธฐ๋ ๋์์ ํ ์คํธ๋ก ๋ช ํํ ์ ์ํ ํ์๊ฐ ์์
| ํญ๋ชฉ | Vitest | Jest | Node ๋ด์ฅ test ๋ฌ๋ |
|---|---|---|---|
| ํ๋ก ํธ ๋จ์/์ปดํฌ๋ํธ ํ ์คํธ ์ ํฉ์ฑ | ํ๋ก ํธ ์ํ๊ณ ์นํ์ ๊ตฌ์ฑ์ ์ ๋ฆฌ | ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ค์ ์ด ๋์ด๋ ์ ์์ | ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์์ฃผ๋ก UI ํ ์คํธ ๊ตฌ์ฑ์ ์ถ๊ฐ ์ค๊ณ ํ์ |
| TypeScript ์ ์ฉ | ์๋์ ์ผ๋ก ์ ์ฉ ๋ถ๋ด์ด ๋ฎ์ ํธ | ๊ฐ๋ฅํ๋ ํ๋ก์ ํธ ๊ตฌ์ฑ์ ๋ฐ๋ผ ์ค์ ์ฆ๊ฐ ๊ฐ๋ฅ | ๊ฐ๋ฅํ๋ ๊ด๋ จ ์ํ๊ณ ์กฐํฉ์ด ์ ํ์ |
| ๊ฐ๋ฐ ์ค ๋ฐ๋ณต ์คํ(์๋/๊ฒฝํ) | ๋น ๋ฅธ ์คํ์ ๋ชฉํ๋ก ์ค๊ณ | ์ผ์ด์ค์ ๋ฐ๋ผ ์คํ ๋น์ฉ ์ฆ๊ฐ ๊ฐ๋ฅ | ๋จ์ํ๋ ํธ์ ๊ธฐ๋ฅ์ ์ ํ์ |
| mocking/spy | ๊ธฐ๋ณธ ์ ๊ณต(vi ๊ธฐ๋ฐ) | ๊ธฐ๋ณธ ์ ๊ณต(jest ๊ธฐ๋ฐ) | ์ธ๋ถ ๋๊ตฌ ๋๋ ์ง์ ๊ตฌ์ฑ ํ์ |
| Devths ์ ํฉ๋ | UI ๋ก์ง/๊ฒ์ฆ/์ํ ํ ์คํธ์ ์ ํฉ | ํ๋ณด ๊ฐ๋ฅ(ํ ๊ฒฝํ์ ๋ฐ๋ผ) | ๋จ์ ๋ก์ง์ ๊ฐ๋ฅํ๋ UI ์ค์ฌ์๋ ๋นํจ์จ์ |
-
ํ๋ก ํธ ๋จ์/์ปดํฌ๋ํธ ํ ์คํธ ๊ตฌ์ฑ์ ํ์คํ
-
Jest๋ ๋๋ฆฌ ์ฌ์ฉ๋์ง๋ง, ํ๋ก์ ํธ ๊ตฌ์ฑ(ESM, Next.js, TS, JSX)๊ณผ ๋ง์ถ๋ ๊ณผ์ ์์ ์ค์ ์ด ๋์ด๋๊ณ ํ ์คํธ ํ๊ฒฝ(ํธ๋์คํ์ผ/๋ฐํ์) ์ด์๋ฅผ ํ์ด ๊ณ์ ๊ด๋ฆฌํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ Vitest๋ ํ๋ก ํธ ์ํ๊ณ ์นํ์ ์ธ ๊ตฌ์ฑ์ด ๊ฐ์ ์ด๋ผ, Devths์ฒ๋ผ ์ปดํฌ๋ํธ/ํ /์ ํธ ํ ์คํธ ๋น์ค์ด ํฐ ํ๋ก์ ํธ์์ ํ ์คํธ ํ๊ฒฝ์ ๋น๊ต์ ๋จ์ํ๊ฒ ์ ์งํ๊ธฐ ์ ๋ฆฌํจ
-
-
TypeScript ์ ์ฉ ๋ถ๋ด๊ณผ ์ ์ง๋ณด์ ๋น์ฉ
-
Jest๋ TypeScript ์ ์ฉ์ด ๊ฐ๋ฅํ์ง๋ง, ๋ณํ ํ์ดํ๋ผ์ธ(ts-jest, babel-jest ๋ฑ)๊ณผ ์ค์ ์ด ํ๋ก์ ํธ ์ํฉ์ ๋ฐ๋ผ ๋ณต์กํด์ง ์ ์์ด ์ ์ง๋ณด์ ๋น์ฉ์ด ์ปค์ง ์ ์์
โ๏ธ Vitest๋ TypeScript/ESM ๊ธฐ๋ฐ ๊ฐ๋ฐ ํ๋ฆ๊ณผ์ ๊ฒฐํฉ์ด ๋น๊ต์ ์์ฐ์ค๋ฌ์, ํ ์คํธ ์ธํ๋ผ๋ฅผ โ์ค์ ์ค์ฌโ์ด ์๋๋ผ โ์ฝ๋ ์ค์ฌโ์ผ๋ก ์ด์ํ๊ธฐ ์ ๋ฆฌํจ
-
-
๊ฐ๋ฐ ์ค ๋ฐ๋ณต ์คํ ๊ฒฝํ(์๋/ํผ๋๋ฐฑ ๋ฃจํ)
-
Jest๋ ์ผ์ด์ค์ ๋ฐ๋ผ ์คํ ๋น์ฉ์ด ์ฆ๊ฐํ ์ ์์ด, ๊ฐ๋ฐ ์ค ํ ์คํธ๋ฅผ ์์ฃผ ๋๋ฆฌ๋ ํ๋ฆ์์ ์ฒด๊ฐ ์๋๊ฐ ๋จ์ด์ง ์ ์์
โ๏ธ Vitest๋ ๋น ๋ฅธ ๋ฐ๋ณต ์คํ ๊ฒฝํ์ ๋ชฉํ๋ก ์ค๊ณ๋์ด, ๊ธฐ๋ฅ ์ถ๊ฐ/๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ํ ์คํธ๋ฅผ ์์ฃผ ์คํํ๋ Devths ๊ฐ๋ฐ ๋ฐฉ์๊ณผ ์ ๋ง์
-
-
mocking/spy ๋๊ตฌ์ ์ผ๊ด์ฑ
-
Node ๋ด์ฅ test ๋ฌ๋๋ ๊ธฐ๋ณธ ๊ธฐ๋ฅ ์์ฃผ๋ผ mocking/spy, UI ํ ์คํธ๋ฅผ ์์ ์ ์ผ๋ก ์ด์ํ๋ ค๋ฉด ์ธ๋ถ ๋๊ตฌ ์กฐํฉ๊ณผ ํ ๋ด ๊ท์น ์ค๊ณ๊ฐ ์ถ๊ฐ๋ก ํ์ํจ
โ๏ธ Vitest๋ vi ๊ธฐ๋ฐ mocking/spy๋ฅผ ๊ธฐ๋ณธ ์ ๊ณตํ๋ฏ๋ก, ํ ์คํธ ์ฝ๋ ์์ฑ ๋ฐฉ์๊ณผ ๋๊ตฌ ์ฌ์ฉ๋ฒ์ ํ ๋จ์๋ก ํ์คํํ๊ธฐ ์ฌ์
-
-
Devths ์ฑ๊ฒฉ(UI ๋ก์ง/๊ฒ์ฆ/์ํ ํ ์คํธ)๊ณผ์ ์ ํฉ์ฑ
-
Node ๋ด์ฅ test ๋ฌ๋๋ ๋จ์ ๋ก์ง ํ ์คํธ์๋ ์ฌ์ฉํ ์ ์์ผ๋, UI ์ค์ฌ ํ ์คํธ๋ฅผ ์ด์ํ๋ ค๋ฉด ์ถ๊ฐ ์ค๊ณ๊ฐ ํ์ํด ๋นํจ์จ์ด ์ปค์ง ์ ์์
โ๏ธ Vitest๋ UI ๋ก์ง/๊ฒ์ฆ/์ํ ํ ์คํธ์ ์ ํฉํ ์ํ๊ณ ์กฐํฉ(React Testing Library ๋ฑ)๊ณผ ํจ๊ป ์ฐ๊ธฐ ์ข์, Devths์ ๋จ์/์ปดํฌ๋ํธ ํ ์คํธ ๋๊ตฌ๋ก ์ ํํ๋ ๊ทผ๊ฑฐ๊ฐ ๋จ
-
- v4.0.16
- 2025๋ 12์ 16์ผ์ ๋ฆด๋ฆฌ์ฆ๋จ
- ์ด์
- Vitest์ 4.x ๋ฉ์ด์ ๋ผ์ธ์์ ์ต์ ์์ (Stable) ํจ์น ๋ฒ์ ์ ์ฌ์ฉํ๋ฉด, ๋์ผํ ๋ฉ์ด์ ๋ฒ์ ๋ด์์ ๋ฒ๊ทธ ์์ /์์ ์ฑ ๊ฐ์ ์ ๋ฐ์ํ๋ฉด์๋ ํฐ ๊ตฌ์กฐ ๋ณ๊ฒฝ(๋ธ๋ ์ดํน ์ฒด์ธ์ง) ์ํ์ ์๋์ ์ผ๋ก ๋ฎ์ถ ์ ์์
- Devths๋ ์ ๋ ฅ ๊ฒ์ฆ, ์กฐ๊ฑด๋ถ UI, ์ํ ์ ํ๊ณผ ๊ฐ์ ํ๋ก ํธ์๋ ๋ก์ง์ด ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ์ํ๋ ๊ตฌ์กฐ์ด๋ฉฐ, ์ด ์์ญ์ ํ๊ท ์ํ์ด ๋์
- Vitest๋ ๋จ์/์ปดํฌ๋ํธ ํ ์คํธ๋ฅผ ๋น ๋ฅด๊ฒ ๋ฐ๋ณต ์คํํ ์ ์๊ณ TypeScript ๋ฐ React ํ ์คํธ ๊ตฌ์ฑ๊ณผ์ ๊ฒฐํฉ์ด ์ฉ์ดํ๋ฏ๋ก, ์ปดํฌ๋ํธ ๋จ์ ํ ์คํธ ๋๊ตฌ๋ก ์ฑํํ์์
-
Promise ๊ธฐ๋ฐ HTTP ํด๋ผ์ด์ธํธ
- ๋ธ๋ผ์ฐ์ /Node ํ๊ฒฝ์์ API ์์ฒญ์ ๊ฐ๋จํ๊ฒ ๋ณด๋ผ ์ ์๊ณ ,
async/await๋ก ํ๋ฆ์ ๊น๋ํ๊ฒ ์์ฑ ๊ฐ๋ฅ
- ๋ธ๋ผ์ฐ์ /Node ํ๊ฒฝ์์ API ์์ฒญ์ ๊ฐ๋จํ๊ฒ ๋ณด๋ผ ์ ์๊ณ ,
-
์ธ์คํด์ค(instance) ๊ธฐ๋ฐ ๊ณตํต ์ค์
-
baseURL,timeout, ๊ณตํต ํค๋ ๋ฑ ํ๋ก์ ํธ ํ์ค ์ค์ ์ ํ ๋ฒ์ ๋ฌถ์ด ์ฌ์ฌ์ฉํ ์ ์์ด API ์ฝ๋๊ฐ ์ ๋๋จ
-
-
Interceptor(์์ฒญ/์๋ต ๊ฐ๋ก์ฑ๊ธฐ) ์ง์
- ์์ฒญ ์ ์ ํ ํฐ ๋ถ์ด๊ธฐ, ์๋ต ์๋ฌ๋ฅผ ๊ณตํต ์ฒ๋ฆฌ(๋ก๊ทธ์ธ ๋ง๋ฃ, ํ ์คํธ) ๊ฐ์ โ๊ณตํต ๋ก์งโ์ ์ค์์์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
-
์์ฒญ ์ต์
์ด ํ๋ถํจ
-
params(์ฟผ๋ฆฌ),headers,timeout,responseType, ์ ๋ก๋(FormData) ๋ฑ ์ค๋ฌด์์ ์์ฃผ ํ์ํ ์ต์ ์ด ์ ๋ฆฌ๋ผ ์์
-
Devths๋ ์บ๋ฆฐ๋ / ๊ฒ์ํ / ์ฑํ
/ ์ฑ๋ด / OCR ์
๋ก๋์ฒ๋ผ API ํธ์ถ์ด ๋ค์ํ ์๋น์ค๋ผ์, ํ๋ฉด๋ง๋ค fetch๋ฅผ ์ ๊ฐ๊ฐ ์ฐ๋ฉด ์์ฒญ ๋ฐฉ์๊ณผ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ๋ถ์ฐ๋ผ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง.
- Axios๋ฅผ ์ฌ์ฉํ๋ฉด API ํธ์ถ ํจํด์ ํ์คํํ๊ณ , ๊ณตํต ์ฒ๋ฆฌ๋ฅผ(ํ ํฐ/์๋ฌ/ํ์์์) ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์์.
-
(1) ๊ณตํต ํค๋/์ธ์ฆ ์ฒ๋ฆฌ ํ์คํ
- ๋ก๊ทธ์ธ ์ดํ ์์ฒญ์ ์ธ์ฆ ์ ๋ณด๊ฐ ํ์ํ๋ฉด, ์ธํฐ์ ํฐ๋ก โ์๋ ์ฒจ๋ถโ ํจํด์ ๋ง๋ค๊ธฐ ์ฌ์
-
(2) ์๋ฌ ์ฒ๋ฆฌ ์ผ๊ด์ฑ
-
401(์ธ์ฆ ๋ง๋ฃ), 403(๊ถํ), 500(์๋ฒ ์ค๋ฅ) ๋ฑ์ ํ๋ฉด๋ง๋ค ๋ฐ๋ก ์ฒ๋ฆฌํ๋ฉด UX๊ฐ ๋ค์ญ๋ ์ญํด์ง
โ Axios ์ธํฐ์ ํฐ๋ก ๊ณตํต ์๋ฌ UX(ํ ์คํธ/๋ฆฌ๋ค์ด๋ ํธ)๋ฅผ ํ ๋ฒ์ ๋ฌถ๊ธฐ ์ข์
-
-
(3) ํ์ผ ์ ๋ก๋(OCR) ๊ฐ์ ์์ฒญ์ด ์กด์ฌ
- ์ฑ์ฉ๊ณต๊ณ ์ด๋ฏธ์ง/PDF ์
๋ก๋๋
multipart/form-data์ฒ๋ฆฌ๊ฐ ํ์ํ๊ณ , Axios๊ฐ ์ด ํ๋ฆ๊ณผ ์ ๋ง์
- ์ฑ์ฉ๊ณต๊ณ ์ด๋ฏธ์ง/PDF ์
๋ก๋๋
(1) Axios ์ธ์คํด์ค ๋ง๋ค๊ธฐ (๊ณตํต ์ค์ )
-
baseURL: ๋ฐฑ์๋ API ์ฃผ์ -
timeout: ๋๋ฌด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ด ๋๋น ์ง๋ ์ ํ - ๊ณตํต ํค๋ ๋ฑ
(2) Interceptor๋ก ์ธ์ฆ/์๋ฌ ๊ณตํต ์ฒ๋ฆฌ
- ์์ฒญ ์ธํฐ์ ํฐ: ํ ํฐ(๋๋ ์ธ์ ํค๋) ์๋ ์ฒจ๋ถ
- ์๋ต ์ธํฐ์ ํฐ: 401์ด๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ ๋, ํ ์คํธ ๋ฑ ๊ณตํต ์ฒ๋ฆฌ
| ํญ๋ชฉ | React Testing Library | React Test Renderer | Cypress/Playwright ์ปดํฌ๋ํธ ํ ์คํธ |
|---|---|---|---|
| ํ ์คํธ ๊ด์ | ์ฌ์ฉ์ ๊ด์ (DOM ์ํธ์์ฉ ์ค์ฌ) | ์ปดํฌ๋ํธ ํธ๋ฆฌ/์ค๋ ์ท ์ค์ฌ์ผ๋ก ํ๋ฅด๊ธฐ ์ฌ์ | ์ค์ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๊น์ด ํ๊ฒฝ์์ ๊ฒ์ฆ ๊ฐ๋ฅ |
| ๊ฐ์ | ์ ๊ทผ์ฑ ๊ธฐ๋ฐ ์กฐํ, ๋ฆฌํฉํ ๋ง ๋ด๊ตฌ์ฑ, ํ ํ์คํ ์ฉ์ด | ๋จ์ ๊ตฌ์กฐ ๊ฒ์ฆ/์ค๋ ์ท์ ๋น ๋ฅด๊ฒ ์ ์ฉ ๊ฐ๋ฅ | ๋ ๋๋ง/์คํ์ผ/๋ธ๋ผ์ฐ์ ๋์๊น์ง ๋ ํ์ค์ ์ผ๋ก ํ์ธ |
| ์ฃผ์์ | ์ญํ /๋ผ๋ฒจ ์ค๊ณ(์ ๊ทผ์ฑ)๊ฐ ์ ๋์ด ์์ผ๋ฉด ํ ์คํธ๊ฐ ์ด๋ ต๊ฒ ๋๊ปด์ง ์ ์์ | ์ค๋ ์ท ๋จ๋ฐ ์ ์๋ฏธ ์๋ ๋ณ๊ฒฝ์๋ ํ ์คํธ๊ฐ ์์ฃผ ๊นจ์ง ์ ์์ | ์ค์ /์คํ ๋น์ฉ์ด ์๋์ ์ผ๋ก ํฌ๊ณ , ๋จ์ ํ ์คํธ๋ก๋ ๊ณผํ ์ ์์ |
| ์ถ์ฒ ์ํฉ | ๋๋ถ๋ถ์ ์ปดํฌ๋ํธ/๋จ์ ํ ์คํธ ๊ธฐ๋ณธ๊ฐ | ์์ฃผ ๋จ์ํ ๋ ๋ ๊ตฌ์กฐ ํ์ธ, ์ ํ์ ์ฌ์ฉ | UI ๋ธ๋ผ์ฐ์ ํน์ฑ/๋ ์ด์์/ํตํฉ์ ๊ฐ๊น์ด ๊ฒ์ฆ์ด ํ์ํ ๋ |
-
์ฌ์ฉ์ ๊ด์ ํ ์คํธ ์ ํฉ์ฑ
-
React Test Renderer๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ/์ค๋ ์ท ์ค์ฌ์ผ๋ก ํ ์คํธ๊ฐ ํ๋ฅด๊ธฐ ์ฌ์, โ์ฌ์ฉ์๊ฐ ์ค์ ๋ก ๋ฒํผ์ ๋๋ฅด๊ณ ํ๋ฉด์ด ๋ฐ๋๋์งโ ๊ฐ์ ํต์ฌ ์๋๋ฆฌ์ค ๊ฒ์ฆ์ด ์ฝํด์ง ์ ์์
โ๏ธ ๋ฐ๋ฉด React Testing Library๋ DOM ์ํธ์์ฉ(ํด๋ฆญ/์ ๋ ฅ/ํ๋ฉด์ ๋ณด์ด๋ ํ ์คํธ)์ ๊ธฐ์ค์ผ๋ก ํ ์คํธ๋ฅผ ์์ฑํ๊ฒ ์ ๋ํ๋ฏ๋ก, Devths์ฒ๋ผ ์ธํฐ๋์ ์ด ๋ง์ UI์์ ํ ์คํธ ๋ชฉ์ ์ด ๋ช ํํด์ง๊ณ ์ ์ง๋ณด์์ฑ์ด ๋์์ง
-
-
๋ฆฌํฉํ ๋ง ๋ด๊ตฌ์ฑ๊ณผ ์ ์ง๋ณด์ ๋น์ฉ
-
React Test Renderer์ ์ค๋ ์ท์ ๋งํฌ์ ๊ตฌ์กฐ ๋ณํ์ ๋ฏผ๊ฐํด, ๊ธฐ๋ฅ์ ๋์ผํ๋ฐ๋ ๊ตฌ์กฐ๊ฐ ์กฐ๊ธ๋ง ๋ฐ๋๋ฉด ํ ์คํธ๊ฐ ์์ฃผ ๊นจ์ง๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์
โ๏ธ ๋ฐ๋ฉด React Testing Library๋ ์ญํ (role), ๋ผ๋ฒจ(label), ํ ์คํธ ๋ฑ ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ๊ธฐ์ค์ผ๋ก ์กฐํํ๋ ํจํด์ด ๊ฐํด, ๋ด๋ถ ๊ตฌํ์ ๋ฆฌํฉํ ๋งํด๋ ํ ์คํธ๊ฐ ์๋์ ์ผ๋ก ๋ ๊นจ์ ธ ์ฅ๊ธฐ ์ ์ง๋ณด์ ๋น์ฉ์ ๋ฎ์ถ๋ ๋ฐ ์ ๋ฆฌํจ
-
-
ํ ์คํธ ๋ฒ์ ๋๋น ์คํ/์ด์ ํจ์จ
-
Cypress/Playwright์ ์ปดํฌ๋ํธ ํ ์คํธ๋ ์ค์ ๋ธ๋ผ์ฐ์ ์ ๊ฐ๊น์ด ํ๊ฒฝ์์ ๊ฒ์ฆํ ์ ์์ง๋ง, ์ค์ ยท์คํ ๋น์ฉ์ด ์๋์ ์ผ๋ก ํฌ๊ณ ๋จ์ ํ ์คํธ๋ก๋ ๊ณผํ ์์ค์ด ๋ ์ ์์(ํ ์คํธ ์ค์ํธ๊ฐ ์ปค์ง์๋ก ๋ถ๋ด ๋์ )
โ๏ธ ๋ฐ๋ฉด React Testing Library๋ ๋๋ถ๋ถ์ ์ปดํฌ๋ํธ/๋จ์ ํ ์คํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์ปค๋ฒํ๋ ํ์ค ์กฐํฉ์ผ๋ก ์ฐ๊ธฐ ์ข์, Devths์ ์ปดํฌ๋ํธ/๋ก์ง ํ ์คํธ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๊ธฐ ์ ํฉํจ
-
-
ํ ํ์คํ ๋ฐ ์ ๊ทผ์ฑ(UX) ํ์ง ๊ด์
-
๋จ์ ๋ ๋ ๊ตฌ์กฐ ๊ฒ์ฆ์ ์น์ฐ์น๋ฉด, ์ ๊ทผ์ฑ ์์ฑ(๋ผ๋ฒจ/role)์ด๋ ์ฌ์ฉ์ ํ๋ฆ ์ค์ฌ์ ํ์ง ๊ธฐ์ค์ด ํ ์คํธ์ ๋ฐ์๋๊ธฐ ์ด๋ ค์ธ ์ ์์
โ๏ธ ๋ฐ๋ฉด React Testing Library๋ ์ ๊ทผ์ฑ ๊ธฐ๋ฐ ์กฐํ(getByRole ๋ฑ) ์ฌ์ฉ์ด ์์ฐ์ค๋ฌ์, ์ปดํฌ๋ํธ ๊ฐ๋ฐ ์ ์ ๊ทผ์ฑยท์ฌ์ฉ์ฑ ๊ธฐ์ค์ ํจ๊ป ๋ง์ถ๋ ๋ฐฉํฅ์ผ๋ก ํ ํ์คํ๋ฅผ ๋ง๋ค๊ธฐ ์ฉ์ดํจ
-
- v16.3.1
- 2025๋ 12์ 15์ผ์ ๋ฆด๋ฆฌ์ฆ ๋จ
- ์ด์
- ํ ์คํธ ์ธํ๋ผ์ ํต์ฌ ์์กด์ฑ์ด๋ฏ๋ก, ๋์ผ ๋ฉ์ด์ ๋ผ์ธ(16.x)์์ ํจ์น ๋ฒ์ ๊น์ง ํฌํจํ ์์ ๋ฒ์ ์ ์ฌ์ฉํด ๋ฒ๊ทธ ์์ /์์ ์ฑ ๊ฐ์ ์ฌํญ์ ๋ฐ์ํจ
- Devths๋ React 19.x ๋ฐ Next.js ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋๋ฏ๋ก, ์ต์ React ํ๊ฒฝ์์์ ๋์ ํธํ์ฑ๊ณผ ํ์ ์ ์ ์ผ๊ด์ฑ์ ์ฐ์ ๊ณ ๋ คํจ
- ๋ํ Vitest/Jest ๋ฑ ์ฃผ์ ํ ์คํธ ๋ฌ๋ ์กฐํฉ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ฒ์ ๋ผ์ธ์ ์ ํํจ์ผ๋ก์จ, ๋์ ๋ฐ ์ด์ ๊ณผ์ ์์ ๋ฐ์ํ ์ ์๋ ํธํ์ฑ ์ด์์ ์๊ธฐ์น ์์ ๋ณ๊ฒฝ ๋ฆฌ์คํฌ๋ฅผ ์ต์ํํจ
- Devths๋ ์ํธ์์ฉ๊ณผ ์ํ ๋ณํ๊ฐ ๋ง์ ํ๋ฉด์ด ์ค์ฌ์ด๋ฏ๋ก, ๊ตฌํ ๋ฐฉ์์ด ์๋๋ผ ์ฌ์ฉ์ ๊ฒฝํ(๋์/ํ์/๊ฒ์ฆ ๊ท์น)์ ๊ธฐ์ค์ผ๋ก ํ ์คํธ๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ ์ง๋ณด์์ ์ ๋ฆฌํจ
- ๋ฐ๋ผ์ ์ปดํฌ๋ํธ/๋จ์ ํ ์คํธ์ ๊ธฐ๋ณธ ๋๊ตฌ๋ก React Testing Library๋ฅผ ์ฑํํ๋ ๊ตฌ์ฑ์ด ์ ํฉํ๋ค๊ณ ํ๋จํจ
-
์ง์ง ๋ธ๋ผ์ฐ์ ๋ก ์ฌ์ฉ์ ํ๋์ ๊ทธ๋๋ก ํ
์คํธ
- ํด๋ฆญ/์ ๋ ฅ/์คํฌ๋กค/ํ์ด์ง ์ด๋์ฒ๋ผ ์ฌ์ฉ์๊ฐ ํ๋ ํ๋์ ์๋์ผ๋ก ์คํํด์, โ๋ก๊ทธ์ธ๋ถํฐ ๊ธ ์์ฑ๊น์งโ ๊ฐ์ ์๋๋ฆฌ์ค๋ฅผ ํต์ผ๋ก ๊ฒ์ฆํ ์ ์์
-
ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ์ง์
- Chromium / Firefox / WebKit(์ฌํ๋ฆฌ ๊ณ์ด) ํ๊ฒฝ์ ํ ๋ฒ์ ํ ์คํธํ ์ ์์ด, ํน์ ๋ธ๋ผ์ฐ์ ์์๋ง ๊นจ์ง๋ ๋ฌธ์ ๋ฅผ ์ก๊ธฐ ์ข์
-
์๋ ๋๊ธฐ(auto-wait)๋ก ํ๋ํค ํ
์คํธ ๊ฐ์
- ์์๊ฐ ์ค๋น๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋์ํ๋ ๋ฐฉ์์ด๋ผ(๋ฒํผ์ด ๋จ๊ธฐ ์ ์ ํด๋ฆญํด์ ์คํจํ๋ ๋ฌธ์ ๋ฑ) E2E ์์ ์ฑ์ด ์ข์์ง
-
๋๋ฒ๊น
๋๊ตฌ๊ฐ ๊ฐํจ(Trace/๋ฆฌํฌํธ/์คํฌ๋ฆฐ์ท/๋น๋์ค)
- ์คํจํ์ ๋ ์ ์คํจํ๋์ง๋ฅผ ์ถ์ ํ๊ธฐ ์ํด Trace Viewer, HTML ๋ฆฌํฌํธ, ์คํฌ๋ฆฐ์ท/๋น๋์ค ๋ฑ์ ๋จ๊ธธ ์ ์์
Devths๋ ๊ธฐ๋ฅ์ด ๋ง๊ณ ํ๋ฆ์ด ๊ธธ์ด์(์บ๋ฆฐ๋/๊ฒ์ํ/์ฑํ /AI), ๋จ์ ํ ์คํธ๋ง์ผ๋ก๋ โ์ ์ฒด ๋์โ์ด ๊นจ์ก๋์ง ๋์น๊ธฐ ์ฌ์.
- Playwright E2E๋ก ํต์ฌ ์ ์ ์๋๋ฆฌ์ค๋ฅผ ํต์งธ๋ก ์๋ ๊ฒ์ฆํ๋ฉด ๋ฐฐํฌ ์ ํ๊ท(Regression) ๋ฒ๊ทธ๋ฅผ ์ค์ผ ์ ์์.
(1) ๋ก๊ทธ์ธ/์ธ์ฆ ํ๋ฆ ๊ฒ์ฆ
- ๋ก๊ทธ์ธ ์ฑ๊ณต/์คํจ, ๋ก๊ทธ์ธ ํ ๋ณดํธ ํ์ด์ง ์ ๊ทผ ๊ฐ๋ฅ ์ฌ๋ถ(๊ฐ๋) ๊ฐ์ ํ๋ฆ์ E2E์์ ์ก๋ ๊ฒ ๊ฐ์ฅ ํ์คํจ
(2) ๊ฒ์ํ ํต์ฌ ์๋๋ฆฌ์ค
- ๊ธ ๋ชฉ๋ก ์ง์ โ ๊ฒ์/ํํฐ โ ์์ธ ์ง์ โ ๋๊ธ ์์ฑ/์ญ์ โ ์ข์์ ํ ๊ธ ๊ฐ์ ์ฐ์ ํ๋ฆโ๊ฒ์ฆ
(3) ์บ๋ฆฐ๋ + OCR ์ผ์ ์๋ ์ฝ์
-
ํ์ผ ์ ๋ก๋ โ ์ฒ๋ฆฌ ๋๊ธฐ ๋ชจ๋ฌ โ ๊ฒฐ๊ณผ ์ด์ ํ์ธ โ ์ ์ฅ ํ ์บ๋ฆฐ๋์ ๋ฐ์
์ด๋ฐ ๋น๋๊ธฐ + ๋ชจ๋ฌ ํ๋ฆ์ E2E๋ก ์ค์ ์ฌ์ฉ์ ๊ด์ ์์ ํ์ธํ๋ ๊ฒ ํจ๊ณผ์ ์
(4) ์ฑํ (์ค์๊ฐ)
- ์ต์ํ โ๋ฉ์์ง ์ ์ก UI๊ฐ ๊นจ์ง์ง ์๋๋คโ, โ์ฐ๊ฒฐ ๋๊น ์ ์๋ด๊ฐ ๋ฌ๋คโ ๊ฐ์ ํต์ฌ UX๋ฅผ ์๋๋ฆฌ์ค๋ก ๊ณ ์ ๊ฐ๋ฅ
-
ํ
์คํธ ๋จ์
-
auth.spec.ts: ๋ก๊ทธ์ธ/๋ก๊ทธ์์/๋ณดํธ ๋ผ์ฐํธ -
board.spec.ts: ๊ธ ๋ชฉ๋ก/์์ธ/๋๊ธ/์ข์์ -
calendar.spec.ts: ์ผ์ CRUD + ์/์ฃผ ๋ทฐ ์ ํ -
ocr.spec.ts: ๊ณต๊ณ ์ ๋ก๋ โ ์ฒ๋ฆฌ โ ์ด์ โ ์ ์ฅ -
chat.spec.ts: ๋ฉ์์ง ์ ๋ ฅ/์ ์ก(๊ฐ๋ฅํ๋ฉด ํ ์คํธ์ฉ ์๋ฒ/๋ชฉ์ ํ๊ฒฝ์์)
-
-
์คํจ ๋๋ฒ๊น
- CI์์ ์คํจํ๋ฉด Trace Viewer๋ก ํด๋ฆญ/๋คํธ์ํฌ/DOM ์ค๋ ์ท์ ํ์๋ผ์ธ์ผ๋ก ๋ณด๋ ๋ฐฉ์์ด ๊ฐ์ฅ ๊ฐ๋ ฅํจ
| ํญ๋ชฉ | Playwright | Cypress | Selenium(WebDriver) | Puppeteer |
|---|---|---|---|---|
| ๋ธ๋ผ์ฐ์ ์์ง ๋ฒ์ | Chromium/Firefox/WebKit ์ง์ (Playwright) | ์ฃผ๋ก Chromium ๊ณ์ด ์ค์ฌ, WebKit์ ๋ณ๋/์ ํ์ (์คํ์ ์ง์ ๋งฅ๋ฝ) (pptr.dev) | ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ง์(ํ์ค ๊ธฐ๋ฐ) (Selenium) | Chrome/Firefox ์๋ํ ์ค์ฌ |
| ํ ์คํธ ๋ฌ๋/๋ณ๋ ฌ/๋ฆฌํฌํธ | ๊ณต์ Test ๋ฌ๋ ๋ด์ฅ, ์ด์ ๊ธฐ๋ฅ ํฌํจ (Playwright) | ๋ฌ๋ ์ ๊ณต(์ํ๊ณ ๊ฐํจ) | ๋ฌ๋๋ ๋ณ๋ ์กฐํฉ ํ์(ํ๋ ์์ํฌ ์ ํ) | ๋ฌ๋๋ผ๊ธฐ๋ณด๋ค โ๋ธ๋ผ์ฐ์ ์๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌโ ์ฑ๊ฒฉ |
| ์์ ์ฑ(ํ์ด๋ฐ ์ด์ ๋์) | locator/auto-wait ํ๋ฆ ์ ๊ณต (Playwright) | ์์ฒด ๋๊ธฐ/์ฌ์๋ ํจํด ์ ๊ณต | ๋๊ธฐ/๋๊ธฐํ ์ค๊ณ๋ฅผ ์ง์ ์ ํด์ผ ํจ (Selenium) | ๋๊ธฐ/๋๊ธฐํ๋ ์ฌ์ฉ์๊ฐ ์ง์ ์ค๊ณํ๋ ๋น์ค ํผ |
| Next.js์์ ๊ถํฉ | ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ E2E์ ์ ํฉ(๋ผ์ฐํ /SSR/์ฟ ํค ํ๋ฆ ๊ฒ์ฆ) | ๊ฐ๋ฅ | ๊ฐ๋ฅ(๊ตฌ์ฑ ๋ถ๋ด ์๋์ ์ผ๋ก ํผ) | ๊ฐ๋ฅ(ํ์ง๋ง E2E ์ด์ ๊ธฐ๋ฅ์ ์ง์ ๊ตฌ์ฑ ํ์) |
-
๋ธ๋ผ์ฐ์ ์ปค๋ฒ๋ฆฌ์ง์ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ๊ฒ์ฆ
-
Cypress๋ ์ฃผ๋ก Chromium ๊ณ์ด ์ค์ฌ์ผ๋ก ์ด์๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์, Firefox/WebKit๊น์ง ๊ฐ์ ์์ค์ผ๋ก ํญ๋๊ฒ ๊ฒ์ฆํ๋ ค๋ฉด ์ ์ฝ์ด ์๊ธธ ์ ์์
โ๏ธ ๋ฐ๋ฉด Playwright๋ Chromium/Firefox/WebKit์ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ฏ๋ก, Devths์ฒ๋ผ ๋ก๊ทธ์ธ(OAuth), ์ฟ ํค/์ธ์ , ๋ผ์ฐํ ๋ฑ ๋ธ๋ผ์ฐ์ ๋ณ ์ฐจ์ด๊ฐ ์ด์๊ฐ ๋ ์ ์๋ ํ๋ฆ์ ํ ๋๊ตฌ์์ ์ผ๊ด๋๊ฒ ํ์ธํ๊ธฐ ์ ๋ฆฌํจ
-
-
E2E ์ด์ ๊ธฐ๋ฅ์ ๋ด์ฅ ์ฌ๋ถ(ํ ์คํธ ๋ฌ๋/๋ฆฌํฌํธ/๋ณ๋ ฌ)
-
**Selenium(WebDriver)**์ ๋ค์ํ ๋ธ๋ผ์ฐ์ ๋ฅผ ํ์ค ๊ธฐ๋ฐ์ผ๋ก ์ง์ํ์ง๋ง, ํ ์คํธ ๋ฌ๋ยท๋ณ๋ ฌ ์คํยท๋ฆฌํฌํธ ๊ฐ์ ์ด์ ๊ธฐ๋ฅ์ ๋ณ๋๋ก ์กฐํฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์ด๊ธฐ ๊ตฌ์ฑ๊ณผ ์ ์ง๋ณด์ ๋ถ๋ด์ด ์ปค์ง ์ ์์
โ๏ธ ๋ฐ๋ฉด Playwright๋ ๊ณต์ ํ ์คํธ ๋ฌ๋๋ฅผ ํฌํจํ๊ณ ๋ณ๋ ฌ ์คํ/๋ฆฌํฌํธ ๋ฑ ์ด์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ์ ๊ณตํ๋ฏ๋ก, ํ ๊ณผ์ /ํ๋ก์ ํธ ํ๊ฒฝ์์ ๋์ ํ ๋ฐ๋ก ๋๋ฆด ์ ์๋ ํํ๋ก ํ์คํํ๊ธฐ ์ฉ์ดํจ
-
-
์์ ์ฑ(ํ์ด๋ฐ ์ด์)๊ณผ ์ ์ง๋ณด์ ๋น์ฉ
-
Selenium์ด๋ Puppeteer๋ ๋๊ธฐ/๋๊ธฐํ(์์๊ฐ ๋จ๋ ์์ , ๋คํธ์ํฌ ์๋ฃ ์์ )๋ฅผ ์ฌ์ฉ์๊ฐ ๋ ์ง์ ์ค๊ณํด์ผ ํด์, ํ๋ฉด์ด ๋ณต์กํด์ง์๋ก ํ์ด๋ฐ ์ด์๋ก ํ ์คํธ๊ฐ ๋ถ์์ ํด์ง ๊ฐ๋ฅ์ฑ์ด ์์
โ๏ธ ๋ฐ๋ฉด Playwright๋ locator ๊ธฐ๋ฐ auto-wait ํ๋ฆ์ ์ ๊ณตํ์ฌ, DOM ๋ ๋๋ง/๋ค๋น๊ฒ์ด์ /๋น๋๊ธฐ ์์ฒญ์ด ์์ธ ํ๊ฒฝ์์๋ ํ ์คํธ ํ๋ํค(๊ฐ๋ ์คํจ) ๋ฆฌ์คํฌ๋ฅผ ์ค์ด๋ ๋ฐ ์ ๋ฆฌํจ
-
-
Next.js ๊ธฐ๋ฐ ์๋น์ค ํ๋ฆ๊ณผ์ ์ ํฉ์ฑ
-
Puppeteer๋ ๋ธ๋ผ์ฐ์ ์๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฑ๊ฒฉ์ด ๊ฐํด E2E ์ด์(๋ฌ๋, ๋ฆฌํฌํธ, ๋ณ๋ ฌ, ์ฌ์๋ ์ ์ฑ ๋ฑ)์ ์ง์ ๊ตฌ์ฑํด์ผ ํ๋ ๋น์ค์ด ํผ
โ๏ธ ๋ฐ๋ฉด Playwright๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ E2E์ ํ์ํ ์ด์ ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ํ์์ Next.js์ ๋ผ์ฐํ /SSR/์ฟ ํคยท์ธ์ /OAuth ๋ฆฌ๋ค์ด๋ ํธ ๊ฐ์ ํ๋ฆ์ ๊ฒ์ฆํ๊ธฐ ์ ํฉํ๋ฏ๋ก, Devths์ ํต์ฌ ์ฌ์ฉ์ ์๋๋ฆฌ์ค(๋๋ฉโ๋ก๊ทธ์ธโ๋ฉ์ธ ์ง์ ๋ฑ)๋ฅผ ์์ ์ ์ผ๋ก ์๋ํํ๊ธฐ์ ์ ์ ํจ
-
- v1.57.0
- 2025๋ 11์ 25์ผ์ ๋ฆด๋ฆฌ์ฆ๋จ
- ์ด์
- ๊ณต์ ๋ฆด๋ฆฌ์ฆ ๋ ธํธ ๊ธฐ์ค์ผ๋ก v1.57 ๋ผ์ธ์ด ์ ๊ณต๋๋ฉฐ(๋ฒ๊ทธ ์์ /๊ธฐ๋ฅ ๊ฐ์ ํฌํจ), ๋ฉ์ด์ ๋ผ์ธ์์ ์ต์ ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ๋ฌธ์/๊ฐ์ด๋์ ๋์ผํ ํ๋ฆ์ผ๋ก ์ด์ํ๊ธฐ ์ฌ์
- E2E๋ ๋ธ๋ผ์ฐ์ ์คํ ํ๊ฒฝ์ ์ํฅ์ ํฌ๊ฒ ๋ฐ๊ธฐ ๋๋ฌธ์, ๋์ผ ๋ฉ์ด์ ๋ผ์ธ์์ ์ต์ ์์ ๋ฒ์ ์ ๊ธฐ์ค์ผ๋ก ๋๊ณ ํจ์น ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ๋ผ๊ฐ๋ ์ ๋ต์ด ์ผ๋ฐ์ ์ผ๋ก ์ด์ ๋ฆฌ์คํฌ๋ฅผ ๋ฎ์ถค
- devths์ ํต์ฌ ํ๋ก์ฐ๋ฅผ ์ค์ ๋ธ๋ผ์ฐ์ ์์ ๊ฒ์ฆํ๊ธฐ ์ํด playwright๋ฅผ E2E ํ ์คํธ ๋๊ตฌ๋ก ์ ํํจ
- WebSocket = ์ฐ๊ฒฐ
- HTTP์ฒ๋ผ ์์ฒญํ ๋๋ง๋ค ๋๊ธฐ๋ ๊ฒ ์๋๋ผ, ํ ๋ฒ ์ฐ๊ฒฐํ๋ฉด ๊ณ์ ์ ์งํด์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฐฉํฅ์ผ๋ก ๋ฐ๋ก ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์
- STOMP = ๋ฉ์์ง ์ฃผ๊ณ ๋ฐ๋ ๊ท์น(ํ๋กํ ์ฝ)
- WebSocket ์์์ SEND(์ ์ก) / SUBSCRIBE (๊ตฌ๋ ) ๊ฐ์ ํ์ค ๊ท์น์ผ๋ก ๋ฉ์์ง๋ฅผ ๋ค๋ฃธ
- Spring์ STOMP๊ธฐ๋ฐ์ผ๋ก destination(์ฃผ์) ๋ผ์ฐํ ์ ์ง์ํด์ ์ฑํ ๋ฐฉ/์๋ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ฌ์
- Pub/Sub ๋ชจ๋ธ์ด๋ผ ์ฑํ ๋ฐฉ์ ๋ฑ ๋ง์
- 1:1 + ๊ทธ๋ฃน์ฑํ
์ room(๋ฐฉ) ํ๋๋ก ํต์ผ ๊ฐ๋ฅ
- 1:1๋ ์ฐธ์ฌ์ 2๋ช ์ธ ๋ฐฉ์ผ๋ก ๋ณด๋ฉด ๋ก์ง์ด ํต์ผ๋ผ์ ๊ตฌํ/์ ์ง๋ณด์๊ฐ ์ฌ์
- ์ฝ์ ์ฒ๋ฆฌ๋ฅผ ์ค์๊ฐ ์ด๋ฒคํธ๋ก ์ฒ๋ฆฌํ๊ธฐ ์ข์
- ์ฝ์์ ์ํ ๋ณํ๋ผ์, STOMP ๋ฉ์์ง๋ก READ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ด๊ณ ๊ฐ์ ๋ฐฉ ํ ํฝ์ผ๋ก ๋ฟ๋ฆฌ๋ฉด UI ๋ฐ์์ด ๊น๋ํจ
- ๊ณผ๊ฑฐ ๋ํ๋ REST๋ก ๊ฐ์ ธ์ค๊ณ , ์ค์๊ฐ ์์ /์ฝ์๋ง WebSocket(STOMP)๋ก ์ฒ๋ฆฌํ๋ฉด ์์ ์ ์
- Spring์์ STOMP/WebSocket์ด ํ์ค ๊ฒฝ๋ก
- Spring ๊ณต์ ์ํ๊ณ๊ฐ STOMP ๊ธฐ๋ฐ ๋ฉ์์ง์ ๊ธฐ๋ณธ ํ๋ฆ์ผ๋ก ์ง์ํจ
- ๊ด๋ จ ๋ ํผ๋ฐ์ค/์ด์ ํจํด์ด ๋ง์์ ํ ๊ธฐ์ค์ผ๋ก ์ค๋ช /์ ์ง๋ณด์๊ฐ ์ฌ์
- STOMP๋ ํ์ค ํ๋กํ ์ฝ โ ๊ตฌ์กฐ๊ฐ ๋ ๊ท์น์
- ์ฃผ์ ๊ธฐ๋ฐ์ด๋ผ ๋ฐฉ/์ ์ /์๋ฆผ ๋ผ์ฐํ ๊ท์น์ ๋ฌธ์๋ก ์ ๋ฆฌํ๊ธฐ ์ฌ์
- ๋์ค์ ๋ฉ์์ง ๋ธ๋ก์ปค ์ฐ๋ ํ์ฅ๋ ์์ฐ์ค๋ฌ์
- Socket.io๋ ์ฃผ๋ ฅ ์ํ๊ณ๊ฐ ๋ค๋ฆ
- Socket.io๋ Node์์ ๊ฐ๋ ฅํ ํธ์ ๊ธฐ๋ฅ(๋ฃธ/ACK/์ฌ์ฐ๊ฒฐ ๋ฑ)์ ์ ๊ณตํ์ง๋ง, Spring ๋จ๋ ์๋ฒ์์ ์ฐ๋ฉด ์ฃผ๋ฅ ํจํด์ด ์๋๊ธฐ์ ์ค๋ช /์ ์ง๋ณด์ ๊ด์ ์์ ์ด์ ์ด ์ค์ด๋ฆ
- ์ ์ฒด
- Socket.IO: ์ค์๊ฐ ํต์ ์ ์ฝ๊ฒ ํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ/ํ๋ ์์ํฌ
- STOMP: WebSocket ์์์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ํ์ค ํ๋กํ ์ฝ
- ํต์ ๋ฐฉ์
- Socket.IO: emit/on ์ด๋ฒคํธ ์ด๋ฆ ๊ธฐ๋ฐ
- STOMP: SEND / SUBSCRIBE destiantion(์ฃผ์) ๊ธฐ๋ฐ (Pub/Sub)
- ์ฑํ
๋ฐฉ ์ฒ๋ฆฌ
- Socket.IO: room ๊ธฐ๋ฅ ๋ด์ฅ
- STOMP: topic ๊ตฌ๋ ์ผ๋ก ๋ฐฉ์ ํํ(์ฃผ์ ์ค๊ณ๋ก ๊ตฌํ)
- Socket.IO: Node ์ํ๊ณ์์ ๊ฐํจ
- STOMP: Spring์์ ํ์ค ๊ฒฝ๋ก๋ก ๋ง์ด ์
(1) destination ๊ท์น
- ๋ฉ์์ง ์์ (๊ตฌ๋
):
/topic/rooms/{roomId}/messages - ์ฝ์ ์์ (๊ตฌ๋
):
/topic/rooms/{roomId}/reads - ๋ฉ์์ง ์ ์ก:
/app/rooms/{roomId}/messages - ์ฝ์ ์ ์ก:
/app/rooms/{roomId}/reads
(2) ์๋ฒ(Spring) ํ๋ฆ(๊ฐ๋ )
- ํด๋ผ์ด์ธํธ๊ฐ
/topic/...๋ฅผ subscribe - ํด๋ผ์ด์ธํธ๊ฐ
/app/...๋ก send - ์๋ฒ๋ ๋ฐ์ ๋ฉ์์ง๋ฅผ ์ฒ๋ฆฌํ๊ณ
/topic/...์ผ๋ก publish
(3) ํด๋ผ์ด์ธํธ(ํ๋ก ํธ) ํ๋ฆ(๊ฐ๋ )
- STOMP client๋ก WebSocket ์ฐ๊ฒฐ
- ๋ฐฉ ์ง์
์
subscribe("/topic/rooms/{roomId}/messages") - ๋ฉ์์ง ๋ณด๋ผ ๋
send("/app/rooms/{roomId}/messages", payload) - ์ฝ์ ์ฒ๋ฆฌ ์
send("/app/rooms/{roomId}/reads", payload)- ์๋๋
/topic/rooms/{roomId}/reads๊ตฌ๋ ์ผ๋ก ์ฆ์ ๋ฐ์
- ์๋๋
| ๋ฐฉ์ | ์ฅ์ | ๋จ์ | Devths ์ ํฉ๋ |
|---|---|---|---|
| STOMP + WebSocket | Spring ํ์ค ํจํด, pub/sub๋ก ๋ฐฉ/์ฝ์ ๋ชจ๋ธ๋ง ์ฌ์, ๋ผ์ฐํ ๊ท์น์ด ๋ช ํ | ๊ตฌ๋ /๋ฐํ ๊ฐ๋ ์ ์ต์ํด์ ธ์ผ ํจ | ์ต์ |
| Socket.IO | ์ด๋ฒคํธ/๋ฃธ/ACK/์ฌ์ฐ๊ฒฐ ๋ฑ ๊ตฌํ์ด ํธํจ(ํนํ Node์์) | Spring ๋จ๋ ์๋ฒ์์ ์ฃผ๋ฅ ๊ฒฝ๋ก๊ฐ ์๋(๋ ํผ๋ฐ์ค/์ด์ ํจํด ์ฝํด์ง ์ ์์) | ๊ฐ๋ฅํ์ง๋ง ์ฐ์ ์์โ |
| ์์ WebSocket | ๊ฐ๋ณ๊ณ ์์ ๋ ๋์ | destination/๊ตฌ๋ /๊ถํ/๋ผ์ฐํ ์ ์ง์ ์ค๊ณํด์ผ ํด์ ๊ธ๋ฐฉ ๋ณต์กํด์ง | ๊ท๋ชจ ์ปค์ง๋ฉด ๋ถ๋ด |
| SSE | ์๋ฒโํด๋ผ ๋จ๋ฐฉํฅ ํธ์๊ฐ ๊ฐ๋จ | ํด๋ผโ์๋ฒ ์ค์๊ฐ ์ ์ก์ ๋ถ์ ํฉ(์ฑํ ์ ๋ถ๋ฆฌ) | โ |
- Devths๋ Spring ๊ธฐ๋ฐ์ด๊ณ 1:1/๊ทธ๋ฃน ์ฑํ + ์ฝ์ ์ฒ๋ฆฌ๊ฐ ํต์ฌ์ด๋ผ, WebSocket(์ฐ๊ฒฐ)+ STOMP(๋ฉ์์ง ๊ท์น) ์กฐํฉ์ด ๊ฐ์ฅ ํ์ค์ ์ด๊ณ ์ค๊ณ๊ฐ ๊น๋ํจ
- ํนํ ์ฑํ ์ room ๋จ์๋ก ํต์ผํ๊ณ , ์ฝ์์ lastRead(๋ง์ง๋ง์ผ๋ก ์ฝ์ ์์น)๋ก ์ฒ๋ฆฌํ๋ฉด ๋ณต์ก๋๋ฅผ ํฌ๊ฒ ์ค์ด๋ฉด์ UX๋ฅผ ๋ง์กฑ์ํฌ ์ ์์