개발 서버 실행 및 기본 설정
개발 서버의 코드 감시와 오류 표시를 확인하고 포트·이미지·엄격 모드·환경 변수의 기본 설정을 조정합니다.
Next.js 프로젝트의 구조를 이해하셨다면, 이제 개발의 핵심적인 부분인 개발 서버(Development Server)를 좀 더 자세히 살펴보고, 기본적인 설정을 통해 개발 환경을 최적화하는 방법을 알아보겠습니다.
개발 서버는 여러분이 작성하는 코드를 실시간으로 브라우저에 반영하여, 빠르게 결과를 확인하며 개발할 수 있도록 돕는 매우 중요한 도구입니다.
먼저 개발 서버가 맡는 역할을 코드 감시, 즉시 반영, 오류 표시, 로컬 주소 제공으로 나눠 봅니다.
프로덕션 서버가 아니라 개발 중 피드백을 빠르게 받기 위한 실행 환경이다. 빠른 확인을 위해 최적화보다 반복 속도에 맞춰져 있다.
| 기능 | 하는 일 | 좋은 신호 | 주의할 점 |
|---|---|---|---|
| 파일 감시 | src/app, styles, 설정 변경을 감지 | 저장 후 터미널 로그가 갱신됨 | 설정 파일은 재시작이 필요할 수 있음 |
| HMR | 변경된 모듈만 브라우저에 반영 | 페이지 전체 새로고침 없이 화면 변화 | 상태가 꼬이면 새로고침 |
| 오류 오버레이 | 문법/런타임 오류를 화면에 표시 | 파일명과 줄 번호가 함께 보임 | 원인은 터미널 로그도 같이 확인 |
| 로컬 URL | localhost 주소로 앱을 제공 | http://localhost:3000 접속 가능 | 포트 충돌 시 다른 포트로 변경 |
| 개발 번들 | 빠른 빌드를 위해 개발 모드로 처리 | 수정 반영이 빠름 | 실제 성능은 production build로 확인 |
개발 서버 다시 실행하기
개발 서버 재실행은 프로젝트 폴더, 실행 명령, localhost 주소, 종료 방법을 순서대로 확인하는 과정입니다.
서버가 안 켜질 때는 명령보다 먼저 현재 터미널 위치가 프로젝트 내부인지 확인한다.
| 순서 | 명령/행동 | 확인할 결과 | 문제가 있으면 |
|---|---|---|---|
| 1 | cd my-next-app | package.json이 있는 폴더로 이동 | 현재 경로와 프로젝트명 확인 |
| 2 | npm run dev | 개발 서버 시작 로그 출력 | scripts, 의존성 설치 여부 확인 |
| 3 | localhost 주소 열기 | 초기 페이지 표시 | 포트 충돌, 방화벽, 서버 로그 확인 |
| 4 | page.tsx 수정 후 저장 | 브라우저 화면 자동 반영 | 저장 여부, HMR 로그, 새로고침 확인 |
| 5 | Ctrl+C로 종료 | 터미널 프롬프트 복귀 | 실행 중인 Node 프로세스 확인 |
이전 절에서 이미 개발 서버를 한 번 실행해 보셨겠지만, 다시 한번 그 과정을 상기하고 몇 가지 유의할 점을 짚어보겠습니다.
프로젝트 디렉터리(my-next-app 또는 여러분이 지정한 프로젝트 이름)로 이동한 후, 다음 명령어를 터미널에 입력합니다.
cd my-next-app
npm run dev또는 yarn을 사용한다면:
cd my-next-app
yarn dev명령어가 성공적으로 실행되면, 다음과 유사한 메시지가 나타날 것입니다.
ready - started server on 0.0.0.0:3000, url: http://localhost:3000이 메시지는 Next.js 개발 서버가 http://localhost:3000 주소에서 실행 중임을 의미합니다.
웹 브라우저를 열고 해당 주소로 접속하면, Next.js의 기본 환영 페이지를 볼 수 있습니다.
개발 서버의 특징
- 자동 새로 고침 (Hot Module Replacement, HMR): 개발 서버가 실행 중인 상태에서 코드를 수정하고 저장하면, 브라우저가 자동으로 새로 고침 되거나 변경된 모듈만 교체되어 화면에 즉시 반영됩니다. 이는 개발 효율성을 크게 높여주는 기능입니다.
- 에러 오버레이: 개발 중에 문법 오류나 런타임 오류가 발생하면, 브라우저 화면에 에러 메시지 오버레이가 나타나 문제를 쉽게 파악하고 해결할 수 있도록 돕습니다.
- 성능 최적화 미적용: 개발 서버는 빠른 피드백을 위해 성능 최적화가 최소화되어 있습니다. 따라서 실제 프로덕션 환경에서의 성능과는 차이가 있을 수 있습니다.
개발 서버를 종료하고 싶을 때는 터미널에서 Ctrl + C (Windows/Linux) 또는 Cmd + C (macOS)를 누르면 됩니다.
기본 포트 변경하기
간혹 3000번 포트가 다른 애플리케이션에 의해 사용 중이거나, 다른 포트에서 개발하고 싶은 경우가 있을 수 있습니다.
이럴 때는 npm run dev 명령어를 실행할 때 PORT 환경 변수를 지정하여 포트를 변경할 수 있습니다.
# Windows (명령 프롬프트)
set PORT=3001 && npm run dev
# Windows (PowerShell)
$env:PORT=3001; npm run dev
# macOS/Linux
PORT=3001 npm run dev위 명령어를 실행하면 http://localhost:3001으로 개발 서버가 시작되는 것을 확인할 수 있습니다.
next.config.ts 파일 살펴보기 및 기본 설정
next.config.ts 파일은 Next.js 애플리케이션의 전반적인 동작 방식을 설정하는 중요한 파일입니다.
프로젝트의 루트 디렉터리에 위치하며, create-next-app으로 프로젝트를 생성했다면 기본적으로 다음과 같은 내용으로 생성되어 있을 것입니다.
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {};
export default nextConfig;이 파일은 타입 검사를 받는 설정 객체를 기본 export합니다.
nextConfig 객체 안에 다양한 설정 옵션을 추가하여 Next.js의 동작을 커스터마이징할 수 있습니다.
몇 가지 유용한 기본 설정 옵션을 살펴보겠습니다.
images 설정: 이미지 최적화
Next.js는 이미지 최적화를 위한 <Image> 컴포넌트를 제공합니다.
로컬 이미지는 별도 설정 없이 사용할 수 있고, 외부 이미지는 next.config.ts의 remotePatterns로 허용 범위를 명시합니다.
외부 도메인에서 이미지를 로드할 때 필요합니다.
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'assets.example.com',
pathname: '/my-bucket/**',
},
],
},
};
export default nextConfig;reactStrictMode 설정: React 엄격 모드
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
reactStrictMode: true, // true 또는 false
};
export default nextConfig;App Router는 기본적으로 Strict Mode를 사용하므로 보통 이 옵션을 직접 적을 필요가 없습니다.
개발 중 일부 로직이 두 번 실행되는 것처럼 보인다면 Strict Mode를 끄기보다, effect 정리 함수와 부수 효과가 안전하게 반복되는지 먼저 확인합니다.
.env.local: 환경 변수 관리
애플리케이션에서 민감한 정보(API 키 등)나 환경별로 달라지는 값(백엔드 API 주소)을 관리할 때 환경 변수를 사용합니다.
프로젝트 루트의 .env.local에 서버 전용 값과 브라우저 공개 값을 구분해 작성합니다.
# 서버 컴포넌트와 Route Handler에서만 읽습니다.
DATABASE_URL=postgresql://user:password@localhost:5432/app
# 브라우저 번들에 공개해도 되는 값에만 접두사를 붙입니다.
NEXT_PUBLIC_API_ORIGIN=https://api.example.comNEXT_PUBLIC_ 접두사가 없는 값은 서버에서만 읽고, 접두사가 있는 값은 빌드할 때 클라이언트 번들에 포함됩니다.
민감한 정보는 절대로 NEXT_PUBLIC_ 접두사를 붙이면 안 됩니다.
또한 next.config.ts의 env 옵션에 넣은 값은 이름과 관계없이 번들에 인라인될 수 있으므로 비밀값 저장소로 사용하지 않습니다.
환경 변수 관리에 대해서는 추후 더 자세히 다룰 예정입니다.
개발 환경을 정리할 때는 실행 명령, 포트, 설정 파일, 환경 변수를 한 번에 점검하면 실수를 줄일 수 있습니다.
설정은 서로 연결되어 있다. 서버가 켜지는지뿐 아니라 어떤 값이 브라우저와 서버 코드에 노출되는지도 함께 확인한다.
| 점검 항목 | 보는 위치 | 확인할 것 | 주의 |
|---|---|---|---|
| 실행 명령 | package.json scripts | dev가 next dev로 연결되는지 | 다른 패키지 매니저와 섞지 않기 |
| 포트 | 터미널 환경 변수 | 3000 또는 지정 포트가 비어 있는지 | Windows 셸마다 문법이 다름 |
| Next 설정 | next.config.ts | images.remotePatterns, strict mode, experimental 옵션 | 변경 후 서버 재시작 필요 가능 |
| 환경 변수 | .env.local | 무접두사는 서버 전용, NEXT_PUBLIC_만 공개 | 비밀값을 next.config.ts env나 NEXT_PUBLIC_에 넣지 않기 |
| 브라우저 확인 | localhost | 화면, 오류 오버레이, console | 터미널 로그와 함께 봄 |
아래 다이어그램은 개발 서버를 실행할 때 함께 점검할 명령, 포트, 설정 파일의 관계를 정리한 것입니다.
서버 실행 문제는 명령, 포트, 설정, 환경 변수 중 어느 층에서 달라졌는지 나눠 보면 빠르게 좁혀진다.
| 층 | 대표 입력 | 영향 | 확인 방법 |
|---|---|---|---|
| 실행 명령 | npm run dev | package.json의 dev script 실행 | scripts.dev 값 확인 |
| 포트 | PORT=3001 또는 --port | localhost 접속 주소 변경 | 터미널에 출력된 URL 확인 |
| Next 설정 | next.config.ts | remotePatterns, 실험 옵션, 빌드 동작 변경 | 설정 변경 후 서버 재시작 |
| 환경 변수 | .env.local | 무접두사는 서버 전용, NEXT_PUBLIC_은 브라우저 공개 | next.config.ts env 대신 .env.local 사용 |
| 브라우저 | http://localhost:3000 | 현재 실행 중인 앱 확인 | 주소와 포트가 로그와 일치하는지 확인 |
개발 서버 시작 전 최종 확인
모든 설정이 완료되었다면 프로젝트 디렉터리에서 npm run dev를 다시 실행합니다.
실행 전에는 현재 폴더, 포트 충돌, 설정 파일 변경 여부를 함께 확인합니다.
다음 다이어그램은 Windows에서 Next.js 프로젝트를 실행할 때 셸, 경로, 패키지 관리자, 환경 변수를 확인하는 순서입니다.
같은 포트 변경이라도 명령 프롬프트와 PowerShell 문법이 다르다. 오류가 나면 셸부터 확인한다.
| 확인 순서 | 볼 것 | 예시 | 실패 신호 |
|---|---|---|---|
| 1 | 현재 셸 | PowerShell, 명령 프롬프트, Git Bash | 환경 변수 문법 오류 |
| 2 | 프로젝트 경로 | package.json이 있는 폴더 | missing script: dev |
| 3 | 패키지 관리자 | npm run dev 또는 yarn dev | lockfile이 여러 개 생김 |
| 4 | 포트 변경 | $env:PORT=3001; npm run dev | 여전히 3000번으로 실행 |
| 5 | 종료와 재실행 | Ctrl+C 후 다시 실행 | 포트가 이미 사용 중이라고 나옴 |
설정 파일을 바꿀 때는 개발 서버 재시작 필요 여부와 브라우저 확인 위치를 함께 보아야 합니다.
바뀐 값이 화면에 안 보일 때는 코드 문제가 아니라 개발 서버가 이전 설정으로 떠 있는 경우가 많다.
| 변경한 것 | 보통 반영 방식 | 확인 위치 | 안 보이면 |
|---|---|---|---|
| page.tsx, component | HMR | 브라우저 화면 | 저장 여부, import 경로 확인 |
| globals.css | HMR 또는 새로고침 | 전체 스타일 | 선택자 우선순위 확인 |
| next.config.ts | 서버 재시작 | 터미널 시작 로그 | Ctrl+C 후 npm run dev |
| .env.local | 서버 재시작 | 무접두사 서버 값과 NEXT_PUBLIC_ 공개 값 | 접두사와 재시작 여부 확인 |
| package.json dependencies | install 후 재실행 | 터미널 import 오류 | node_modules와 lockfile 확인 |
마지막으로 개발 서버 실행과 next.config.ts 기본 설정을 실제 점검 순서로 정리합니다.
문제가 생길 때마다 이 순서로 돌아오면 경로, 포트, 설정, 브라우저 상태를 빠뜨리지 않는다.
| 상황 | 확인할 것 | 좋은 상태 | 다음 행동 |
|---|---|---|---|
| 실행 전 | 프로젝트 폴더와 package.json | dev script가 있음 | npm run dev 실행 |
| 실행 직후 | 터미널 URL과 포트 | localhost 주소 출력 | 브라우저에서 같은 주소 열기 |
| 개발 중 | 수정 저장과 HMR | 화면이 자동 반영됨 | 오류 오버레이와 로그 확인 |
| 설정 변경 후 | next.config.ts, .env.local | 무접두사와 NEXT_PUBLIC_ 경계를 지켜 재시작 후 반영 | 서버 재실행 후 다시 확인 |
| 종료 | Ctrl+C와 포트 해제 | 터미널 프롬프트 복귀 | 필요할 때 같은 순서로 재실행 |