본문으로 건너뛰기
안동민 개발노트 아이콘

안동민 개발노트

본문 시작
15장 : 배포

외부 호스팅 배포

Netlify·AWS·Heroku·정적 호스팅의 SSR·API·이미지 지원과 운영 부담을 비교해 배포 방식을 선택합니다.

Next.js 애플리케이션의 공식적인 권장 배포 플랫폼은 Vercel입니다.

Vercel은 Next.js 개발팀에서 직접 만들었기 때문에 가장 최적화된 성능과 기능을 제공합니다.

하지만 특정 요구사항이나 기존 인프라와의 통합을 위해 다른 호스팅 플랫폼에 Next.js 앱을 배포해야 하는 경우도 있습니다.

이 절에서는 Next.js 애플리케이션을 Vercel 외의 다른 인기 있는 호스팅 플랫폼에 배포하는 주요 방법과 각 플랫폼의 특징 및 고려사항에 대해 알아보겠습니다.

먼저 플랫폼 이름이 아니라 기능 지원 범위와 운영 부담을 기준으로 선택 흐름을 봅니다.


다양한 호스팅 옵션

먼저 호스팅 유형마다 SSR, Route Handler, 이미지 최적화, 정적 export 지원 범위가 어떻게 달라지는지 비교합니다.

Next.js는 서버 사이드 렌더링(SSR), 정적 사이트 생성(SSG), Route Handler를 통한 서버 함수 등 다양한 실행 방식을 지원합니다.

따라서 선택하는 호스팅 플랫폼은 이러한 Next.js의 기능을 얼마나 잘 지원하는지에 따라 달라집니다.

주요 호스팅 플랫폼 유형

  • 서버리스 플랫폼: 서버리스 함수 형태로 Next.js 기능 일부를 관리형으로 제공합니다. Netlify와 AWS Amplify처럼 플랫폼·Next.js 버전마다 지원 범위가 다르므로 공식 호환표를 먼저 확인합니다.
  • Node.js 호스팅 플랫폼: 전통적인 Node.js 서버 환경을 제공하여 next start 명령어를 직접 실행합니다. (예: AWS EC2, Google Cloud Run, Azure App Service, Heroku, DigitalOcean Droplets)
  • 정적 웹사이트 호스팅: SSG로 빌드된 정적 파일만 호스팅하는 경우. (예: GitHub Pages, Netlify, AWS S3 + CloudFront)

플랫폼을 고를 때는 지원 기능뿐 아니라 CI/CD 편의성, 운영 부담, 비용 구조를 함께 비교해야 합니다.


Netlify에 배포하기

Netlify는 Vercel과 유사한 기능을 제공하는 인기 있는 서버리스 기반 배포 플랫폼입니다.

CI/CD 통합, 글로벌 CDN, 자동 SSL 등이 강점입니다.

Netlify CLI 설치 및 프로젝트 설정

npm install -g netlify-cli
# 또는
yarn global add netlify-cli

프로젝트 루트에서 Netlify에 로그인하고 프로젝트를 초기화합니다.

netlify login
netlify init

netlify init 명령은 Netlify 프로젝트를 설정하고, netlify.toml 파일을 생성하여 빌드 설정, 배포 설정 등을 정의할 수 있도록 돕습니다.

Git 연동과 자동 감지

Netlify는 Next.js 13.5 이상을 OpenNext 기반 어댑터로 자동 감지합니다.

일반적인 프로젝트는 Git 저장소를 연결하고 빌드 명령을 npm run build로 두면 SSR, Route Handler, 이미지 최적화에 필요한 런타임을 함께 구성합니다.

.next.next/standalone을 publish 디렉터리로 직접 지정하거나 @netlify/plugin-nextjs를 수동 고정하지 않습니다.

모노레포의 기본 디렉터리나 별도 빌드 명령이 필요할 때만 netlify.toml에 해당 값을 추가합니다.

netlify.toml (모노레포 예시)
[build]
  base = "apps/web"
  command = "npm run build"

배포하기

Netlify 대시보드를 통해 Git 리포지토리를 연동하여 자동 배포를 설정하거나, CLI를 통해 수동으로 배포할 수 있습니다.

Git 연동 (권장)

Netlify 대시보드에서 Add new site -> Import an existing project를 선택합니다.

GitHub, GitLab, Bitbucket 등 Git 서비스 제공자를 선택하고, Next.js 프로젝트 리포지토리를 연결합니다.

Netlify가 프로젝트를 분석하고 빌드 설정을 제안하면 확인 후 배포합니다.

모노레포처럼 직접 만든 netlify.toml이 있다면 해당 설정도 함께 확인합니다.

CLI를 통한 수동 배포
npm run build # 로컬에서 Next.js 빌드
netlify deploy --prod # 프로덕션 환경으로 배포 (이전에 netlify init으로 프로젝트 연결 필요)

AWS에 배포하기 (Amplify 또는 EC2)

AWS는 다양한 배포 서비스를 제공하며, Next.js 애플리케이션의 규모와 복잡성에 따라 선택지가 달라집니다.

AWS Amplify (지원 범위를 확인하는 관리형 배포)

AWS Amplify는 프론트엔드 웹 및 모바일 앱을 위한 통합 개발 플랫폼입니다.

Next.js 앱을 쉽게 호스팅하고, 백엔드 서비스(인증, API, 데이터베이스 등)를 통합할 수 있습니다.

다만 관리형 SSR 지원 버전과 기능 범위가 Next.js 최신 버전을 즉시 따라가지는 않습니다.

현재 AWS 공식 지원표는 관리형 Next.js 지원을 11부터 15까지로 안내하므로, 이 교재의 Next.js 16 프로젝트는 호환된다고 가정하지 말고 배포 전에 지원표를 다시 확인해야 합니다.

Next.js 16 관리형 SSR 지원이 확인되기 전에는 이 절의 콘솔 절차를 그대로 적용하지 않고, EC2·컨테이너 같은 자체 Node.js 호스팅이나 아래의 정적 export를 선택합니다.

AWS Amplify Hosting 콘솔에서 새 앱을 만들고 GitHub, GitLab, Bitbucket 같은 Git 공급자를 연결합니다.

배포할 저장소와 브랜치를 선택하고 Amplify가 감지한 Next.js 빌드 설정을 확인합니다.

SSR 앱의 .next 내부 파일을 일반 정적 산출물처럼 직접 지정하지 않습니다.

콘솔에서 서버 전용 환경 변수를 등록하고 첫 배포를 실행합니다.

이후 연결한 브랜치에 커밋이 들어오면 빌드와 배포가 자동으로 진행됩니다.

정적 export만 배포한다면 output: 'export'로 빌드한 별도의 out 디렉터리를 정적 산출물로 사용합니다.

장점: 지원되는 버전과 기능 범위 안에서는 Git 기반 배포와 AWS 백엔드 통합을 한곳에서 관리하기 쉽습니다.

간편한 CI/CD 파이프라인을 제공합니다.

단점: AWS 문서가 부르는 Edge API Routes(Edge runtime Route Handler)·Edge middleware(현재 Proxy 계층에 해당), 온디맨드 ISR, 스트리밍 등 공식 미지원 기능이 있으며, 버전 호환성과 비용을 함께 관리해야 합니다.

AWS EC2 (Traditional Server Hosting)

EC2(Elastic Compute Cloud)는 가상 서버(인스턴스)를 프로비저닝하여 직접 Node.js 서버를 실행하는 방식입니다.

Next.js의 모든 기능을 완벽하게 제어할 수 있지만, 인프라 관리 부담이 큽니다.

EC2 인스턴스 생성: 원하는 운영 체제(Ubuntu, Amazon Linux 등)로 EC2 인스턴스를 생성하고 SSH로 접속합니다.

Node.js 및 npm 설치: 인스턴스에 Node.js와 npm(또는 yarn)을 설치합니다.

Next.js 앱 클론 및 빌드: Git 리포지토리에서 Next.js 프로젝트를 클론하고, npm installnpm run build를 실행합니다.

애플리케이션 실행: npm start (또는 next start) 명령어로 Next.js 프로덕션 서버를 실행합니다.

프로세스 관리: pm2systemd와 같은 도구를 사용하여 Next.js 애플리케이션이 백그라운드에서 지속적으로 실행되도록 관리합니다.

웹 서버 설정 (Nginx/Apache): Nginx 또는 Apache를 사용하여 80/443 포트로 들어오는 요청을 Next.js 서버(기본 3000포트)로 프록시하도록 설정합니다.

SSL 인증서(Let's Encrypt 등)도 직접 설정해야 합니다.

CI/CD 구축: Jenkins, AWS CodePipeline, GitHub Actions 등 CI/CD 도구를 사용하여 코드 푸시 시 자동으로 빌드 및 배포되도록 파이프라인을 구축합니다.

장점: 완벽한 제어권, 유연한 인프라 구성, 복잡한 커스텀 설정 가능.

단점: 인프라 설정 및 관리 부담이 큼, 높은 운영 지식 요구, 비용 관리의 복잡성.


Heroku에 배포하기

Heroku는 클라우드 플랫폼으로서 애플리케이션 배포를 간소화하는 PaaS(Platform as a Service)입니다.

Next.js 앱을 쉽게 배포할 수 있습니다.

Heroku CLI 설치: 운영체제별 공식 설치 프로그램이나 macOS의 Homebrew처럼 자동 업데이트가 가능한 공식 방법을 우선 사용합니다. npm install -g heroku는 수동 업데이트가 필요한 대안입니다.

Heroku 앱 생성: heroku create your-nextjs-app-name

package.json 수정: start 스크립트를 next start로 지정합니다.

package.json
{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start -p $PORT"
  }
}

Heroku가 제공하는 PORT 환경 변수를 시작 명령에서 사용합니다.

Procfile 생성: Heroku는 Procfile을 사용하여 애플리케이션 시작 명령을 찾습니다.

# Procfile (프로젝트 루트에 생성)
web: npm run start
Git 푸시로 배포
git add .
git commit -m "Initial Heroku deploy"
git push heroku main # 또는 master

환경 변수 설정: heroku config:set API_KEY=YOUR_API_KEY 또는 Heroku 대시보드에서 설정합니다.

장점: 매우 간편한 배포, 관리형 서비스.

단점: 과거의 상시 무료 dyno는 종료되었으며 Eco나 Basic 등 현재 유료 실행 계획과 데이터 서비스 비용을 함께 계산해야 합니다.

Vercel 전용 기능과 동일한 이미지 최적화 구성을 자동 제공하지는 않으므로 운영 방식을 직접 정해야 합니다.


정적 웹사이트 호스팅 (SSG 전용)

Next.js의 output: 'export' 설정과 next build를 사용해 HTML, CSS, JavaScript 파일만 내보내 배포하는 경우입니다.

이 경우 요청 시 SSR, Server Action, 동적 Route Handler처럼 서버 실행이 필요한 기능은 사용할 수 없습니다.

빌드 때 결과를 확정할 수 있는 GET Route Handler는 정적 파일로 내보낼 수 있습니다.

next.config.ts 설정: output: 'export' 옵션을 추가합니다.

next.config.ts
import type { NextConfig } from 'next';

const nextConfig: NextConfig = {
  output: 'export', // 정적 HTML 파일로 내보내기
  trailingSlash: true, // /about/index.html 형태로 내보내기
  images: { unoptimized: true }, // 기본 이미지 최적화 서버를 사용하지 않음
};

export default nextConfig;

정적 export에는 기본 next/image 최적화 서버가 없으므로 unoptimized: true를 켜거나 별도의 custom image loader를 설정해야 합니다.

GitHub Pages의 사용자·조직 루트 사이트(https://user.github.io)는 위 설정을 그대로 사용할 수 있습니다.

프로젝트 사이트(https://user.github.io/repository-name)라면 빌드 시 basePath: '/repository-name'도 설정해야 Link, 라우터, _next 자산 경로가 저장소 하위 경로를 가리킵니다. public/ 파일을 문자열 경로로 참조할 때도 같은 접두사를 직접 반영합니다.

빌드: npm run build 명령을 실행하면 out 디렉토리에 정적 파일이 생성됩니다.

배포 플랫폼: 생성된 out 디렉토리의 파일을 다음 서비스에 업로드하여 배포합니다.

  • GitHub Pages: .github/workflows에 워크플로우를 설정하여 out 디렉토리를 gh-pages 브랜치로 푸시.
  • Netlify: publish 디렉토리를 out으로 설정.
  • AWS S3 + CloudFront: S3 버킷에 파일을 업로드하고 CloudFront를 통해 CDN으로 배포. /about 직접 접근을 /about/index.html로 연결하도록 CloudFront Function이나 오리진 재작성 규칙을 설정합니다.

장점: 매우 빠르고 저렴하며, 높은 확장성을 가집니다.

단점: 요청 시 SSR, Server Action, 동적 Route Handler, 기본 next/image 최적화 서버 등 Next.js의 서버 실행 기능은 사용할 수 없습니다.


환경 변수 및 보안 고려사항

다른 호스팅 플랫폼에 배포할 때도 환경 변수 관리는 매우 중요합니다.

  • 플랫폼별 환경 변수 설정: 각 호스팅 플랫폼은 환경 변수를 설정하는 고유한 방법을 제공합니다 (예: AWS Systems Manager Parameter Store, Heroku Config Vars, Netlify 환경 변수 설정). 해당 플랫폼의 문서를 참조하여 설정해야 합니다.
  • 빌드 시간 vs. 런타임: NEXT_PUBLIC_ 접두사가 붙은 값은 빌드할 때 클라이언트 번들에 인라인되어 이후 변경해도 기존 빌드에는 반영되지 않습니다. 접두사가 없는 서버 전용 값은 동적으로 렌더링하는 서버 코드에서 런타임에 읽을 수 있으므로 플랫폼의 런타임 환경 변수 기능으로 관리합니다. 정적 export에는 런타임 서버가 없다는 점도 구분합니다.
  • 보안: 민감한 정보는 절대로 클라이언트 번들에 노출되지 않도록 NEXT_PUBLIC_ 접두사에 유의하고, 각 플랫폼의 보안 가이드라인을 따릅니다.

Vercel은 Next.js에 최적화된 가장 간편한 배포 경험을 제공하지만, 상황에 따라 다른 플랫폼이 더 적합할 수 있습니다.

각 플랫폼의 장단점과 Next.js 기능 지원 여부를 신중하게 고려하여 최적의 배포 전략을 선택해야 합니다.

Vercel 외 플랫폼을 고를 때는 SSR 지원, 이미지 최적화, 서버리스 함수, 환경 변수, 운영 비용을 같은 기준으로 비교해야 합니다.

아래 다이어그램은 AWS Amplify, EC2, Heroku, 정적 호스팅이 Next.js 기능 지원 범위에서 어떻게 갈리는지 보여줍니다.