Skip to content

yo-ong/quesddo

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

243 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

logo ํ€˜์Šค๋˜



๐ŸŒ ๋ฐฐํฌ ์ฃผ์†Œ
๐ŸŽจ ์Šคํ† ๋ฆฌ๋ถ ๋ฐ”๋กœ๊ฐ€๊ธฐ



๋ชฉ์ฐจ

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. ๋ฌธ์„œ



1. ๊ธฐ์ˆ  ์Šคํƒ

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

1.1 ์ฃผ์š” ์Šคํƒ ์‚ฌ์šฉ ์ด์œ 

Next.js (Page Router)

  • ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์ง€ ์•Š์•„ App Router์˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ํ™œ์šฉ ์ด์ ์ด ํฌ์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • Page Router๋Š” use client ์„ ์–ธ์ด ํ•„์š” ์—†์–ด์„œ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ๊ฐ€ ๋” ์ง๊ด€์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์—ฌ ์ฑ„ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์—ฌ์ „ํžˆ ๋งŽ์€ ํ˜„์—… ํ”„๋กœ์ ํŠธ์—์„œ Page Router๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์•ž์œผ๋กœ๋„ ํ™œ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„ ์ ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

TanStack Query

  • ํ•œ ํ™”๋ฉด์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„, ๋ฐ์ดํ„ฐ๊ฐ€ CRUD ์ž‘์—…์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋  ๋•Œ, ๊ด€๋ จ๋œ ๋ชจ๋“  UI์—์„œ ์ฆ‰์‹œ ๋™๊ธฐํ™”๊ฐ€ ํ•„์š”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • TanStack Query๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ž๋™ ์บ์‹ฑ, ๋™๊ธฐํ™”, ๋‚™๊ด€์  ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์ธ ์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ์ฑ„ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Tailwind CSS (v4)

  • tailwind.config.ts ์—†์ด ๋‹จ์ผ ํŒŒ์ผ์—์„œ ๋ชจ๋“  ์„ค์ •์„ ํ•œ๋ˆˆ์— ๊ด€๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด ํŽธ๋ฆฌํ•ด ๋ณด์—ฌ ์ฑ„ํƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์ตœ์‹  ๋ฒ„์ „์ด๋ผ ํ˜ธํ™˜์„ฑ ์ด์Šˆ๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜์ง€๋งŒ, ํŠน๋ณ„ํ•œ ๋ฌธ์ œ ์—†์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜์˜€์Šต๋‹ˆ๋‹ค.



2. ์„ค์น˜ ๋ฐ ์‹คํ–‰

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 ์ „์—ญ ์„ค์น˜ (ํ•„์š” ์‹œ)



3. ํŒ€์› ๊ตฌ์„ฑ

๐Ÿ‘‘ ์ดํƒœํ˜ ๊ฐ•์€์˜ ํ•˜๋‹ค์—ฐ ๊ฐ•๋™ํ˜„

@thgee

@euNung24

@hdayeon

@Ralto13



4. ํ˜‘์—… ๋ฐฉ์‹

Jira: ์ƒˆ ๊ธฐ๋Šฅ ๋ฐ ์Šคํ”„๋ฆฐํŠธ ๋‹จ์œ„ ์ด์Šˆ๊ด€๋ฆฌ

GitHub: ์ง€๋ผ ํ‹ฐ์ผ“๊ณผ ์—ฐ๋™, ํŒ€์› ๊ฐ„ ์ฝ”๋“œ ๋ฆฌ๋ทฐ, Github Flow ์ ์šฉ, ๋””์Šค์ฝ”๋“œ webhooks

Notion: ๋ฐ์ผ๋ฆฌ์Šคํฌ๋Ÿผ, ํŒ€ ํšŒ์˜, ๋ฉ˜ํ† ๋ง, ํšŒ๊ณ  ๊ธฐ๋ก




5. ํŽ˜์ด์ง€๋ณ„ ๊ธฐ๋Šฅ

5.1 ๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž…

  • ๋กœ๊ทธ์ธ: ์ด๋ฉ”์ผ ํ˜•์‹ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ํšŒ์›๊ฐ€์ž…: ์ด๋ฆ„ ์ž…๋ ฅ ์—ฌ๋ถ€, ์ด๋ฉ”์ผ ํ˜•์‹ ๋ฐ ๊ณ„์ • ์œ ๋ฌด ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ธ€์ž ์ˆ˜, ๋น„๋ฐ€๋ฒˆํ˜ธ ํ™•์ธ๋ž€์— ๋Œ€ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
๋กœ๊ทธ์ธ / ํšŒ์›๊ฐ€์ž…


5.2 ๋„ค๋น„๊ฒŒ์ด์…˜ ์‚ฌ์ด๋“œ๋ฐ”

  • ๋กœ๊ทธ์ธํ•œ ๊ณ„์ • ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์œผ๋กœ ์œ ์ € ๋กœ๊ทธ์•„์›ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ณ ๋‚˜ ๋Œ€์‹œ๋ณด๋“œ ํƒญ์„ ํด๋ฆญํ•˜๋ฉด ๋Œ€์‹œ๋ณด๋“œ๋กœ ์ด๋™ํ•˜๋ฉฐ, ๋น„๋กœ๊ทธ์ธ ์ƒํƒœ์—์„œ๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ ํ• ์ผ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์œผ๋กœ (ํ• ์ผ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ)์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ ๋ชฉํ‘œ ์ถ”๊ฐ€ ๋ฒ„ํŠผ์œผ๋กœ ๋ชฉํ‘œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๋ชฉํ‘œ๊ฐ€ ๋งŽ์•„์ง€๋ฉด ๋ฌดํ•œ์Šคํฌ๋กค๋กœ ๋ชฉ๋ก์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
๋„ค๋น„๊ฒŒ์ด์…˜ ์‚ฌ์ด๋“œ๋ฐ”

5.3 ๋Œ€์‹œ๋ณด๋“œ

  • ์ตœ๊ทผ ๋“ฑ๋กํ•œ ํ•  ์ผ: ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ƒ์„ฑํ•œ ํ•  ์ผ์ด ๋‚˜์˜ค๊ณ  (๊ฐ ํ•  ์ผ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ)์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋‘๋ณด๊ธฐ ๋ฒ„ํŠผ ํด๋ฆญ์œผ๋กœ ๋ชจ๋“  ํ•  ์ผ ๋ชฉ๋ก์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด ์ง„ํ–‰ ์ƒํ™ฉ: ์ „์ฒด ์™„๋ฃŒ๋œ ํ•  ์ผ๊ณผ ๋ฏธ์™„๋ฃŒ ํ•  ์ผ์˜ ๋น„์œจ์ด ํผ์„ผํŠธ๋กœ ์กฐํšŒ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชฉํ‘œ ๋ณ„ ํ•  ์ผ: ๊ฐ ๋ชฉํ‘œ ์•„๋ž˜์— ์†ํ•œ ํ•  ์ผ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Progress bar๋กœ ๊ฐ ํ•  ์ผ๋“ค์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค. ๊ฐ ๋ชฉํ‘œ์— ๋Œ€ํ•œ ํ•  ์ผ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜๋ฉฐ ๋ชฉํ‘œ 4๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ๋ฌดํ•œ์Šคํฌ๋กค๋กœ ๋ชฉ๋ก์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
๋Œ€์‹œ๋ณด๋“œ


5.4 ๋ชจ๋“  ํ•  ์ผ ๋ชฉ๋ก

  • ๋ชจ๋“  ํ•  ์ผ ๋ชฉ๋ก์„ ์กฐํšŒํ•˜๊ณ  ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ํ•  ์ผ์— ๋“ฑ๋ก๋œ ๋ชฉํ‘œ๊ฐ€ ์žˆ์œผ๋ฉด ํ•จ๊ป˜ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ํ•  ์ผ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ: ์ œ๋ชฉ์„ ํ•„์ˆ˜๋กœ ์จ์•ผํ•˜๊ณ  ํŒŒ์ผ๊ณผ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ชฉํ‘œ๋ฅผ ์„ ํƒํ• ์ˆ˜๋„ ์•ˆํ• ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด์•ผ ํ•  ์ผ(To Do)/์™„๋ฃŒ๋œ ์ผ(Done) ํ•„ํ„ฐ๋ง์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ 40๊ฐœ๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉด ๋ฌดํ•œ์Šคํฌ๋กค๋กœ ๋ชฉ๋ก์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํ•  ์ผ์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ: ์ˆ˜์ •, ์‚ญ์ œ ๊ทธ๋ฆฌ๊ณ  ์™„๋ฃŒ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋…ธํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋“ฑ๋ก๋œ ๋…ธํŠธ๋„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  ํ•  ์ผ ๋ชฉ๋ก


5.5 ๋ชฉํ‘œ ์ƒ์„ธ

  • ํŠน์ • ๋ชฉํ‘œ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชฉํ‘œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Progress bar๋กœ ๋ชฉํ‘œ์— ์†ํ•œ ํ•  ์ผ๋“ค์˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  • ๋…ธํŠธ ๋ชจ์•„๋ณด๊ธฐ ํด๋ฆญ ์‹œ, ๋ชฉํ‘œ์— ์†ํ•œ ํ•  ์ผ๋“ค์— ๋Œ€ํ•œ ๋…ธํŠธ๋ฅผ ๋ชจ์•„๋ณด๋Š” ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชฉํ‘œ์— ๋Œ€ํ•œ ํ•  ์ผ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜๋ฉฐ ๊ฐ ํ•  ์ผ(Todo, Done)์€ 20๊ฐœ๋ฅผ ๋„˜์œผ๋ฉด ๋ฌดํ•œ ์Šคํฌ๋กค๋กœ ๋ชฉ๋ก์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
๋ชฉํ‘œ ์ƒ์„ธ


5.6 ๋…ธํŠธ ๋ชจ์•„๋ณด๊ธฐ ๋ฐ ๋…ธํŠธ ์ƒ์„ธ

  • ๋ชฉํ‘œ์— ์†ํ•œ ํ•  ์ผ๋“ค์— ๋Œ€ํ•œ ๋ชจ๋“  ๋…ธํŠธ ๋ชฉ๋ก์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž‘์„ฑ๋œ ๋…ธํŠธ์˜ ์ œ๋ชฉ, ๋…ธํŠธ์— ํ•ด๋‹นํ•˜๋Š” ํ• ์ผ ์ œ๋ชฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ฐ ๋…ธํŠธ๋ฅผ ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๊ณ  ๋…ธํŠธ ํด๋ฆญ ์‹œ ๋…ธํŠธ ์ƒ์„ธ๊ฐ€ ์‚ฌ์ด๋“œ ๋ณด๊ธฐ๋กœ ์—ด๋ฆฝ๋‹ˆ๋‹ค.
  • ๋…ธํŠธ ์ƒ์„ธ์—์„œ๋Š” ๋…ธํŠธ์˜ ๋ชฉํ‘œ ๋ฐ ํ• ์ผ ์ œ๋ชฉ, ๋…ธํŠธ ์ œ๋ชฉ, ๋…ธํŠธ ๋งˆ์ง€๋ง‰ ์ €์žฅ์ผ, ์ƒ์„ธ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฒจ๋ถ€๋œ ๋งํฌ ํด๋ฆญ ์‹œ PC ๋ฒ„์ „ ๊ธฐ์ค€ ์™ผ์ชฝ์—๋Š” ๋…ธํŠธ์— ์ฒจ๋ถ€๋œ ๋งํฌ ์ฝ˜ํ…์ธ  ์ž„๋ฒ ๋“œ๊ฐ€, ์˜ค๋ฅธ์ชฝ์—๋Š” ์—๋””ํ„ฐ๊ฐ€ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
๋…ธํŠธ ๋ชจ์•„๋ณด๊ธฐ ๋ฐ ๋…ธํŠธ ์ƒ์„ธ


5.7 ๋…ธํŠธ ์ž‘์„ฑ

  • ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋Š” ์—๋””ํ„ฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ž„์‹œ ์ €์žฅ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, 5๋ถ„์— ํ•œ ๋ฒˆ ์ž๋™ ์ €์žฅ๋˜๋Š” ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ž„์‹œ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋…ธํŠธ ์ž‘์„ฑ/์ˆ˜์ • ์ค‘ ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์ž‘์„ฑ ์ค‘๋‹จ ์•ˆ๋‚ด ๋ชจ๋‹ฌ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒจ๋ถ€๋œ ๋งํฌ ํด๋ฆญ ์‹œ PC ๋ฒ„์ „ ๊ธฐ์ค€ ์™ผ์ชฝ์—๋Š” ๋…ธํŠธ์— ์ฒจ๋ถ€๋œ ๋งํฌ ์ฝ˜ํ…์ธ  ์ž„๋ฒ ๋“œ๊ฐ€, ์˜ค๋ฅธ์ชฝ์—๋Š” ์—๋””ํ„ฐ๊ฐ€ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
ํ•  ์ผ ๋ณ„ ๋…ธํŠธ ์ž‘์„ฑ



6. ์ฃผ์š” ๋„์ „ ๊ณผ์ œ

6.1. ๋ธŒ๋žœ์น˜์ „๋žต

๋ณธ ํ”„๋กœ์ ํŠธ๋Š” GitHub Flow๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์ฝ”๋“œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋…๋ฆฝ์ ์ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด develop ๋ธŒ๋žœ์น˜๋ฅผ ์ถ”๊ฐ€ํ•ด ์šด์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

MVP ์ด์ „

  • main: ๊ณตํ†ต๋œ ๋กœ์ง๋งŒ ํฌํ•จํ•˜๋ฉฐ, ์•ˆ์ •์ ์ธ ๋ฐฐํฌ ๋ฒ„์ „์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • feature: main์—์„œ ์ƒ์„ฑํ•˜์—ฌ ๊ฐœ๋ณ„ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•œ ํ›„ develop์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.
  • develop: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์ด ๋ณ‘๋ ฌ๋กœ ์ง„ํ–‰๋  ๋•Œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ํ†ตํ•ฉ๋œ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

MVP ์ดํ›„: GitHub Flow ์ „ํ™˜

MVP ์ดํ›„์—๋Š” ์œ ์ง€๋ณด์ˆ˜ ์œ„์ฃผ์˜ ์ž‘์—…์ด ๋งŽ์•„์ง€๋ฉด์„œ, ๋น ๋ฅธ ๊ฐœ๋ฐœ๊ณผ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด develop ๋ธŒ๋žœ์น˜๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  GitHub Flow ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • main์—์„œ feature ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•ด ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ , ๊ฒ€ํ†  ํ›„ ๋ฐ”๋กœ main์— ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๋ถˆํ•„์š”ํ•œ ์ค‘๊ฐ„ ๋ธŒ๋žœ์น˜๋ฅผ ์ค„์ด๊ณ , ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋†’์ด๋ฉฐ, ๋ณด๋‹ค ์œ ์—ฐํ•œ ํ˜‘์—…์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


6.2. ๋””์ž์ธํŒจํ„ด

๋‹ค์–‘ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•„ํ† ๋ฏน ๋””์ž์ธ ํŒจํ„ด์„ ์ฑ„ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„ํ† ๋ฏน ๋””์ž์ธ ํŒจํ„ด์€ ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„์ธ atoms ๋ถ€ํ„ฐ ๊ธฐ๋Šฅ์ด๋‚˜ ์—ญํ• ์ด ์ถ”๊ฐ€๋จ์— ๋”ฐ๋ผ molecules, organisms, templates, pages๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์•„ํ† ๋ฏน ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉํ•œ ํด๋” ๊ตฌ์กฐ

  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋Š” ๊ธฐ๋Šฅ๊ณผ ์—ญํ• ์— ๋”ฐ๋ผ atoms, molecules, organisms๋กœ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ํŽ˜์ด์ง€์—์„œ๋งŒ ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ ๋„๋ฉ”์ธ์— ๋”ฐ๋ผ views(templates ๊ธฐ๋Šฅ) ํ•˜์œ„์— ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ์€ page router๋ฅผ ์ ์šฉํ•จ์— ๋”ฐ๋ผ pages ํ•˜์œ„์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

์•„ํ† ๋ฏน ๋””์ž์ธ ํŒจํ„ด์„ ๋„์ž…ํ•˜๋ฉด์„œ ๊ฒช์€ ์–ด๋ ค์›€๊ณผ ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ฒƒ์— ์–ด๋ ค์›€์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ธฐ์ค€์œผ๋กœ atoms, molecules, organisms๋ฅผ ๋ถ„๋ฅ˜ํ•  ๊ฒƒ์ธ์ง€ ๋ชจํ˜ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๋‹ค๋ณด๋‹ˆ UI์˜ ๊ธฐ๋Šฅ๋งŒ ํ•˜๋Š” ๊ฒƒ์„ atoms๋กœ ๋ถ„๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋Šฅ์ด ๋งŽ๊ฑฐ๋‚˜ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ organisms๋กœ ๋ถ„๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ดํ›„ ํ•„์š”์— ๋”ฐ๋ผ ํŒ€์›๋“ค๊ณผ ๋…ผ์˜ํ•˜๋ฉด์„œ UI์˜ ๊ธฐ๋Šฅ๋งŒ์„ ํ•˜์ง„ ์•Š์ง€๋งŒ ๊ธฐ๋Šฅ์ด ๋งŽ์ง€๋Š” ์•Š์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ molecules๋กœ ๋ถ„๋ฅ˜ํ–ˆ์Šต๋‹ˆ๋‹ค.


6.3. Open API Generator

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ Open API Generator๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ์š”์ฒญ์— ํ•„์š”ํ•œ type์„ ์ผ์ผ์ด ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์–ด ๋„์ž…ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Open API Generator๋ฅผ ๋„์ž…๊ธฐ

  • ๋ฐฑ์—”๋“œ์—์„œ API ํŒŒ์‹ฑ์— ํ•„์š”ํ•œ OAS ํŒŒ์ผ์„ ๊ณต๊ฐœ์ ์œผ๋กœ ์ œ๊ณตํ•˜์ง€ ์•Š์•„, Swagger์˜ ๋„คํŠธ์›Œํฌ ํƒญ์—์„œ ์ง์ ‘ ์ถ”์ถœํ•˜์—ฌ ํ™œ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ์—์„œ Schema๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์€ type์€ Open API Generator๊ฐ€ ์ง€์ •ํ•œ ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, ํ•ด๋‹น ํƒ€์ž…๋ช…์ด ๋‚œํ•ดํ•œ ๋ถ€๋ถ„์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ฐฑ์—”๋“œ์™€ ํ˜‘๋ ฅํ•œ๋‹ค๋ฉด, ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ๋…ผ์˜๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐ๋ฉ๋‹ˆ๋‹ค.
  • API ์š”์ฒญ ํ•จ์ˆ˜๊นŒ์ง€ ์ž‘์„ฑ๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”์ง€๋งŒ, ๊ธฐ์กด์— customํ•œ axios instance์™€ tanstack-query๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํƒ€์ž…๋งŒ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.


6.4. ์Šคํ† ๋ฆฌ๋ถ & MSW

Storybook

  • ์•„ํ† ๋ฏน ๋””์ž์ธ ํŒจํ„ด์„ ์ ์šฉํ•˜๋ฉด์„œ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ˆ˜๊ฐ€ ๋งŽ์•„์กŒ๊ณ , ์ปดํฌ๋„ŒํŠธ๋ช…๋งŒ์œผ๋กœ ์‹๋ณ„ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ ธ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

    <Atoms ํด๋” ๋‚ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งŽ์•„์ง€๋ฉด์„œ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์›Œ์ง>

  • Storybook์„ ํ™œ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด์„œ, UI ์กฐ๋ฆฝ ์ „์— ๋””์ž์ธ๊ณผ ๊ธฐ๋Šฅ์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ๊ฒƒ์œผ๋กœ ํŒ๋‹จํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Storybook ๋‚ด์—์„œ API ํ†ต์‹ ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด MSW๋ฅผ ํ•จ๊ป˜ ๋„์ž…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ mocking ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

  • Chromatic์„ ํ™œ์šฉํ•ด Storybook์„ ๋ฐฐํฌํ•˜๊ณ , PR๋งˆ๋‹ค UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.



6.5. ์ฟผ๋ฆฌํ‚ค ๊ตฌ์กฐํ™”

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


6.6 ์›Œํฌํ”Œ๋กœ์šฐ ์ž๋™ํ™”

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 ์‹คํ–‰ ๋น„์šฉ์„ ์ ˆ๊ฐํ•ฉ๋‹ˆ๋‹ค.


6.7. ํ…Œ์ŠคํŠธ




7. ๋ฌธ์„œ


About

team project

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 95.3%
  • JavaScript 3.3%
  • CSS 1.4%