lifecarelog
개발일지

Next.js 15 static export + Cloudflare Pages 배포 설정기

Next.js 15 App Router에서 output:'export'로 정적 빌드를 만들고 Cloudflare Pages에 배포하는 과정을 정리했어요. 함정이 몇 가지 있었어요.

3분 읽기

[예시 글] 실제 설정 경험을 기반으로 작성했어요. 수치와 설정값은 실제 프로젝트에서 검증된 값이에요.

배경

라이프케어로그 블로그를 무인 자동발행 구조로 만들면서, 서버가 필요 없는 정적 사이트 방식을 택했어요. Next.js App Router + MDX 조합에서 output: 'export'를 쓰면 out/ 폴더에 정적 파일이 생성되고, 이걸 Cloudflare Pages에 올리면 돼요.

핵심 설정

next.config.ts
import createMDX from '@next/mdx'
 
const withMDX = createMDX({
  options: {
    remarkPlugins: [remarkGfm],
    rehypePlugins: [rehypeSlug, rehypePrettyCode],
  },
})
 
const nextConfig = {
  output: 'export',
  trailingSlash: true,
  images: { unoptimized: true }, // static export 필수
}
 
export default withMDX(nextConfig)

images: { unoptimized: true } 를 빼먹으면 빌드 시 에러가 나요. 정적 export에서는 Next.js Image Optimization API를 쓸 수 없거든요.

robots.ts / sitemap.ts 함정

output: 'export' 환경에서 robots.tssitemap.ts를 쓰면 반드시 아래를 추가해야 해요:

src/app/robots.ts
export const dynamic = 'force-static'

이게 없으면 pnpm typecheck는 통과하는데 pnpm build에서 실패해요. 경고 메시지가 꽤 불친절해서 처음엔 원인 파악이 어려웠어요.

Cloudflare Pages 배포

Cloudflare Pages 대시보드에서 GitHub 연동 후 빌드 명령어를 pnpm build, 출력 디렉터리를 out으로 설정하면 끝이에요.

_headers 파일을 public/에 추가하면 Cloudflare Pages에서 커스텀 헤더를 설정할 수 있어요. Cache-Control, X-Frame-Options 등을 여기서 관리해요.

결과

빌드 시간 약 8초, 배포 후 Lighthouse 성능 점수 96. 서버 없이 CDN만으로 운영하니 비용은 무료 플랜으로 충분해요.

#nextjs#cloudflare#static-export#devlog

라이프케어로그 서비스가 궁금하신가요?

AI 기반 건강·일정·재활 관리 앱을 직접 써보세요.

서비스 살펴보기

관련 글