Skip to content

pigpgw/tech_blog

Repository files navigation

๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ํ”„๋กœ์ ํŠธ

๊ฐœ์ธ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉฐ ํ”„๋ก ํŠธ์—”๋“œ ์—ญ๋Ÿ‰์„ ๊ฐ•ํ™”ํ•˜๊ณ , ํ•™์Šต ๊ณผ์ •๊ณผ ๊ฒฐ๊ณผ๋ฌผ์„ ํ•จ๊ป˜ ์ •๋ฆฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ด๋‹ค.

ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ์™€ ๋ฒ”์œ„

๋ชฉํ‘œ

  • AI ํ™œ์šฉ ๊ธฐ๋ก์„ ํ†ตํ•ด AI๋ฅผ ์‚ฌ์šฉํ•œ ๊ณผ์ •๊ณผ ์‚ฐ์ถœ๋ฌผ์„ ์ •๋ฆฌํ•œ๋‹ค.
  • AGENTS.md์— ์ €์žฅ์†Œ ์ž‘์—… ๊ทœ์น™๊ณผ Codex ๊ณต๋™ ์ž‘์„ฑ ๊ธฐ์ค€์„ ๋‘”๋‹ค.
  • .codex/skills์— ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•  AI ์ž‘์—… ์ ˆ์ฐจ๋ฅผ ๋‘”๋‹ค.

MVP ๋‹จ๊ณ„

  1. 1์ฐจ MVP: ํ™ˆ, ์ด๋ ฅ์„œ, ๋ธ”๋กœ๊ทธ
    • ํ™ˆ, ์ž๊ธฐ์†Œ๊ฐœ ๋ฐ ์ด๋ ฅ์„œ, ๋ธ”๋กœ๊ทธ ๋ชฉ๋ก/์ƒ์„ธ ํŽ˜์ด์ง€๋งŒ ๋จผ์ € ๊ตฌํ˜„ํ•œ๋‹ค.
    • ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ ๊ฐœ๋ฐœ์„ ํ†ตํ•ด ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌํ˜„ ์—ญ๋Ÿ‰์„ ๊ฐ•ํ™”ํ•œ๋‹ค.
    • ์›น ํ‘œ์ค€, ์›น ์ ‘๊ทผ์„ฑ, SEO, ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฒฝํ—˜์„ ์ฝ”๋“œ์™€ ๊ธ€๋กœ ์ฆ๋น™ํ•œ๋‹ค.
    • ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ AI ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜๊ณ , ํ™œ์šฉ ๋ฐฉ์‹๊ณผ ํ•™์Šต ๋‚ด์šฉ์„ ํ•จ๊ป˜ ๊ธฐ๋กํ•œ๋‹ค.
  2. 2์ฐจ MVP: ๊ด€๋ฆฌ์ž์™€ Supabase ๊ธฐ๋ฐ˜ ๊ธ€ ๊ด€๋ฆฌ
    • ๊ธฐ์กด์—๋Š” ํŒŒ์ผ์ด๋‚˜ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋กœ ๊ธ€์„ ์ง์ ‘ ๊ด€๋ฆฌํ•œ๋‹ค.
    • 2์ฐจ MVP์—์„œ๋Š” Supabase๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ , ๊ด€๋ฆฌ์ž ํ™”๋ฉด์—์„œ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ์ถ”๊ฐ€/์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ ๋‹ค.
    • ๊ธ€ ์ž‘์„ฑ/์ˆ˜์ •/์‚ญ์ œ๋Š” ๊ด€๋ฆฌ์ž๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ œํ•œํ•œ๋‹ค.
    • ์ผ๋ฐ˜ ๋ฐฉ๋ฌธ์ž๋Š” ๊ณต๊ฐœ๋œ ๊ธ€๋งŒ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  3. 3์ฐจ MVP: ๋ชจ๋…ธ๋ ˆํฌ์™€ Cloudflare ๋ผ์šฐํŒ…
    • profile, blog, resume, craft๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ ์•ฑ์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค.
    • ์ฝ”๋“œ๋Š” ํ•˜๋‚˜์˜ ๋ชจ๋…ธ๋ ˆํฌ์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ๊ณตํ†ต ํ…Œ๋งˆ, GNB, Footer, UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŒจํ‚ค์ง€๋กœ ๊ณต์œ ํ•œ๋‹ค.
    • Cloudflare Pages Functions๋กœ ์š”์ฒญ ๊ฒฝ๋กœ์— ๋งž๋Š” ์•ฑ์œผ๋กœ ํ”„๋ก์‹œํ•œ๋‹ค.
    • ์˜ˆ: rhei.me/blog/... ์š”์ฒญ์„ blog.rhei.me/blog/... ์•ฑ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  4. ํ›„์ˆœ์œ„ ํ™•์žฅ: ๋ชจ๋ฐ”์ผ ๊ฒฝํ—˜
    • 1์ฐจ MVP์—์„œ๋Š” ๋ณ„๋„ ๋ชจ๋ฐ”์ผ ์•ฑ์„ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋ฐ˜์‘ํ˜• ์›น์œผ๋กœ ๋Œ€์‘ํ•œ๋‹ค.
    • ๋ชจ๋ฐ”์ผ์—์„œ ์ฝ๊ธฐ์™€ ํƒ์ƒ‰์ด ์ถฉ๋ถ„ํ•œ์ง€ ๋จผ์ € ํ™•์ธํ•œ๋‹ค.
    • ์•ฑ ์„ค์น˜, ํ‘ธ์‹œ ์•Œ๋ฆผ, ์˜คํ”„๋ผ์ธ ์ €์žฅ์ฒ˜๋Ÿผ ์›น๋งŒ์œผ๋กœ ๋ถ€์กฑํ•œ ์š”๊ตฌ๊ฐ€ ์ƒ๊ธฐ๋ฉด PWA ๋˜๋Š” React Native๋ฅผ ๊ฒ€ํ† ํ•œ๋‹ค.

์ฃผ์š” ๊ธฐ๋Šฅ

1์ฐจ MVP: ํ™ˆ, ์ด๋ ฅ์„œ, ๋ธ”๋กœ๊ทธ

  • ํ™ˆ ํŽ˜์ด์ง€
    • ์ด๋ฆ„๊ณผ ์–ด๋–ค ๊ฐœ๋ฐœ์ž์ธ์ง€์— ๋Œ€ํ•œ ์งง์€ ์†Œ๊ฐœ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
    • GitHub๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋งํฌ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • ๋ธ”๋กœ๊ทธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋Š” ๋ฒ„ํŠผ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ์ž๊ธฐ์†Œ๊ฐœ ๋ฐ ์ด๋ ฅ์„œ ํŽ˜์ด์ง€
    • ์–ด๋–ค ์Šคํƒ์„ ์‚ฌ์šฉํ•ด์™”๋Š”์ง€ ์ •๋ฆฌํ•œ๋‹ค.
    • ์ง€๊ธˆ๊นŒ์ง€ ํ•ด์˜จ ํ•™์Šต, ํ”„๋กœ์ ํŠธ, ๊ฒฝํ—˜์„ ๊ฐ€๋ณ๊ฒŒ ๋ณด์—ฌ์ค€๋‹ค.
    • ๊ธฐ์ˆ  ์Šคํƒ, ๊ฒฝ๋ ฅ/ํ”„๋กœ์ ํŠธ, ๊ด€์‹ฌ ๋ถ„์•ผ์™€ ์•ž์œผ๋กœ ํ™•์žฅํ•  ๋ฐฉํ–ฅ์„ ์ •๋ฆฌํ•œ๋‹ค.
  • ๋ธ”๋กœ๊ทธ ํŽ˜์ด์ง€
    • ์ž‘์„ฑํ•œ ๊ธฐ์ˆ  ๊ธ€์„ ์ตœ์‹ ์ˆœ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    • /blog์—์„œ๋Š” ๊ธ€ ๋ชฉ๋ก๊ณผ ์š”์•ฝ์„ ๋ณด์—ฌ์ค€๋‹ค.
    • /blog/[slug]์—์„œ๋Š” ์„ ํƒํ•œ ๊ธ€์˜ ๋ณธ๋ฌธ์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • ๊ณตํ†ต ํ—ค๋”
    • ์ขŒ์ธก์—๋Š” ์ด๋ฆ„์„ ๋ฐฐ์น˜ํ•œ๋‹ค.
    • ์šฐ์ธก์—๋Š” Home, Resume, Blog, GitHub ์ด๋™ ๋งํฌ๋ฅผ ๋ฐฐ์น˜ํ•œ๋‹ค.
  • SEO ๋ฐ ๊ณต์œ  ์ตœ์ ํ™”
    • ํŽ˜์ด์ง€๋ณ„ title, description, Open Graph ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
    • ๊ฒ€์ƒ‰ ๋…ธ์ถœ๊ณผ ๋งํฌ ๊ณต์œ  ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.
  • ์ ‘๊ทผ์„ฑ๊ณผ ๊ธฐ๋ณธ ํ’ˆ์งˆ
    • ์‹œ๋งจํ‹ฑ ๋งˆํฌ์—…, ํ‚ค๋ณด๋“œ ํƒ์ƒ‰, ๋ช…๋„ ๋Œ€๋น„ ๋“ฑ ๊ธฐ๋ณธ ์›น ์ ‘๊ทผ์„ฑ์„ ์ง€ํ‚จ๋‹ค.
    • Lighthouse, ์ ‘๊ทผ์„ฑ ๊ฒ€์‚ฌ, ๋นŒ๋“œ ๊ฒ€์ฆ์„ ํ†ตํ•ด ๊ธฐ๋ณธ ํ’ˆ์งˆ์„ ํ™•์ธํ•œ๋‹ค.
  • ๋ชจ๋ฐ”์ผ ๋Œ€์‘
    • 1์ฐจ MVP์—์„œ๋Š” ๋ฐ˜์‘ํ˜• ์›น์œผ๋กœ ๋ชจ๋ฐ”์ผ ํ™”๋ฉด์„ ์ง€์›ํ•œ๋‹ค.
    • ๋ณ„๋„ React Native ์•ฑ์€ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
    • ๋ชจ๋ฐ”์ผ ์•ฑ์ด ํ•„์š”ํ•œ ์ด์œ ๊ฐ€ ๋ช…ํ™•ํ•ด์งˆ ๋•Œ PWA ๋˜๋Š” React Native๋ฅผ ๋น„๊ต ๊ฒ€ํ† ํ•œ๋‹ค.

๋กœ์ปฌ ์‹คํ–‰ ๋ฐฉ๋ฒ•

Node.js ๋ฒ„์ „

์ด ํ”„๋กœ์ ํŠธ๋Š” Node.js 22.x๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์‹คํ–‰ํ•œ๋‹ค.

nvm use

Node.js 24.x๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, 1์ฐจ MVP์—์„œ๋Š” ์ตœ์‹  ๊ธฐ๋Šฅ๋ณด๋‹ค ์•ˆ์ •์ ์ธ LTS ํ™˜๊ฒฝ์ด ๋” ์ค‘์š”ํ•˜๋ฏ€๋กœ Vercel๊ณผ ๋กœ์ปฌ ๊ธฐ์ค€์„ 22.x๋กœ ๋งž์ถ˜๋‹ค.

์„ค์น˜

npm install

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰

npm run dev

๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰ ํ›„ ๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:3000์œผ๋กœ ์ ‘์†ํ•œ๋‹ค.

ํ’ˆ์งˆ ๊ฒ€์ฆ

npm run lint
npm run format:check
npm run type-check
npm run build

ํฌ๋งทํŒ…

npm run format

๋ฐฐํฌ

  • Production URL: https://tech-blog-delta.vercel.app
  • ๋ฐฐํฌ ํ”Œ๋žซํผ: Vercel
  • production branch: main
  • Web Analytics: @vercel/analytics
  • Speed Insights: @vercel/speed-insights

main ๋ธŒ๋žœ์น˜์— push๋˜๋ฉด Vercel production deployment๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๊ฐœ๋ณ„ deployment URL์€ ๋ฐฐํฌ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ README์—๋Š” production URL๋งŒ ๊ธฐ๋กํ•œ๋‹ค. Vercel Project Settings์˜ Build/Output/Install/Development Command override๋Š” ๋„๊ณ , Next.js preset ๊ธฐ๋ณธ๊ฐ’์„ ์‚ฌ์šฉํ•œ๋‹ค.

2์ฐจ MVP: ๊ด€๋ฆฌ์ž์™€ Supabase ๊ธฐ๋ฐ˜ ๊ธ€ ๊ด€๋ฆฌ

  • Supabase ์—ฐ๋™
    • ๋ธ”๋กœ๊ทธ ๊ธ€, ํƒœ๊ทธ, ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ DB๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ๊ณต๊ฐœ ํŽ˜์ด์ง€์—์„œ๋Š” published ์ƒํƒœ์˜ ๊ธ€๋งŒ ์กฐํšŒํ•œ๋‹ค.
  • ๊ด€๋ฆฌ์ž ์ธ์ฆ
    • ๊ด€๋ฆฌ์ž๋งŒ ๊ธ€ ์ž‘์„ฑ/์ˆ˜์ •/์‚ญ์ œ ํ™”๋ฉด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    • ์ผ๋ฐ˜ ๋ฐฉ๋ฌธ์ž๋Š” ๊ด€๋ฆฌ์ž ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
  • ๊ธ€ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ
    • ๊ด€๋ฆฌ์ž ํ™”๋ฉด์—์„œ ๊ธ€์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
    • ๊ธฐ์กด ๊ธ€์„ ์ˆ˜์ •ํ•œ๋‹ค.
    • draft/published ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ํƒœ๊ทธ์™€ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๊ณต๊ฐœ ์กฐํšŒ
    • ๋ฐฉ๋ฌธ์ž๋Š” ๊ณต๊ฐœ๋œ ๊ธ€ ๋ชฉ๋ก๊ณผ ๊ธ€ ๋‚ด์šฉ์„ ์กฐํšŒํ•œ๋‹ค.
    • ๋น„๊ณต๊ฐœ draft ๊ธ€์€ ๊ณต๊ฐœ ํ™”๋ฉด์— ๋…ธ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค.

3์ฐจ MVP: ๋ชจ๋…ธ๋ ˆํฌ์™€ Cloudflare ๋ผ์šฐํŒ…

  • ์•ฑ ๋ถ„๋ฆฌ
    • profile, blog, resume, craft ์•ฑ์„ ๋ชจ๋…ธ๋ ˆํฌ ์•ˆ์—์„œ ๋ถ„๋ฆฌํ•œ๋‹ค.
    • ๊ฐ ์•ฑ์€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ๊ณตํ†ต ํŒจํ‚ค์ง€
    • Tailwind ํ…Œ๋งˆ, GNB, Footer, ๊ณตํ†ต UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.
    • metadata, config ๋“ฑ๋„ ๊ณตํ†ต ํŒจํ‚ค์ง€๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.
  • Cloudflare ๋ผ์šฐํŒ…
    • Cloudflare Pages Functions๋กœ ๋‹จ์ผ ๋„๋ฉ”์ธ ๊ฒฝ๋กœ๋ฅผ ๊ฐ ์•ฑ์œผ๋กœ ํ”„๋ก์‹œํ•œ๋‹ค.
    • ์˜ˆ: /blog/...๋Š” blog ์•ฑ์œผ๋กœ, /resume/...์€ resume ์•ฑ์œผ๋กœ, /craft/...๋Š” craft ์•ฑ์œผ๋กœ ์ „๋‹ฌํ•œ๋‹ค.
  • Craft
    • ๋ธ”๋กœ๊ทธ์—์„œ ๋‹ค๋ฃฌ ๊ฐœ๋…์„ ์‹œ๊ฐํ™”ํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์‹คํ—˜ํ•  ์ˆ˜ ์žˆ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.
    • ์˜ˆ: ๋””๋ฐ”์šด์Šค, ์“ฐ๋กœํ‹€, ๋ Œ๋”๋ง ์ตœ์ ํ™”, ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ ํ๋ฆ„

๊ธฐ์ˆ  ์Šคํƒ

  • ๋นŒ๋“œ ๋„๊ตฌ: Next.js ๊ธฐ๋ณธ ๋นŒ๋“œ ์‹œ์Šคํ…œ
  • ํ”„๋ ˆ์ž„์›Œํฌ: Next.js
    • ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ๋Š” ๊ฒ€์ƒ‰ ๋…ธ์ถœ, ๊ณต์œ  ๋ฏธ๋ฆฌ๋ณด๊ธฐ, ํŽ˜์ด์ง€๋ณ„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘์š”ํ•˜๋ฏ€๋กœ SEO ๊ตฌ์„ฑ์ด ์‰ฌ์šด Next.js๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์–ธ์–ด: TypeScript
    • ์ •์  ํƒ€์ž…์„ ํ†ตํ•ด ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ธ๋‹ค.
  • ์Šคํƒ€์ผ๋ง: Tailwind CSS
    • ๋น ๋ฅธ UI ๊ตฌํ˜„๊ณผ ์ผ๊ด€๋œ ์Šคํƒ€์ผ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
  • UI ์ปดํฌ๋„ŒํŠธ: shadcn/ui
    • ์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ง์ ‘ ๊ฐ€์ ธ์™€ ์†Œ์œ ํ•˜๊ณ  ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ƒํƒœ ๊ด€๋ฆฌ: Context + reducer, TanStack Query, Zustand
    • 1์ฐจ MVP์—์„œ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ Context + reducer๋กœ ๋‹จ์ˆœํ•˜๊ฒŒ ์‹œ์ž‘ํ•œ๋‹ค.
    • ์„œ๋ฒ„ ์ƒํƒœ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด TanStack Query๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ „์—ญ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ๊ฐ€ ๋ณต์žกํ•ด์งˆ ๊ฒฝ์šฐ Zustand๋ฅผ ๊ฒ€ํ† ํ•œ๋‹ค.
  • ํผ: React Hook Form
    • ์ž…๋ ฅ ํผ์ด ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด ์ƒ๊ธฐ๋ฉด React Hook Form์„ ์šฐ์„  ๊ฒ€ํ† ํ•œ๋‹ค.
  • API ํ†ต์‹ : fetch
    • Next.js์˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ, ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ, ์บ์‹ฑ ๋ฐ ์žฌ๊ฒ€์ฆ ์˜ต์…˜๊ณผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ fetch๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • axios๋Š” ๊ธฐ๋ณธ ์„ ํƒ์ง€๋กœ ๋‘์ง€ ์•Š๋Š”๋‹ค.
    • ํ•„์š”ํ•œ ๊ฒฝ์šฐ fetch ๋ž˜ํผ๋ฅผ ๋งŒ๋“ค์–ด ๊ณตํ†ต ์—๋Ÿฌ ์ฒ˜๋ฆฌ, ์ธ์ฆ ํ—ค๋”, ์‘๋‹ต ํŒŒ์‹ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ: Vitest, Playwright
    • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ…Œ์ŠคํŠธ๋Š” Vitest๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ฃผ์š” ์‚ฌ์šฉ์ž ํ๋ฆ„์˜ E2E ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด Playwright๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • Cypress๋Š” ๋ณ„๋„ ํ•„์š”๊ฐ€ ์ƒ๊ธธ ๋•Œ ๋น„๊ต ๊ฒ€ํ† ํ•œ๋‹ค.
  • ๋ชจ๋ฐ”์ผ ์•ฑ: ํ›„์ˆœ์œ„ ๊ฒ€ํ† 
    • 1์ฐจ MVP์—์„œ๋Š” Next.js ๋ฐ˜์‘ํ˜• ์›น์œผ๋กœ ๋ชจ๋ฐ”์ผ ์‚ฌ์šฉ์„ฑ์„ ํ™•๋ณดํ•œ๋‹ค.
    • ์„ค์น˜ํ˜• ์•ฑ ๊ฒฝํ—˜์ด ํ•„์š”ํ•˜๋ฉด ๋จผ์ € PWA๋ฅผ ๊ฒ€ํ† ํ•œ๋‹ค.
    • ๋„ค์ดํ‹ฐ๋ธŒ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ด์ง€๋ฉด React Native ๋˜๋Š” Expo๋ฅผ ๊ฒ€ํ† ํ•œ๋‹ค.

ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €

  • 1์ฐจ MVP: npm
    • ์ดˆ๊ธฐ ๋‹จ์ผ Next.js ๋ธ”๋กœ๊ทธ๋Š” npm์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.
    • ๋ณ„๋„ ์„ค์น˜ ์—†์ด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•˜๊ธฐ ์ข‹๋‹ค.
    • lockfile์€ package-lock.json๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.
  • 3์ฐจ MVP: pnpm ๊ฒ€ํ† 
    • ์ถ”ํ›„ apps/profile, apps/blog, apps/resume, apps/craft, packages/ui, packages/meta์ฒ˜๋Ÿผ ๋ชจ๋…ธ๋ ˆํฌ๋กœ ํ™•์žฅํ•˜๋ฉด pnpm์„ ๊ฒ€ํ† ํ•œ๋‹ค.
    • pnpm์€ ์„ค์น˜ ์†๋„์™€ ๋””์Šคํฌ ํšจ์œจ์ด ์ข‹๊ณ  workspace ๊ธฐ๋Šฅ์ด ๊ฐ•ํ•˜๋‹ค.
    • pnpm ๋„์ž… ์‹œ lockfile์€ pnpm-lock.yaml๋งŒ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฐฐํฌ ํ”Œ๋žซํผ

  • 1์ฐจ MVP: Vercel
    • Next.js ๋ฐฐํฌ์™€ preview deployment ๊ตฌ์„ฑ์ด ์‰ฌ์›Œ ๋น ๋ฅธ MVP ๋ฐฐํฌ์— ์ ํ•ฉํ•˜๋‹ค.
    • ํ™˜๊ฒฝ ๋ณ€์ˆ˜, preview URL ์ ‘๊ทผ, API ์ธ์ฆ, DB ๊ถŒํ•œ ์„ค์ •์€ ํ”„๋กœ์ ํŠธ์—์„œ ์ง์ ‘ ๊ด€๋ฆฌํ•œ๋‹ค.
    • Vercel ์ž์ฒด๊ฐ€ ๋ณด์•ˆ์ƒ ๋‚˜์œ ์„ ํƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์„ค์ •์„ ์ž˜๋ชปํ•˜๋ฉด ๋ฏผ๊ฐ ์ •๋ณด ๋…ธ์ถœ์ด๋‚˜ preview ์ ‘๊ทผ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • 3์ฐจ MVP: Cloudflare ๊ฒ€ํ† 
    • ๋ชจ๋…ธ๋ ˆํฌ ํ™•์žฅ, CDN/WAF, edge ์ „๋žต, ๋น„์šฉ ๊ตฌ์กฐ๊ฐ€ ์ค‘์š”ํ•ด์งˆ ๋•Œ Cloudflare Pages ๋˜๋Š” Cloudflare Workers๋ฅผ ๊ฒ€ํ† ํ•œ๋‹ค.
    • ๋‹จ์ˆœ ๋ธ”๋กœ๊ทธ MVP ๋‹จ๊ณ„์—์„œ๋Š” ๋จผ์ € ๋„์ž…ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ปจ๋ฒค์…˜

๋ธŒ๋žœ์น˜

๋ธŒ๋žœ์น˜๋Š” main, dev, ์ž‘์—… ๋ธŒ๋žœ์น˜๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

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

๋ธŒ๋žœ์น˜ ์ด๋ฆ„ ํ˜•์‹:

ํƒ€์ž…/์ž‘์—…-์ด๋ฆ„

๋ธŒ๋žœ์น˜ ์ด๋ฆ„ ์˜ˆ์‹œ:

feature/blog-list
feature/post-detail
fix/markdown-parser
refactor/post-model
docs/readme
style/mobile-layout
chore/next-config
test/post-parser

๋ธŒ๋žœ์น˜ ํƒ€์ž…:

  • feature: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • fix: ๋ฒ„๊ทธ ์ˆ˜์ •
  • refactor: ๋™์ž‘ ๋ณ€๊ฒฝ ์—†๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ๊ฐœ์„ 
  • docs: ๋ฌธ์„œ ์ˆ˜์ •
  • style: CSS, UI ์Šคํƒ€์ผ ์ˆ˜์ •
  • chore: ์„ค์ •, ํŒจํ‚ค์ง€, ๋นŒ๋“œ ๊ด€๋ จ ์ž‘์—…
  • test: ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋˜๋Š” ์ˆ˜์ •

์ปค๋ฐ‹

์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€๋Š” Conventional Commits ํ˜•์‹์„ ๋”ฐ๋ฅธ๋‹ค.

  • ์ปค๋ฐ‹ ๋‚ด์šฉ์€ ํ•œ๊ตญ์–ด๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • subject ๋ฌธ์žฅ์€ ~ํ•œ๋‹ค ํ˜•์‹์œผ๋กœ ๋๋‚ธ๋‹ค.
  • body์™€ footer๋Š” ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ž‘์„ฑํ•œ๋‹ค.

์ปค๋ฐ‹ ํ˜•์‹:

type(scope)!: subject

body

footer

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” type: subject ํ˜•์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ํ–ฅ ๋ฒ”์œ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋งŒ scope๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ˜ธํ™˜์„ฑ์ด ๊นจ์ง€๋Š” ๋ณ€๊ฒฝ์€ ! ๋˜๋Š” footer์˜ BREAKING CHANGE:๋กœ ํ‘œ์‹œํ•œ๋‹ค.

์ปค๋ฐ‹ ์˜ˆ์‹œ:

docs: ๊ธฐ์ˆ ์Šคํƒ ์„ ์ • ์ด์œ ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค
feature: ํ™ˆ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค
feature: ๋ธ”๋กœ๊ทธ ๊ธ€ ๋ชฉ๋ก ํŽ˜์ด์ง€๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
fix: draft ๊ฒŒ์‹œ๊ธ€์ด ๋…ธ์ถœ๋˜๋Š” ๋ฌธ์ œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค
refactor: ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ ๋กœ์ง์„ ๋ณ„๋„ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค
style: ๋ชจ๋ฐ”์ผ ๊ธ€ ๋ชฉ๋ก ๋ ˆ์ด์•„์›ƒ์„ ๊ฐœ์„ ํ•œ๋‹ค
chore: Next.js ์ดˆ๊ธฐ ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ๋‹ค
test: ๊ฒŒ์‹œ๊ธ€ ์ •๋ ฌ ๋กœ์ง ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค
feature(blog): slug ๊ธฐ๋ฐ˜ ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ธ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค
fix(post)!: ๊ฒŒ์‹œ๊ธ€ slug ์ƒ์„ฑ ๋ฐฉ์‹์„ ๋ณ€๊ฒฝํ•œ๋‹ค

์ปค๋ฐ‹ ํƒ€์ž…:

  • feature: ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • fix: ๋ฒ„๊ทธ ์ˆ˜์ •
  • refactor: ๋™์ž‘ ๋ณ€๊ฒฝ ์—†๋Š” ์ฝ”๋“œ ๊ตฌ์กฐ ๊ฐœ์„ 
  • docs: ๋ฌธ์„œ ์ˆ˜์ •
  • style: UI ์Šคํƒ€์ผ ์ˆ˜์ •
  • chore: ์„ค์ •, ํŒจํ‚ค์ง€, ๋นŒ๋“œ ๊ด€๋ จ ์ž‘์—…
  • test: ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๋˜๋Š” ์ˆ˜์ •

body ์ž‘์„ฑ ๊ธฐ์ค€:

  • ๋ณ€๊ฒฝ ์ด์œ ๋‚˜ ๊ตฌํ˜„ ์˜๋„๋ฅผ subject๋งŒ์œผ๋กœ ์„ค๋ช…ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋ฌด์—‡์„ ๋ฐ”๊ฟจ๋Š”์ง€๋ณด๋‹ค ์™œ ๋ฐ”๊ฟจ๋Š”์ง€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

footer ์ž‘์„ฑ ๊ธฐ์ค€:

  • BREAKING CHANGE:๊ฐ€ ์žˆ์„ ๋•Œ ์ž‘์„ฑํ•œ๋‹ค.
  • ๊ด€๋ จ ์ด์Šˆ๋‚˜ ์ฐธ๊ณ  ๋งํฌ๋ฅผ ๋‚จ๊ฒจ์•ผ ํ•  ๋•Œ ์ž‘์„ฑํ•œ๋‹ค.
  • Codex๊ฐ€ ์ฝ”๋“œ, ๋ฌธ์„œ, ์„ค์ •, ์›Œํฌํ”Œ๋กœ์šฐ, ์Šคํ‚ฌ ๋“ฑ ์ปค๋ฐ‹๋˜๋Š” ์‚ฐ์ถœ๋ฌผ์„ ์ง์ ‘ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ Co-authored-by: Codex <codex@openai.com>๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ ์ž‘์—…์„ ํ•˜๊ณ  Codex๊ฐ€ ์งˆ๋ฌธ ๋‹ต๋ณ€, ๊ฐ€๋ฒผ์šด ๊ฒ€ํ† , ํ‘œํ˜„ ํ™•์ธ๋งŒ ํ•œ ๊ฒฝ์šฐ์—๋Š” Co-authored-by๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.
  • ๋‹จ์ˆœ ํฌ๋งท ๋ณ€๊ฒฝ, ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ, ๋‚ฎ์€ ๊ฐ€์น˜์˜ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ƒ์„ฑ์—๋„ Co-authored-by๋ฅผ ๋‚จ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

๋ฆฐํ„ฐ & ํ”„๋ฆฌํ‹ฐ์–ด

  • ๋ฆฐํ„ฐ: ESLint
    • Next.js, React, TypeScript์—์„œ ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ ๋ฌธ์ œ๋ฅผ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์žก๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.
    • Next.js ๊ถŒ์žฅ ์„ค์ •์ธ eslint-config-next/core-web-vitals๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • TypeScript ๊ทœ์น™์€ eslint-config-next/typescript๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค.
  • ํฌ๋งทํ„ฐ: Prettier
    • ์ฝ”๋“œ ์Šคํƒ€์ผ์€ ESLint๊ฐ€ ์•„๋‹ˆ๋ผ Prettier๊ฐ€ ์ „๋‹ดํ•œ๋‹ค.
    • ๋“ค์—ฌ์“ฐ๊ธฐ, ์ค„๋ฐ”๊ฟˆ, ๋”ฐ์˜ดํ‘œ ๋“ฑ ์Šคํƒ€์ผ ๋…ผ์Ÿ์„ ์ค„์ด๊ณ  ์ผ๊ด€๋œ ์ฝ”๋“œ ํฌ๋งท์„ ์œ ์ง€ํ•œ๋‹ค.
  • ESLint์™€ Prettier ์ถฉ๋Œ ๋ฐฉ์ง€
    • eslint-config-prettier๋ฅผ ์‚ฌ์šฉํ•ด Prettier์™€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ๋Š” ESLint ์Šคํƒ€์ผ ๊ทœ์น™์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค.
    • eslint-plugin-prettier๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๋ฆฐํŠธ์™€ ํฌ๋งทํŒ… ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•ด ์„ค์ •์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.
  • Tailwind ํด๋ž˜์Šค ์ •๋ ฌ
    • prettier-plugin-tailwindcss๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • Tailwind ํด๋ž˜์Šค ์ˆœ์„œ๋ฅผ ์ž๋™ ์ •๋ ฌํ•ด className ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.

์‹คํ–‰ ๋ช…๋ น์–ด:

npm run lint
npm run lint:fix
npm run format
npm run format:check
npm run type-check
npm run build

ํ”„๋ก ํŠธ์—”๋“œ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

1์ฐจ MVP: Layer-based

์ดˆ๊ธฐ์—๋Š” ๊ธฐ๋Šฅ ์ˆ˜๊ฐ€ ๋งŽ์ง€ ์•Š์œผ๋ฏ€๋กœ ๋‹จ์ˆœํ•œ ๊ณ„์ธต ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

src/                      # ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ
โ”œโ”€ app/                   # Next.js App Router ๋ผ์šฐํŠธ
โ”‚  โ”œโ”€ page.tsx            # ํ™ˆ ํŽ˜์ด์ง€
โ”‚  โ”œโ”€ resume/             # ์ž๊ธฐ์†Œ๊ฐœ ๋ฐ ์ด๋ ฅ์„œ ํŽ˜์ด์ง€ ๋ผ์šฐํŠธ
โ”‚  โ”‚  โ””โ”€ page.tsx
โ”‚  โ””โ”€ blog/               # ๋ธ”๋กœ๊ทธ ํŽ˜์ด์ง€ ๋ผ์šฐํŠธ
โ”‚     โ”œโ”€ page.tsx         # ๋ธ”๋กœ๊ทธ ๊ธ€ ๋ชฉ๋ก ํŽ˜์ด์ง€
โ”‚     โ””โ”€ [slug]/          # slug ๊ธฐ๋ฐ˜ ๋ธ”๋กœ๊ทธ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋ผ์šฐํŠธ
โ”‚        โ””โ”€ page.tsx
โ”œโ”€ components/            # ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ์žฌ์‚ฌ์šฉ UI ์ปดํฌ๋„ŒํŠธ
โ”œโ”€ hooks/                 # React custom hook
โ”œโ”€ lib/                   # ๋„๋ฉ”์ธ์— ์ข…์†๋œ ํ•จ์ˆ˜
โ”œโ”€ utils/                 # ๋„๋ฉ”์ธ๊ณผ ๋ฌด๊ด€ํ•œ ์ˆœ์ˆ˜ ๊ณตํ†ต ํ•จ์ˆ˜
โ””โ”€ types/                 # ์—ฌ๋Ÿฌ ํŒŒ์ผ์—์„œ ๊ณต์œ ํ•˜๋Š” TypeScript ํƒ€์ž…
  • lib ์˜ˆ์‹œ: ๋ธ”๋กœ๊ทธ ๊ธ€ ์กฐํšŒ, Markdown/MDX ์ฒ˜๋ฆฌ
  • utils ์˜ˆ์‹œ: ๋‚ ์งœ ํฌ๋งท, ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ

3์ฐจ MVP: ๋ชจ๋…ธ๋ ˆํฌ ๊ตฌ์กฐ ๊ฒ€ํ† 

profile, blog, resume, craft ์•ฑ๊ณผ ๊ณตํ†ต UI ํŒจํ‚ค์ง€ ๋“ฑ์œผ๋กœ ๊ธฐ๋Šฅ์ด ๋Š˜์–ด๋‚˜๋ฉด ๋ชจ๋…ธ๋ ˆํฌ ๊ตฌ์กฐ๋กœ ์ „ํ™˜ํ•œ๋‹ค.

apps/
โ”œโ”€ profile/
โ”œโ”€ blog/
โ”œโ”€ resume/
โ””โ”€ craft/
packages/
โ”œโ”€ ui/
โ”œโ”€ meta/
โ””โ”€ config/

๋ฐฐํฌ์™€ ๊ฒ€์ฆ ํ๋ฆ„

๋ฐฐํฌ ํ”Œ๋žซํผ์€ MVP ๋‹จ๊ณ„์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค.

  • 1์ฐจ MVP: Vercel
    • Next.js ๋ธ”๋กœ๊ทธ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด Vercel์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • Vercel์— GitHub repository๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค.
    • main ๋ธŒ๋žœ์น˜์— ๋จธ์ง€๋˜๋ฉด production deployment๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ ํ•œ๋‹ค.
    • ์ž‘์—… ๋ธŒ๋žœ์น˜ ๋˜๋Š” PR์—์„œ๋Š” Vercel preview deployment๋กœ ๋ฐฐํฌ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•œ๋‹ค.
    • GitHub Actions๋Š” 1์ฐจ MVP์—์„œ๋Š” ํ•„์ˆ˜๋กœ ๋„์ž…ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • 3์ฐจ MVP: Cloudflare ๊ฒ€ํ† 
    • profile, blog, resume, craft๊ฐ€ ๋…๋ฆฝ ์•ฑ์œผ๋กœ ๋‚˜๋‰˜๋ฉด Cloudflare Pages Functions๋กœ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ํ”„๋ก์‹œ๋ฅผ ๊ฒ€ํ† ํ•œ๋‹ค.
    • Cloudflare ์ „ํ™˜ ๋˜๋Š” ๋ชจ๋…ธ๋ ˆํฌ ๊ฒ€์ฆ ์ž๋™ํ™”๊ฐ€ ํ•„์š”ํ•ด์งˆ ๋•Œ GitHub Actions๋ฅผ ๋„์ž…ํ•œ๋‹ค.
    • CDN, edge runtime, ๋น„์šฉ ๊ตฌ์กฐ, ์บ์‹ฑ ์ „๋žต์ด ์ค‘์š”ํ•ด์งˆ ๋•Œ ์ „ํ™˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.

์ฝ”๋“œ ๊ฒ€์ฆ

1์ฐจ MVP์—์„œ๋Š” ๋กœ์ปฌ์—์„œ ๋‹ค์Œ ๊ฒ€์ฆ์„ ์‹คํ–‰ํ•œ๋‹ค.

  • lint: ESLint ๊ฒ€์‚ฌ
  • format:check: Prettier ํฌ๋งท ๊ฒ€์‚ฌ
  • type-check: TypeScript ํƒ€์ž… ๊ฒ€์‚ฌ
  • test: ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
  • build: Next.js ๋นŒ๋“œ ๊ฒ€์ฆ

GitHub Actions๋Š” 3์ฐจ MVP์—์„œ Cloudflare, ๋ชจ๋…ธ๋ ˆํฌ, ์•ฑ๋ณ„ ๋ฐฐํฌ ๊ฒ€์ฆ์ด ํ•„์š”ํ•ด์งˆ ๋•Œ ์ถ”๊ฐ€ํ•œ๋‹ค.

๋ธŒ๋žœ์น˜ ํ๋ฆ„

  • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ, ๋ฒ„๊ทธ ์ˆ˜์ •, ๋ฌธ์„œ ์ˆ˜์ •์€ ์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ ์ง„ํ–‰ํ•œ๋‹ค.
  • ์ž‘์—… ์ค‘์—๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ž‘์—… ๋ธŒ๋žœ์น˜์— pushํ•œ๋‹ค.
  • ๊ธฐ๋Šฅ ๋‹จ์œ„ ์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ์ž‘์—… ๋ธŒ๋žœ์น˜์—์„œ dev๋กœ PR์„ ์ƒ์„ฑํ•œ๋‹ค.
  • PR์—์„œ ์ถฉ๋Œ ์—ฌ๋ถ€์™€ Vercel preview deployment๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • ๊ฒ€์ฆ์ด ๋๋‚œ PR๋งŒ dev๋กœ ๋จธ์ง€ํ•œ๋‹ค.
  • ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋˜๋ฉด dev๋ฅผ main์œผ๋กœ ๋จธ์ง€ํ•œ๋‹ค.
  • main์— ๋ฐ˜์˜๋˜๋ฉด production deployment๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

PR ์‚ฌ์šฉ ๊ธฐ์ค€

  • ๋ชจ๋“  ์ปค๋ฐ‹๋งˆ๋‹ค PR์„ ๋งŒ๋“ค์ง€๋Š” ์•Š๋Š”๋‹ค.
  • ๊ธฐ๋Šฅ ๋‹จ์œ„ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์–ด dev์— ๋จธ์ง€ํ•  ๋•Œ PR์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • PR์—์„œ๋Š” ์ถฉ๋Œ ์—ฌ๋ถ€์™€ preview deployment๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • ๊ฐ„๋‹จํ•œ ๋ฌธ์„œ ์ˆ˜์ •์ด๋‚˜ ์˜คํƒ€ ์ˆ˜์ •์€ PR ์—†์ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

About

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors