SHIN STORYSHIN STORY
홈포스트C#TypeScriptNext.jsNode.js시리즈
</>SHIN STORY

sdf

탐색

  • 홈
  • 모든 포스트
  • 시리즈
  • 검색

카테고리

  • C#
  • TypeScript
  • Next.js
  • Node.js
  • 알고리즘
  • 개발 도구

© 2025 Shin Blog. All rights reserved.

GitHubRSS
목록으로
Next.js#TypeScript#Next.js#TailwindCSS

2편. 프로젝트 초기 설정과 디렉토리 구조

SHIN

2025년 3월 5일7분 읽기0
📚

Next.js App Router로 풀스택 블로그 만들기

9편
  1. 11편. 프로젝트 소개와 기술 스택 선정
  2. 2편. 프로젝트 초기 설정과 디렉토리 구조현재
  3. 33편. Prisma 스키마 설계와 마이그레이션
  4. 44편. NextAuth.js로 관리자 인증 구현하기
  5. 55편. 관리자 대시보드 — 포스트 CRUD 구현
  6. 66편. 블로그 프론트엔드와 마크다운 렌더링
  7. 77편. 검색·카테고리·태그·시리즈 기능 구현
  8. 98편. SEO 최적화 — 메타태그·sitemap·RSS
  9. 99편. Vercel 배포와 성능 최적화

2편. 프로젝트 초기 설정과 디렉토리 구조

프로젝트 생성

CODE
npx create-next-app@latest dev-blog \
  --typescript \
  --tailwind \
  --eslint \
  --app \
  --src-dir \
  --import-alias "@/*"

추가 패키지 설치

CODE
# ORM & DB
npm install prisma @prisma/client @prisma/adapter-better-sqlite3 better-sqlite3
npm install -D @types/better-sqlite3

# 인증
npm install next-auth@beta

# 마크다운
npm install react-markdown remark-gfm rehype-highlight rehype-slug
npm install highlight.js

# 유틸
npm install bcryptjs
npm install -D @types/bcryptjs

디렉토리 구조

CODE
src/
├── app/
│   ├── (blog)/          # 공개 블로그 라우트 그룹
│   │   ├── page.tsx     # 홈
│   │   ├── posts/
│   │   ├── category/
│   │   ├── tag/
│   │   ├── series/
│   │   ├── search/
│   │   └── about/
│   ├── admin/           # 관리자 라우트
│   │   ├── layout.tsx
│   │   ├── page.tsx     # 대시보드
│   │   ├── posts/
│   │   └── settings/
│   ├── api/             # API Routes
│   │   ├── auth/
│   │   └── posts/
│   └── layout.tsx       # 루트 레이아웃
├── components/
│   ├── blog/            # 블로그 전용 컴포넌트
│   ├── admin/           # 관리자 전용 컴포넌트
│   ├── layout/          # Header, Footer
│   └── ui/              # 공통 UI (Button, Badge 등)
├── lib/
│   ├── prisma.ts        # Prisma 클라이언트 싱글톤
│   ├── auth.ts          # NextAuth 설정
│   ├── settings.ts      # 블로그 설정 헬퍼
│   └── utils.ts         # 유틸 함수
└── types/
    └── index.ts         # 공통 타입 정의

Route Groups 활용

App Router의 Route Groups (폴더명)을 사용하면 URL에 영향을 주지 않고 레이아웃을 분리할 수 있습니다.

CODE
(blog)/page.tsx   → /
(blog)/posts/     → /posts
admin/page.tsx    → /admin

블로그 헤더/푸터와 관리자 사이드바 레이아웃을 완전히 독립적으로 관리할 수 있습니다.

루트 레이아웃

CODE
// src/app/layout.tsx
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import './globals.css'

const inter = Inter({ subsets: ['latin'] })

export const metadata: Metadata = {
  title: { default: 'Dev Blog', template: '%s | Dev Blog' },
  description: '개발자의 기술 블로그',
}

export default function RootLayout({ children }: { children: React.ReactNode }) {
  return (
    <html lang="ko" className="dark">
      <body className={inter.className}>{children}</body>
    </html>
  )
}

Prisma 초기 설정

CODE
npx prisma init --datasource-provider sqlite

생성된 prisma/schema.prisma를 열어 다음 편에서 모델을 정의합니다.

환경 변수

CODE
# NextAuth
NEXTAUTH_URL=http://localhost:3000
NEXTAUTH_SECRET=your-secret-key-here

# DB (Prisma는 schema.prisma에서 직접 경로 지정)
NEXT_PUBLIC_SITE_URL=http://localhost:3000

다음 편에서는 블로그의 핵심 데이터 모델인 Prisma 스키마를 설계하고 마이그레이션하는 방법을 다룹니다.

공유
S

SHIN

.NET 개발자입니다

GitHub

이전 포스트

1편. 프로젝트 소개와 기술 스택 선정

다음 포스트

3편. Prisma 스키마 설계와 마이그레이션

같은 카테고리 포스트

9편. Vercel 배포와 성능 최적화

2025년 4월 10일· 7분

8편. SEO 최적화 — 메타태그·sitemap·RSS

2025년 4월 5일· 2분

7편. 검색·카테고리·태그·시리즈 기능 구현

2025년 3월 30일· 8분

댓글