목차
Table of Contents
문제 상황
Next.js 개발을 하다 보면 종종 다음과 같은 상황에 마주치게 됩니다:
- 개발 서버가 제대로 종료되지 않아 포트가 계속 점유되어 있는 경우
- 백그라운드에서 실행 중인
next-server
프로세스가 CPU를 과도하게 사용하는 경우 - 새로운 개발 서버를 시작하려고 할 때 "포트가 이미 사용 중" 오류가 발생하는 경우
$ npm run dev
Error: listen EADDRINUSE: address already in use :::3000
이런 문제들은 대부분 백그라운드에서 실행 중인 next-server
프로세스 때문에 발생합니다.
해결 방법
1단계: next-server 프로세스 찾기
먼저 현재 실행 중인 next-server
프로세스들을 찾아봅시다:
# 기본적인 방법
ps aux | grep -i "next-server"
# 더 정확한 검색 (grep 프로세스 제외)
ps aux | grep -i "next-server\|next.*server" | grep -v grep
실행 결과 예시:
jellpd 39409 103.4 3.0 510424800 748832 ?? R 11:19AM 5:10.17 next-server (v14.2.32)
jellpd 61174 95.7 10.2 510789984 2558112 ?? U 11:30AM 5:40.17 next-server (v14.2.32)
각 컬럼의 의미:
jellpd
: 프로세스 소유자39409
,61174
: PID (Process ID) - 프로세스를 종료할 때 필요103.4
,95.7
: CPU 사용률 (%)3.0
,10.2
: 메모리 사용률 (%)R
,U
: 프로세스 상태 (R=실행중, U=인터럽트 불가능한 대기)
2단계: 프로세스 종료하기
방법 1: 개별 PID로 종료
# 일반적인 종료 (SIGTERM)
kill 39409 61174
# 강제 종료 (SIGKILL) - 응답하지 않을 때
kill -9 39409 61174
방법 2: 패턴으로 일괄 종료
# pkill 사용 (권장)
pkill -f "next-server"
# killall 사용
killall "next-server"
# 더 안전한 방법 - 확인 후 종료
pgrep -f "next-server" | xargs kill
3단계: 종료 확인
# 프로세스가 정말 종료되었는지 확인
ps aux | grep -i "next-server" | grep -v grep
# 아무 결과도 나오지 않으면 성공!
고급 기법
특정 포트를 사용하는 프로세스 찾기
# 3000 포트를 사용하는 프로세스 찾기
lsof -ti:3000
# 해당 프로세스 종료
lsof -ti:3000 | xargs kill -9
자동화 스크립트
매번 명령어를 입력하기 귀찮다면 스크립트로 만들어 둡시다:
# kill-next.sh
#!/bin/bash
echo "🔍 next-server 프로세스를 찾는 중..."
PIDS=$(pgrep -f "next-server")
if [ -z "$PIDS" ]; then
echo "✅ 실행 중인 next-server 프로세스가 없습니다."
exit 0
fi
echo "📋 발견된 프로세스:"
ps aux | grep -i "next-server" | grep -v grep
echo ""
echo "💀 프로세스를 종료합니다..."
echo "$PIDS" | xargs kill -9
sleep 1
# 종료 확인
REMAINING=$(pgrep -f "next-server")
if [ -z "$REMAINING" ]; then
echo "✅ 모든 next-server 프로세스가 성공적으로 종료되었습니다."
else
echo "⚠️ 일부 프로세스가 여전히 실행 중입니다:"
ps aux | grep -i "next-server" | grep -v grep
fi
사용법:
# 실행 권한 부여
chmod +x kill-next.sh
# 실행
./kill-next.sh
package.json 스크립트로 등록
{
"scripts": {
"dev": "next dev",
"kill-server": "pkill -f next-server || true",
"restart": "npm run kill-server && npm run dev"
}
}
이제 다음과 같이 사용할 수 있습니다:
# 서버 종료
npm run kill-server
# 서버 재시작 (종료 후 시작)
npm run restart
예방 방법
1. 개발 서버 올바르게 종료하기
# 개발 서버 실행 중일 때
# Ctrl + C 를 눌러서 정상 종료
2. 터미널 종료 시 프로세스도 함께 종료
.zshrc
또는 .bashrc
에 추가:
# 터미널 종료 시 next-server 프로세스도 정리
trap 'pkill -f "next-server" 2>/dev/null' EXIT
3. 개발 환경 설정
next.config.js
에서 개발 서버 설정을 최적화:
/** @type {import('next').NextConfig} */
const nextConfig = {
// 개발 모드에서 더 빠른 종료
experimental: {
turbo: {
loaders: {
// 필요한 로더만 활성화
},
},
},
}
module.exports = nextConfig
문제 해결 팁
CPU 사용률이 높은 next-server 프로세스
# CPU 사용률 순으로 정렬하여 확인
ps aux --sort=-%cpu | grep next-server
# 해당 프로세스의 상세 정보
ps -p <PID> -o pid,ppid,cmd,%cpu,%mem,time
메모리 누수 의심 시
# 메모리 사용량 모니터링
watch -n 1 'ps aux | grep next-server | grep -v grep'
# 특정 프로세스의 메모리 사용량 추적
top -p <PID>
권한 문제로 종료되지 않는 경우
# sudo 권한으로 강제 종료
sudo kill -9 <PID>
# 또는 프로세스 소유자 확인 후 해당 사용자로 전환
ps aux | grep next-server
su - <username>
kill -9 <PID>
마무리
Next.js 개발 서버 프로세스 관리는 개발 효율성에 직접적인 영향을 미칩니다. 위의 방법들을 활용하여:
- 정기적인 프로세스 정리로 시스템 리소스 절약
- 자동화 스크립트로 반복 작업 최소화
- 예방 조치로 문제 발생 최소화
개발 환경을 깔끔하게 유지하면 더 집중해서 코딩할 수 있습니다! 🚀
댓글