๐ ๋ฐฐํฌ ์ฃผ์
๐จ ์คํ ๋ฆฌ๋ถ ๋ฐ๋ก๊ฐ๊ธฐ
1. ๊ธฐ์ ์คํ
ย ย ย ย ย 1.1. ์ฃผ์ ์คํ ์ฌ์ฉ ์ด์
2. ์ค์น ๋ฐ ์คํ
3. ํ์ ๊ตฌ์ฑ
4. ํ์
๋ฐฉ์
5. ํ์ด์ง๋ณ ๊ธฐ๋ฅ
ย ย ย ย ย 5.1. ๋ก๊ทธ์ธ / ํ์๊ฐ์
ย ย ย ย ย 5.2. ๋ค๋น๊ฒ์ด์
์ฌ์ด๋๋ฐ
ย ย ย ย ย 5.3. ๋์๋ณด๋
ย ย ย ย ย 5.4. ๋ชจ๋ ํ ์ผ ๋ชฉ๋ก
ย ย ย ย ย 5.5. ๋ชฉํ ์์ธ
ย ย ย ย ย 5.6. ๋
ธํธ ๋ชจ์๋ณด๊ธฐ ๋ฐ ๋
ธํธ ์์ธ
ย ย ย ย ย 5.7. ๋
ธํธ ์์ฑ
6. ์ฃผ์ ๋์ ๊ณผ์
ย ย ย ย ย 6.1. ๋ธ๋์น์ ๋ต
ย ย ย ย ย 6.2. ๋์์ธํจํด
ย ย ย ย ย 6.3. Open API Generator
ย ย ย ย ย 6.4. ์คํ ๋ฆฌ๋ถ & MSW
ย ย ย ย ย 6.5. ์ฟผ๋ฆฌํค ๊ตฌ์กฐํ
ย ย ย ย ย 6.6. ์ํฌํ๋ก์ฐ ์๋ํ
ย ย ย ย ย 6.7. ํ
์คํธ
7. ๋ฌธ์
| Stacks | Tools | Collaboration |
|---|---|---|
| Nexjs (Page Router) | Figma | Notion |
| Typescript | GitHub | Discord |
| Tailwind (v4) | GitHub Actions | Jira |
| Axios | Vercel | |
| Tanstack Query | ||
| Jest | ||
| React-Testing-Library | ||
| PNPM | ||
| Storybook | ||
| MSW | ||
| Framer Motion |
- ์๋ฒ์์ ๋ฏธ๋ฆฌ ๊ฐ์ ธ์ฌ ๋ฐ์ดํฐ๊ฐ ๋ง์ง ์์ App Router์ ์๋ฒ ์ปดํฌ๋ํธ ํ์ฉ ์ด์ ์ด ํฌ์ง ์๋ค๊ณ ํ๋จํ์์ต๋๋ค.
- Page Router๋
use client์ ์ธ์ด ํ์ ์์ด์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ ๊ด๋ฆฌ๊ฐ ๋ ์ง๊ด์ ์ด๋ผ๊ณ ์๊ฐํ์ฌ ์ฑํํ์์ต๋๋ค. - ์ฌ์ ํ ๋ง์ ํ์ ํ๋ก์ ํธ์์ Page Router๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ์์ผ๋ก๋ ํ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ ์ฉํ์์ต๋๋ค.
- ํ ํ๋ฉด์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์, ๋ฐ์ดํฐ๊ฐ CRUD ์์ ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ๋, ๊ด๋ จ๋ ๋ชจ๋ UI์์ ์ฆ์ ๋๊ธฐํ๊ฐ ํ์ํ์์ต๋๋ค.
- TanStack Query๋ฅผ ํ์ฉํ๋ฉด ์๋ ์บ์ฑ, ๋๊ธฐํ, ๋๊ด์ ์ ๋ฐ์ดํธ๋ฅผ ํตํด ํจ์จ์ ์ธ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ์ฌ ์ฑํํ์์ต๋๋ค.
tailwind.config.ts์์ด ๋จ์ผ ํ์ผ์์ ๋ชจ๋ ์ค์ ์ ํ๋์ ๊ด๋ฆฌํ๋ ๋ถ๋ถ์ด ํธ๋ฆฌํด ๋ณด์ฌ ์ฑํํ์์ต๋๋ค.- ์ต์ ๋ฒ์ ์ด๋ผ ํธํ์ฑ ์ด์๊ฐ ์์ ๊ฒ ๊ฐ์์ง๋ง, ํน๋ณํ ๋ฌธ์ ์์ด ์ ์์ ์ผ๋ก ๋์ํ์์ต๋๋ค.
npm install && npm run dev
pnpm install && pnpm run dev // pnpm ์ ์ญ ์ค์น ํ์
yarn install && yarn run dev // yarn ์ ์ญ ์ค์น ํ์npm install --global pnpm // pnpm ์ ์ญ ์ค์น (ํ์ ์)
npm install --global yarn // yarn ์ ์ญ ์ค์น (ํ์ ์)| ๐ ์ดํํ | ๊ฐ์์ | ํ๋ค์ฐ | ๊ฐ๋ํ |
|---|---|---|---|
@thgee |
@euNung24 |
@hdayeon |
@Ralto13 |
Jira: ์ ๊ธฐ๋ฅ ๋ฐ ์คํ๋ฆฐํธ ๋จ์ ์ด์๊ด๋ฆฌ
GitHub: ์ง๋ผ ํฐ์ผ๊ณผ ์ฐ๋, ํ์ ๊ฐ ์ฝ๋ ๋ฆฌ๋ทฐ, Github Flow ์ ์ฉ, ๋์ค์ฝ๋ webhooks
Notion: ๋ฐ์ผ๋ฆฌ์คํฌ๋ผ, ํ ํ์, ๋ฉํ ๋ง, ํ๊ณ ๊ธฐ๋ก
- ๋ก๊ทธ์ธ: ์ด๋ฉ์ผ ํ์ ๋ฐ ๋น๋ฐ๋ฒํธ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
- ํ์๊ฐ์ : ์ด๋ฆ ์ ๋ ฅ ์ฌ๋ถ, ์ด๋ฉ์ผ ํ์ ๋ฐ ๊ณ์ ์ ๋ฌด ๋ฐ ๋น๋ฐ๋ฒํธ ๊ธ์ ์, ๋น๋ฐ๋ฒํธ ํ์ธ๋์ ๋ํ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
| ๋ก๊ทธ์ธ / ํ์๊ฐ์ |
|---|
![]() |
- ๋ก๊ทธ์ธํ ๊ณ์ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๊ณ ๋ก๊ทธ์์ ๋ฒํผ์ผ๋ก ์ ์ ๋ก๊ทธ์์ํ ์ ์์ต๋๋ค.
- ๋ก๊ณ ๋ ๋์๋ณด๋ ํญ์ ํด๋ฆญํ๋ฉด ๋์๋ณด๋๋ก ์ด๋ํ๋ฉฐ, ๋น๋ก๊ทธ์ธ ์ํ์์๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
- ์ ํ ์ผ ์ถ๊ฐ ๋ฒํผ์ผ๋ก (ํ ์ผ ์ถ๊ฐ ๊ธฐ๋ฅ)์ด ์ ๊ณต๋ฉ๋๋ค.
- ์ ๋ชฉํ ์ถ๊ฐ ๋ฒํผ์ผ๋ก ๋ชฉํ๋ฅผ ์ถ๊ฐํ๊ณ ๋ชฉํ๊ฐ ๋ง์์ง๋ฉด ๋ฌดํ์คํฌ๋กค๋ก ๋ชฉ๋ก์ด ์ ๊ณต๋ฉ๋๋ค.
| ๋ค๋น๊ฒ์ด์ ์ฌ์ด๋๋ฐ |
|---|
![]() |
- ์ต๊ทผ ๋ฑ๋กํ ํ ์ผ: ๊ฐ์ฅ ์ต๊ทผ์ ์์ฑํ ํ ์ผ์ด ๋์ค๊ณ (๊ฐ ํ ์ผ์ ๋ํ ๊ธฐ๋ฅ)์ด ์ ๊ณต๋ฉ๋๋ค. ๋ชจ๋๋ณด๊ธฐ ๋ฒํผ ํด๋ฆญ์ผ๋ก ๋ชจ๋ ํ ์ผ ๋ชฉ๋ก์ผ๋ก ์ด๋ํฉ๋๋ค.
- ๋ด ์งํ ์ํฉ: ์ ์ฒด ์๋ฃ๋ ํ ์ผ๊ณผ ๋ฏธ์๋ฃ ํ ์ผ์ ๋น์จ์ด ํผ์ผํธ๋ก ์กฐํ๋ฉ๋๋ค.
- ๋ชฉํ ๋ณ ํ ์ผ: ๊ฐ ๋ชฉํ ์๋์ ์ํ ํ ์ผ๋ค์ ํ์ธํ ์ ์์ผ๋ฉฐ Progress bar๋ก ๊ฐ ํ ์ผ๋ค์ ์งํ ์ํฉ์ ์๋ ค์ค๋๋ค. ๊ฐ ๋ชฉํ์ ๋ํ ํ ์ผ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์ ๊ณต๋๋ฉฐ ๋ชฉํ 4๊ฐ๊ฐ ๋์ด๊ฐ๋ฉด ๋ฌดํ์คํฌ๋กค๋ก ๋ชฉ๋ก์ด ์ ๊ณต๋ฉ๋๋ค.
| ๋์๋ณด๋ |
|---|
![]() |
- ๋ชจ๋ ํ ์ผ ๋ชฉ๋ก์ ์กฐํํ๊ณ ์์ฑํ ์ ์์ผ๋ฉฐ ํ ์ผ์ ๋ฑ๋ก๋ ๋ชฉํ๊ฐ ์์ผ๋ฉด ํจ๊ป ๋ณด์ ๋๋ค.
- ํ ์ผ ์ถ๊ฐ ๊ธฐ๋ฅ: ์ ๋ชฉ์ ํ์๋ก ์จ์ผํ๊ณ ํ์ผ๊ณผ ๋งํฌ๋ฅผ ์ฒจ๋ถํ ์ ์์ผ๋ฉฐ ๋ชฉํ๋ฅผ ์ ํํ ์๋ ์ํ ์๋ ์์ต๋๋ค.
- ํด์ผ ํ ์ผ(To Do)/์๋ฃ๋ ์ผ(Done) ํํฐ๋ง์ด ๊ฐ๋ฅํ๋ฉฐ 40๊ฐ๊ฐ ๋์ด๊ฐ๋ฉด ๋ฌดํ์คํฌ๋กค๋ก ๋ชฉ๋ก์ด ์ ๊ณต๋ฉ๋๋ค.
- ๊ฐ ํ ์ผ์ ๋ํ ๊ธฐ๋ฅ: ์์ , ์ญ์ ๊ทธ๋ฆฌ๊ณ ์๋ฃ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ ์ ์์ผ๋ฉฐ ๋ ธํธ๋ฅผ ์์ฑํ๊ณ ๋ฑ๋ก๋ ๋ ธํธ๋ ์กฐํํ ์ ์์ต๋๋ค.
| ๋ชจ๋ ํ ์ผ ๋ชฉ๋ก |
|---|
![]() |
- ํน์ ๋ชฉํ์ ์์ธ ์ ๋ณด๋ฅผ ์กฐํํ ์ ์๊ณ ๋ชฉํ๋ฅผ ์ญ์ ํ๊ฑฐ๋ ์ด๋ฆ์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- Progress bar๋ก ๋ชฉํ์ ์ํ ํ ์ผ๋ค์ ์งํ ์ํฉ์ ์๋ ค์ค๋๋ค.
- ๋ ธํธ ๋ชจ์๋ณด๊ธฐ ํด๋ฆญ ์, ๋ชฉํ์ ์ํ ํ ์ผ๋ค์ ๋ํ ๋ ธํธ๋ฅผ ๋ชจ์๋ณด๋ ํ์ด์ง๋ก ์ด๋ํฉ๋๋ค.
- ๋ชฉํ์ ๋ํ ํ ์ผ ์ถ๊ฐ ๊ธฐ๋ฅ์ด ์ ๊ณต๋๋ฉฐ ๊ฐ ํ ์ผ(Todo, Done)์ 20๊ฐ๋ฅผ ๋์ผ๋ฉด ๋ฌดํ ์คํฌ๋กค๋ก ๋ชฉ๋ก์ด ์ ๊ณต๋ฉ๋๋ค.
| ๋ชฉํ ์์ธ |
|---|
![]() |
- ๋ชฉํ์ ์ํ ํ ์ผ๋ค์ ๋ํ ๋ชจ๋ ๋ ธํธ ๋ชฉ๋ก์ ์กฐํํ ์ ์์ผ๋ฉฐ ์์ฑ๋ ๋ ธํธ์ ์ ๋ชฉ, ๋ ธํธ์ ํด๋นํ๋ ํ ์ผ ์ ๋ชฉ์ ๋ณผ ์ ์์ต๋๋ค.
- ๊ฐ ๋ ธํธ๋ฅผ ์์ , ์ญ์ ํ ์ ์๊ณ ๋ ธํธ ํด๋ฆญ ์ ๋ ธํธ ์์ธ๊ฐ ์ฌ์ด๋ ๋ณด๊ธฐ๋ก ์ด๋ฆฝ๋๋ค.
- ๋ ธํธ ์์ธ์์๋ ๋ ธํธ์ ๋ชฉํ ๋ฐ ํ ์ผ ์ ๋ชฉ, ๋ ธํธ ์ ๋ชฉ, ๋ ธํธ ๋ง์ง๋ง ์ ์ฅ์ผ, ์์ธ ๋ด์ฉ์ ๋ณผ ์ ์์ต๋๋ค.
- ์ฒจ๋ถ๋ ๋งํฌ ํด๋ฆญ ์ PC ๋ฒ์ ๊ธฐ์ค ์ผ์ชฝ์๋ ๋ ธํธ์ ์ฒจ๋ถ๋ ๋งํฌ ์ฝํ ์ธ ์๋ฒ ๋๊ฐ, ์ค๋ฅธ์ชฝ์๋ ์๋ํฐ๊ฐ ๋ฐฐ์น๋ฉ๋๋ค.
| ๋ ธํธ ๋ชจ์๋ณด๊ธฐ ๋ฐ ๋ ธํธ ์์ธ |
|---|
![]() |
- ๋งํฌ๋ฅผ ์ฒจ๋ถํ ์ ์๋ ์๋ํฐ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์์ ์ ์ฅ ๋ฒํผ์ ํด๋ฆญํ๊ฑฐ๋, 5๋ถ์ ํ ๋ฒ ์๋ ์ ์ฅ๋๋ ๊ธฐ๋ฅ์ ํตํด ์์ ์ ์ฅํฉ๋๋ค.
- ๋ ธํธ ์์ฑ/์์ ์ค ํ์ด์ง ์ด๋ ์ ์์ฑ ์ค๋จ ์๋ด ๋ชจ๋ฌ์ ์ ๊ณตํฉ๋๋ค.
- ์ฒจ๋ถ๋ ๋งํฌ ํด๋ฆญ ์ PC ๋ฒ์ ๊ธฐ์ค ์ผ์ชฝ์๋ ๋ ธํธ์ ์ฒจ๋ถ๋ ๋งํฌ ์ฝํ ์ธ ์๋ฒ ๋๊ฐ, ์ค๋ฅธ์ชฝ์๋ ์๋ํฐ๊ฐ ๋ฐฐ์น๋ฉ๋๋ค.
| ํ ์ผ ๋ณ ๋ ธํธ ์์ฑ |
|---|
![]() |
๋ณธ ํ๋ก์ ํธ๋ GitHub Flow๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ง๋ง, ์ด๊ธฐ ๊ฐ๋ฐ ๋จ๊ณ์์ ์ฝ๋ ์ถฉ๋์ ์ต์ํํ๊ณ ๋
๋ฆฝ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ์งํ๊ธฐ ์ํด develop ๋ธ๋์น๋ฅผ ์ถ๊ฐํด ์ด์ํ์ต๋๋ค.
main: ๊ณตํต๋ ๋ก์ง๋ง ํฌํจํ๋ฉฐ, ์์ ์ ์ธ ๋ฐฐํฌ ๋ฒ์ ์ ์ ์งํฉ๋๋ค.feature:main์์ ์์ฑํ์ฌ ๊ฐ๋ณ ๊ฐ๋ฐ์ ์งํํ ํdevelop์ ๋ณํฉ๋ฉ๋๋ค.develop: ๊ธฐ๋ฅ ๊ฐ๋ฐ์ด ๋ณ๋ ฌ๋ก ์งํ๋ ๋ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ , ํตํฉ๋ ํ ์คํธ ํ๊ฒฝ์ ์ ๊ณตํ๊ธฐ ์ํด ์ฌ์ฉ๋์์ต๋๋ค.
MVP ์ดํ์๋ ์ ์ง๋ณด์ ์์ฃผ์ ์์
์ด ๋ง์์ง๋ฉด์, ๋น ๋ฅธ ๊ฐ๋ฐ๊ณผ ๋ฐฐํฌ๋ฅผ ์ํด develop ๋ธ๋์น๋ฅผ ์ ๊ฑฐํ๊ณ GitHub Flow ๋ฐฉ์์ผ๋ก ์ ํํ์ต๋๋ค.
main์์ feature ๋ธ๋์น๋ฅผ ์์ฑํด ์งง์ ์๋ช ์ฃผ๊ธฐ๋ก ๊ฐ๋ฐํ๊ณ , ๊ฒํ ํ ๋ฐ๋กmain์ ๋ณํฉํ๋ ๋ฐฉ์์ ๋๋ค.- ์ด๋ฅผ ํตํด ๋ถํ์ํ ์ค๊ฐ ๋ธ๋์น๋ฅผ ์ค์ด๊ณ , ๊ฐ๋ฐ ์๋๋ฅผ ๋์ด๋ฉฐ, ๋ณด๋ค ์ ์ฐํ ํ์ ์ด ๊ฐ๋ฅํด์ก์ต๋๋ค.
๋ค์ํ ์ปดํฌ๋ํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ํ ๋ฏน ๋์์ธ ํจํด์ ์ฑํํ์ต๋๋ค.
์ํ ๋ฏน ๋์์ธ ํจํด์ ๊ฐ์ฅ ์์ ๋จ์์ธ atoms ๋ถํฐ ๊ธฐ๋ฅ์ด๋ ์ญํ ์ด ์ถ๊ฐ๋จ์ ๋ฐ๋ผ molecules, organisms, templates, pages๋ก ๊ตฌ์ฑํฉ๋๋ค.
- ๊ณตํต ์ปดํฌ๋ํธ๋ ๊ธฐ๋ฅ๊ณผ ์ญํ ์ ๋ฐ๋ผ atoms, molecules, organisms๋ก ๋ถ๋ฅํฉ๋๋ค.
- ๊ฐ ํ์ด์ง์์๋ง ํ์ํ ์ปดํฌ๋ํธ๋ ๊ฐ ๋๋ฉ์ธ์ ๋ฐ๋ผ views(templates ๊ธฐ๋ฅ) ํ์์ ๋ถ๋ฅํฉ๋๋ค.
- ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์ page router๋ฅผ ์ ์ฉํจ์ ๋ฐ๋ผ pages ํ์์ ์์นํฉ๋๋ค.
- ๊ณตํต ์ปดํฌ๋ํธ ๋ถ๋ฅํ๋ ๊ฒ์ ์ด๋ ค์์ด ์์์ต๋๋ค. ์ด๋ค ๊ธฐ์ค์ผ๋ก atoms, molecules, organisms๋ฅผ ๋ถ๋ฅํ ๊ฒ์ธ์ง ๋ชจํธํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๊ฐ์ฅ ์์ ๋จ์๋ฅผ ๋ชฉํ๋ก ํ๋ค๋ณด๋ UI์ ๊ธฐ๋ฅ๋ง ํ๋ ๊ฒ์ atoms๋ก ๋ถ๋ฅํ์ต๋๋ค.
- ๊ธฐ๋ฅ์ด ๋ง๊ฑฐ๋ ์ค์ํ ์ญํ ์ ํ๋ ์ปดํฌ๋ํธ๋ฅผ organisms๋ก ๋ถ๋ฅํ์ต๋๋ค.
- ์ดํ ํ์์ ๋ฐ๋ผ ํ์๋ค๊ณผ ๋ ผ์ํ๋ฉด์ UI์ ๊ธฐ๋ฅ๋ง์ ํ์ง ์์ง๋ง ๊ธฐ๋ฅ์ด ๋ง์ง๋ ์์ ์ปดํฌ๋ํธ๋ฅผ molecules๋ก ๋ถ๋ฅํ์ต๋๋ค.
์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์ํํ๋ฉด์ Open API Generator๋ฅผ ์๊ฒ ๋์์ต๋๋ค. ์๋ฒ ์์ฒญ์ ํ์ํ type์ ์ผ์ผ์ด ์์ฑํ์ง ์์๋ ๋๋ค๋ ์ฅ์ ์ด ์์ด ๋์
ํ๊ฒ ๋์์ต๋๋ค.
- ๋ฐฑ์๋์์ API ํ์ฑ์ ํ์ํ OAS ํ์ผ์ ๊ณต๊ฐ์ ์ผ๋ก ์ ๊ณตํ์ง ์์, Swagger์ ๋คํธ์ํฌ ํญ์์ ์ง์ ์ถ์ถํ์ฌ ํ์ฉํ์์ต๋๋ค.
- ๋ฐฑ์๋์์ Schema๋ก ์ง์ ํ์ง ์์ type์ Open API Generator๊ฐ ์ง์ ํ ํ์ ์ ๊ฐ์ง๊ณ ์๋๋ฐ, ํด๋น ํ์ ๋ช ์ด ๋ํดํ ๋ถ๋ถ์ด ์์์ต๋๋ค. ์ค์ ๋ก ๋ฐฑ์๋์ ํ๋ ฅํ๋ค๋ฉด, ์ด๋ฐ ๋ถ๋ถ์ ๋ ผ์๋ฅผ ํตํด ํด๊ฒฐํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐ๋ฉ๋๋ค.
- API ์์ฒญ ํจ์๊น์ง ์์ฑ๋ ๊ฒฐ๊ณผ๊ฐ ๋์์ง๋ง, ๊ธฐ์กด์ customํ axios instance์ tanstack-query๋ฅผ ์ฌ์ฉํ๋ฉด์ ํ์ ๋ง ๊ฐ์ ธ์ค๊ฒ ๋์์ต๋๋ค.
-
์ํ ๋ฏน ๋์์ธ ํจํด์ ์ ์ฉํ๋ฉด์ ๊ฐ๋ณ ์ปดํฌ๋ํธ์ ์๊ฐ ๋ง์์ก๊ณ , ์ปดํฌ๋ํธ๋ช ๋ง์ผ๋ก ์๋ณํ๊ธฐ ์ด๋ ค์์ ธ ํ๋์ ํ์ ํ ์ ์๋ ํ๊ฒฝ์ด ํ์ํ์ต๋๋ค.
<Atoms ํด๋ ๋ด ์ปดํฌ๋ํธ๊ฐ ๋ง์์ง๋ฉด์ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์์ง>

-
Storybook์ ํ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ์๊ฐ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉด์, UI ์กฐ๋ฆฝ ์ ์ ๋์์ธ๊ณผ ๊ธฐ๋ฅ์ ๋ฏธ๋ฆฌ ํ์ธํ ์ ์์ด ๊ฐ๋ฐ ์์ฐ์ฑ์ด ํฌ๊ฒ ํฅ์๋ ๊ฒ์ผ๋ก ํ๋จํ์ฌ ์ฌ์ฉํ์์ต๋๋ค.
-
Storybook ๋ด์์ API ํต์ ์ด ํ์ํ ๊ฒฝ์ฐ๊ฐ ์์ด MSW๋ฅผ ํจ๊ป ๋์ ํ์ฌ ๋ฐ์ดํฐ ์์ฒญ์ mocking ํ์์ต๋๋ค.
-
Chromatic์ ํ์ฉํด Storybook์ ๋ฐฐํฌํ๊ณ , PR๋ง๋ค UI ๋ณ๊ฒฝ ์ฌํญ์ ์๊ฐ์ ์ผ๋ก ํ์ธํ ์ ์๋๋ก ์ค์ ํ์์ต๋๋ค.
TanStack Query์ ์ฟผ๋ฆฌ ํค๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฟผ๋ฆฌ ํค ํฉํ ๋ฆฌ ํจํด์ ์ ์ฉํ์์ต๋๋ค.
์ฟผ๋ฆฌ ํค๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉด์ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
- ์ฌ๋ฌ ๊ณณ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋, ์ฟผ๋ฆฌ ํค๊ฐ ์ค๋ณต๋์ด ๊ด๋ฆฌ ๋ถ๋ด์ด ์ฆ๊ฐํจ.
- ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ํ๋ด๋ ํค๋ผ๋ ๊ฐ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅด๊ฒ ์ ์ํ์ฌ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง.
- ๋ฌธ์์ด ๊ธฐ๋ฐ ํค๋ IDE์ ์๋ ์์ฑ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ด ์คํ ๋ฐ์ ๊ฐ๋ฅ์ฑ ์ฆ๊ฐ.
์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฟผ๋ฆฌ ํค๋ฅผ ํ๋์ ์ค์ ํฉํ ๋ฆฌ์์ ์์ฑํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
์ด๋ฅผ ํตํด ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ณ , ์ผ๊ด์ฑ์ ์ ์งํ๋ฉฐ, IDE ์๋ ์์ฑ์ ํ์ฉํ ์ ์์ต๋๋ค.
| ์ฟผ๋ฆฌํค ๊ทธ๋ฃน | ์ค๋ช | ์ฟผ๋ฆฌํค | ์ฌ์ฉ ์์ |
|---|---|---|---|
| note | ๋ ธํธ ๋ฌดํ์คํฌ๋กค | ["note", "infinite", {"goalId": goalId}] | queryKeys.note.infinite(goalId: 123).queryKey |
| ๋จ์ผ ๋ ธํธ | ["note", "detail", {"noteId": noteId}] | queryKeys.note.detail(noteId: 123).queryKey | |
| todo | ํ ์ผ ๋ฆฌ์คํธ | ["todo", "list", {"goalId": goalId}, {"filter": filter}] | queryKeys.todo.list({goalId: 123, filter: "done"}).queryKey |
| ํ ์ผ ๋ฌดํ์คํฌ๋กค | ["todo", "infinite", {"goalId": goalId}, {"filter": filter}] | queryKeys.todo.infinite({goalId: 123, filter: "done"}).queryKey | |
| ๋ ธํธ ์์ฑ/์์ | ["todo", "editNote", {"todoId": todoId}] | queryKeys.todo.editNote(todoId: 123).queryKey | |
| ํ ์ผ ์งํ๋ฅ | ["todo", "progress", {"goalId": goalId}] | queryKeys.todo.progress(goalId: 123).queryKey | |
| goal | ๋ชฉํ ๋ฌดํ์คํฌ๋กค | ["goal", "infinite", {"source": source}] | queryKeys.goal.infinite(source: "dashboard").queryKey |
| ๋จ์ผ ๋ชฉํ | ["goal", "detail", {"goalId": goalId}] | queryKeys.goal.detail(goalId: 123).queryKey | |
| user | ์ ์ ํ๋กํ ์กฐํ | ["user", "profile"] | queryKeys.user.profile.queryKey |
GitHub Actions๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ฅผ ์๋ํํ๊ณ , ์ฝ๋ ํ์ง๊ณผ ๋ฐฐํฌ ํจ์จ์ฑ์ ํฅ์์ํค๋ ์ํฌํ๋ก์ฐ๋ฅผ ๊ตฌ์ถํ์์ต๋๋ค.
workflows/
โโโ merge-main-to-dev.yml # main โ develop ์๋ ๋ณํฉ
โโโ ci.yml # CI/CD ํ์ดํ๋ผ์ธ
โโโ random-reviewer.yml # ๋๋ค ๋ฆฌ๋ทฐ์ด ์ง์
โโโ storybook.yml # ์คํ ๋ฆฌ๋ถ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์๋ํ
โโโ vercel-deploy.yml # Vercel ๋ฐฐํฌ ์๋ํ-
main โ develop ์๋ ๋ณํฉ
main๋ธ๋์น์ ๋จธ์ง๋ ์ปค๋ฐ์develop๋ธ๋์น์ ์๋์ผ๋ก ๋ณํฉํฉ๋๋ค.- ์ด๋ฅผ ํตํด
develop๋ธ๋์น์ PR์ ์ฌ๋ฆด ๋main์์ ๋ฐ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ณต ๊ฒํ ํ๋ ์ํฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
-
๋๋ค ๋ฆฌ๋ทฐ์ด ์ง์
- ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ํ์์ ์ผ๋ก ์งํํ๊ธฐ ์ํด ๋ ๋ช ์ ๋ฆฌ๋ทฐ์ด๋ฅผ ๋๋ค์ผ๋ก ์ง์ ํฉ๋๋ค.
- ์ง์ ๋ ๋ฆฌ๋ทฐ์ด์ ์น์ธ์ด ์์ผ๋ฉด ๋ณํฉํ ์ ์๋๋ก ๋ธ๋์น ๋ณดํธ ๊ท์น์ ์ค์ ํ์์ต๋๋ค.
-
์คํ ๋ฆฌ๋ถ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
- PR์ด ์์ฑ๋ ๋๋ง๋ค ๊ฐ๋ฐ๋ UI ์ปดํฌ๋ํธ๋ฅผ ์ฝ๊ฒ ํ์ธํ ์ ์๋๋ก ์คํ ๋ฆฌ๋ถ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋ฅ์ ๋์ ํ์์ต๋๋ค.
-
Husky ํ์ฉ
- PR ๋ณํฉ ์ ์ปค๋ฐ ๋จ๊ณ์์ ์ปจ๋ฒค์ ๋ฐ ํ์ ์ค๋ฅ๋ฅผ ๊ฒ์ฌํ์ฌ GitHub Actions ์คํ ๋น์ฉ์ ์ ๊ฐํฉ๋๋ค.






