๊ฐ์ธ ๊ธฐ์ ๋ธ๋ก๊ทธ๋ฅผ ๊ฐ๋ฐํ๋ฉฐ ํ๋ก ํธ์๋ ์ญ๋์ ๊ฐํํ๊ณ , ํ์ต ๊ณผ์ ๊ณผ ๊ฒฐ๊ณผ๋ฌผ์ ํจ๊ป ์ ๋ฆฌํ๋ ํ๋ก์ ํธ์ด๋ค.
- AI ํ์ฉ ๊ธฐ๋ก์ ํตํด AI๋ฅผ ์ฌ์ฉํ ๊ณผ์ ๊ณผ ์ฐ์ถ๋ฌผ์ ์ ๋ฆฌํ๋ค.
- AGENTS.md์ ์ ์ฅ์ ์์ ๊ท์น๊ณผ Codex ๊ณต๋ ์์ฑ ๊ธฐ์ค์ ๋๋ค.
- .codex/skills์ ๋ฐ๋ณตํด์ ์ฌ์ฉํ AI ์์ ์ ์ฐจ๋ฅผ ๋๋ค.
- 1์ฐจ MVP: ํ, ์ด๋ ฅ์, ๋ธ๋ก๊ทธ
- ํ, ์๊ธฐ์๊ฐ ๋ฐ ์ด๋ ฅ์, ๋ธ๋ก๊ทธ ๋ชฉ๋ก/์์ธ ํ์ด์ง๋ง ๋จผ์ ๊ตฌํํ๋ค.
- ๊ธฐ์ ๋ธ๋ก๊ทธ ๊ฐ๋ฐ์ ํตํด ํ๋ก ํธ์๋ ๊ตฌํ ์ญ๋์ ๊ฐํํ๋ค.
- ์น ํ์ค, ์น ์ ๊ทผ์ฑ, SEO, ์ฑ๋ฅ ์ต์ ํ ๊ฒฝํ์ ์ฝ๋์ ๊ธ๋ก ์ฆ๋นํ๋ค.
- ๊ฐ๋ฐ ๊ณผ์ ์์ AI ๋๊ตฌ๋ฅผ ํ์ฉํ๊ณ , ํ์ฉ ๋ฐฉ์๊ณผ ํ์ต ๋ด์ฉ์ ํจ๊ป ๊ธฐ๋กํ๋ค.
- 2์ฐจ MVP: ๊ด๋ฆฌ์์ Supabase ๊ธฐ๋ฐ ๊ธ ๊ด๋ฆฌ
- ๊ธฐ์กด์๋ ํ์ผ์ด๋ ์ํ ๋ฐ์ดํฐ๋ก ๊ธ์ ์ง์ ๊ด๋ฆฌํ๋ค.
- 2์ฐจ MVP์์๋ Supabase๋ฅผ ์ฐ๊ฒฐํ๊ณ , ๊ด๋ฆฌ์ ํ๋ฉด์์ ๋ธ๋ก๊ทธ ๊ธ์ ์ถ๊ฐ/์์ ํ ์ ์๊ฒ ๋ง๋ ๋ค.
- ๊ธ ์์ฑ/์์ /์ญ์ ๋ ๊ด๋ฆฌ์๋ง ๊ฐ๋ฅํ๊ฒ ์ ํํ๋ค.
- ์ผ๋ฐ ๋ฐฉ๋ฌธ์๋ ๊ณต๊ฐ๋ ๊ธ๋ง ๋ณผ ์ ์๊ฒ ํ๋ค.
- 3์ฐจ MVP: ๋ชจ๋
ธ๋ ํฌ์ Cloudflare ๋ผ์ฐํ
- profile, blog, resume, craft๋ฅผ ๊ฐ๊ฐ ๋ ๋ฆฝ ์ฑ์ผ๋ก ๋๋๋ค.
- ์ฝ๋๋ ํ๋์ ๋ชจ๋ ธ๋ ํฌ์์ ๊ด๋ฆฌํ๋ค.
- ๊ณตํต ํ ๋ง, GNB, Footer, UI ์ปดํฌ๋ํธ๋ฅผ ํจํค์ง๋ก ๊ณต์ ํ๋ค.
- Cloudflare Pages Functions๋ก ์์ฒญ ๊ฒฝ๋ก์ ๋ง๋ ์ฑ์ผ๋ก ํ๋ก์ํ๋ค.
- ์:
rhei.me/blog/...์์ฒญ์blog.rhei.me/blog/...์ฑ์ผ๋ก ์ ๋ฌํ๋ค.
- ํ์์ ํ์ฅ: ๋ชจ๋ฐ์ผ ๊ฒฝํ
- 1์ฐจ MVP์์๋ ๋ณ๋ ๋ชจ๋ฐ์ผ ์ฑ์ ๋ง๋ค์ง ์๊ณ ๋ฐ์ํ ์น์ผ๋ก ๋์ํ๋ค.
- ๋ชจ๋ฐ์ผ์์ ์ฝ๊ธฐ์ ํ์์ด ์ถฉ๋ถํ์ง ๋จผ์ ํ์ธํ๋ค.
- ์ฑ ์ค์น, ํธ์ ์๋ฆผ, ์คํ๋ผ์ธ ์ ์ฅ์ฒ๋ผ ์น๋ง์ผ๋ก ๋ถ์กฑํ ์๊ตฌ๊ฐ ์๊ธฐ๋ฉด PWA ๋๋ React Native๋ฅผ ๊ฒํ ํ๋ค.
- ํ ํ์ด์ง
- ์ด๋ฆ๊ณผ ์ด๋ค ๊ฐ๋ฐ์์ธ์ง์ ๋ํ ์งง์ ์๊ฐ๋ฅผ ๋ณด์ฌ์ค๋ค.
- GitHub๋ก ์ด๋ํ ์ ์๋ ๋งํฌ๋ฅผ ์ ๊ณตํ๋ค.
- ๋ธ๋ก๊ทธ ํ์ด์ง๋ก ์ด๋ํ๋ ๋ฒํผ์ ์ ๊ณตํ๋ค.
- ์๊ธฐ์๊ฐ ๋ฐ ์ด๋ ฅ์ ํ์ด์ง
- ์ด๋ค ์คํ์ ์ฌ์ฉํด์๋์ง ์ ๋ฆฌํ๋ค.
- ์ง๊ธ๊น์ง ํด์จ ํ์ต, ํ๋ก์ ํธ, ๊ฒฝํ์ ๊ฐ๋ณ๊ฒ ๋ณด์ฌ์ค๋ค.
- ๊ธฐ์ ์คํ, ๊ฒฝ๋ ฅ/ํ๋ก์ ํธ, ๊ด์ฌ ๋ถ์ผ์ ์์ผ๋ก ํ์ฅํ ๋ฐฉํฅ์ ์ ๋ฆฌํ๋ค.
- ๋ธ๋ก๊ทธ ํ์ด์ง
- ์์ฑํ ๊ธฐ์ ๊ธ์ ์ต์ ์์ผ๋ก ํ์ธํ ์ ์๊ฒ ํ๋ค.
/blog์์๋ ๊ธ ๋ชฉ๋ก๊ณผ ์์ฝ์ ๋ณด์ฌ์ค๋ค./blog/[slug]์์๋ ์ ํํ ๊ธ์ ๋ณธ๋ฌธ์ ์ฝ์ ์ ์๊ฒ ํ๋ค.
- ๊ณตํต ํค๋
- ์ข์ธก์๋ ์ด๋ฆ์ ๋ฐฐ์นํ๋ค.
- ์ฐ์ธก์๋
Home,Resume,Blog,GitHub์ด๋ ๋งํฌ๋ฅผ ๋ฐฐ์นํ๋ค.
- SEO ๋ฐ ๊ณต์ ์ต์ ํ
- ํ์ด์ง๋ณ title, description, Open Graph ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๋ค.
- ๊ฒ์ ๋ ธ์ถ๊ณผ ๋งํฌ ๊ณต์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๊ณ ๋ คํ๋ค.
- ์ ๊ทผ์ฑ๊ณผ ๊ธฐ๋ณธ ํ์ง
- ์๋งจํฑ ๋งํฌ์ , ํค๋ณด๋ ํ์, ๋ช ๋ ๋๋น ๋ฑ ๊ธฐ๋ณธ ์น ์ ๊ทผ์ฑ์ ์งํจ๋ค.
- Lighthouse, ์ ๊ทผ์ฑ ๊ฒ์ฌ, ๋น๋ ๊ฒ์ฆ์ ํตํด ๊ธฐ๋ณธ ํ์ง์ ํ์ธํ๋ค.
- ๋ชจ๋ฐ์ผ ๋์
- 1์ฐจ MVP์์๋ ๋ฐ์ํ ์น์ผ๋ก ๋ชจ๋ฐ์ผ ํ๋ฉด์ ์ง์ํ๋ค.
- ๋ณ๋ React Native ์ฑ์ ๋ง๋ค์ง ์๋๋ค.
- ๋ชจ๋ฐ์ผ ์ฑ์ด ํ์ํ ์ด์ ๊ฐ ๋ช ํํด์ง ๋ PWA ๋๋ React Native๋ฅผ ๋น๊ต ๊ฒํ ํ๋ค.
์ด ํ๋ก์ ํธ๋ Node.js 22.x๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํํ๋ค.
nvm useNode.js 24.x๋ ์ฌ์ฉํ ์ ์์ง๋ง, 1์ฐจ MVP์์๋ ์ต์ ๊ธฐ๋ฅ๋ณด๋ค ์์ ์ ์ธ LTS ํ๊ฒฝ์ด ๋ ์ค์ํ๋ฏ๋ก Vercel๊ณผ ๋ก์ปฌ ๊ธฐ์ค์ 22.x๋ก ๋ง์ถ๋ค.
npm installnpm run dev๊ฐ๋ฐ ์๋ฒ ์คํ ํ ๋ธ๋ผ์ฐ์ ์์ http://localhost:3000์ผ๋ก ์ ์ํ๋ค.
npm run lint
npm run format:check
npm run type-check
npm run buildnpm 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 ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ค.
- Supabase ์ฐ๋
- ๋ธ๋ก๊ทธ ๊ธ, ํ๊ทธ, ์นดํ ๊ณ ๋ฆฌ๋ฅผ DB๋ก ๊ด๋ฆฌํ๋ค.
- ๊ณต๊ฐ ํ์ด์ง์์๋ published ์ํ์ ๊ธ๋ง ์กฐํํ๋ค.
- ๊ด๋ฆฌ์ ์ธ์ฆ
- ๊ด๋ฆฌ์๋ง ๊ธ ์์ฑ/์์ /์ญ์ ํ๋ฉด์ ์ ๊ทผํ ์ ์๊ฒ ํ๋ค.
- ์ผ๋ฐ ๋ฐฉ๋ฌธ์๋ ๊ด๋ฆฌ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค.
- ๊ธ ๊ด๋ฆฌ ๊ธฐ๋ฅ
- ๊ด๋ฆฌ์ ํ๋ฉด์์ ๊ธ์ ์ถ๊ฐํ๋ค.
- ๊ธฐ์กด ๊ธ์ ์์ ํ๋ค.
- draft/published ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ํ๊ทธ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๊ณต๊ฐ ์กฐํ
- ๋ฐฉ๋ฌธ์๋ ๊ณต๊ฐ๋ ๊ธ ๋ชฉ๋ก๊ณผ ๊ธ ๋ด์ฉ์ ์กฐํํ๋ค.
- ๋น๊ณต๊ฐ draft ๊ธ์ ๊ณต๊ฐ ํ๋ฉด์ ๋ ธ์ถํ์ง ์๋๋ค.
- ์ฑ ๋ถ๋ฆฌ
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๋ํผ๋ฅผ ๋ง๋ค์ด ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ, ์ธ์ฆ ํค๋, ์๋ต ํ์ฑ์ ๊ด๋ฆฌํ๋ค.
- Next.js์ ์๋ฒ ์ปดํฌ๋ํธ, ๋ผ์ฐํธ ํธ๋ค๋ฌ, ์บ์ฑ ๋ฐ ์ฌ๊ฒ์ฆ ์ต์
๊ณผ ์์ฐ์ค๋ฝ๊ฒ ์ฐ๋ํ๊ธฐ ์ํด ๊ธฐ๋ณธ
- ํ
์คํธ: 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์ด๊ธฐ์๋ ๊ธฐ๋ฅ ์๊ฐ ๋ง์ง ์์ผ๋ฏ๋ก ๋จ์ํ ๊ณ์ธต ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ก ์์ํ๋ค.
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์์: ๋ ์ง ํฌ๋งท, ๋ฌธ์์ด ์ฒ๋ฆฌ
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์ ๋ง๋ค์ง๋ ์๋๋ค.
- ๊ธฐ๋ฅ ๋จ์ ์์
์ด ์๋ฃ๋์ด
dev์ ๋จธ์งํ ๋ PR์ ์ฌ์ฉํ๋ค. - PR์์๋ ์ถฉ๋ ์ฌ๋ถ์ preview deployment๋ฅผ ํ์ธํ๋ค.
- ๊ฐ๋จํ ๋ฌธ์ ์์ ์ด๋ ์คํ ์์ ์ PR ์์ด ์ฒ๋ฆฌํ ์ ์๋ค.