Windows 포트 충돌(EADDRINUSE) 해결: 사용 중인 포트 찾기 및 프로세스 강제 종료

Windows 포트 충돌 대표 이미지

Windows에서 개발 서버를 실행할 때 EADDRINUSE, Address already in use 또는 “지정한 포트가 이미 사용 중입니다”라는 오류가 발생하면, 다른 프로세스가 같은 IP 주소와 포트를 점유하고 있을 가능성이 큽니다.

가장 빠른 해결 방법은 관리자 권한으로 CMD를 열고 다음 명령으로 충돌한 포트의 PID를 찾는 것입니다.

netstat -ano | findstr :3000

출력 결과의 마지막 숫자가 PID입니다. 다음 명령으로 프로세스 이름을 확인합니다.

tasklist /FI "PID eq 12345"

종료해도 되는 프로세스라는 사실을 확인했다면 다음 명령으로 종료합니다.

taskkill /PID 12345 /F

여기서 3000은 충돌한 포트 번호로, 12345는 실제 검색 결과에 표시된 PID로 바꿔야 합니다. Microsoft 문서에 따르면 netstat는 활성 TCP 연결과 컴퓨터가 수신 대기 중인 포트를 표시하며, taskkill은 PID 또는 이미지 이름을 기준으로 프로세스를 종료할 수 있습니다.

프로세스를 강제 종료하기 전에 반드시 해당 프로세스가 개발 서버인지, 데이터베이스인지, Windows 서비스인지 확인하세요. 시스템 프로세스나 저장 작업 중인 프로그램을 잘못 종료하면 데이터 손실이나 시스템 불안정이 발생할 수 있습니다.

EADDRINUSE 오류란?

EADDRINUSEError: Address Already in Use를 의미합니다.

애플리케이션이 특정 IP 주소와 포트에 서버를 연결하려고 했지만, 동일한 주소와 포트를 다른 서버가 이미 사용하고 있을 때 발생합니다. Node.js 공식 오류 문서도 EADDRINUSE를 로컬 시스템의 다른 서버가 해당 주소를 점유해 서버 바인딩에 실패한 상황으로 설명합니다.

Node.js에서는 다음과 같은 형태로 나타날 수 있습니다.

Error: listen EADDRINUSE: address already in use :::3000

또는 다음처럼 표시될 수 있습니다.

Error: listen EADDRINUSE: address already in use 127.0.0.1:8080

오류 메시지의 주요 정보는 다음과 같습니다.

항목의미
EADDRINUSE주소 또는 포트가 이미 사용 중
listen서버가 포트에서 수신 대기를 시작하는 과정
127.0.0.1현재 컴퓨터의 로컬 주소
0.0.0.0모든 IPv4 네트워크 인터페이스
::IPv6의 모든 인터페이스
3000충돌이 발생한 포트 번호

포트 충돌이 자주 발생하는 이유

대표적인 원인은 다음과 같습니다.

  • 이전 개발 서버가 종료되지 않았습니다.
  • 터미널을 닫았지만 하위 프로세스가 남았습니다.
  • 다른 프로젝트가 같은 포트를 사용하고 있습니다.
  • Docker 컨테이너가 해당 포트를 게시하고 있습니다.
  • 데이터베이스나 웹 서버가 Windows 서비스로 실행 중입니다.
  • IDE 또는 디버거가 백그라운드 프로세스를 유지하고 있습니다.
  • 개발 서버가 오류 후 자동으로 다시 시작됩니다.
  • 같은 애플리케이션을 두 번 실행했습니다.

가장 빠른 EADDRINUSE 해결 순서

다음 순서대로 진행하면 불필요한 프로세스를 잘못 종료할 위험을 줄일 수 있습니다.

  1. 오류 메시지에서 포트 번호를 확인합니다.
  2. 해당 애플리케이션을 실행했던 기존 터미널을 찾습니다.
  3. 기존 서버에서 Ctrl+C를 눌러 정상 종료합니다.
  4. 해결되지 않으면 포트를 점유한 PID를 검색합니다.
  5. PID에 연결된 프로세스 이름과 실행 경로를 확인합니다.
  6. 필요한 프로세스인지 판단합니다.
  7. 정상 종료를 먼저 시도합니다.
  8. 정상 종료가 불가능할 때만 강제 종료합니다.
  9. 포트가 해제됐는지 다시 확인합니다.
  10. 개발 서버를 재실행합니다.

taskkill /F부터 무작정 실행하지 말고 프로세스의 정체를 확인하는 단계가 중요합니다.

CMD에서 사용 중인 포트 찾기

netstat로 특정 포트 검색하기

포트 3000을 사용하는 프로세스를 찾으려면 CMD에서 다음 명령을 실행합니다.

netstat -ano | findstr :3000

대표적인 출력은 다음과 같습니다.

TCP    0.0.0.0:3000    0.0.0.0:0    LISTENING    12345
TCP    [::]:3000       [::]:0       LISTENING    12345

각 열의 의미는 다음과 같습니다.

의미
ProtocolTCP 또는 UDP
Local Address로컬 IP 주소와 포트
Foreign Address연결된 원격 주소
StateLISTENING, ESTABLISHED 등
PID포트를 소유한 프로세스 ID

Microsoft의 netstat 명령은 활성 TCP 연결, 수신 대기 포트, 라우팅 정보와 프로토콜 통계를 표시합니다. -a는 모든 활성 연결과 수신 포트를, -n은 주소와 포트를 숫자로, -o는 연결을 소유한 PID를 표시합니다.

LISTENING 결과만 찾기

단순 문자열 검색은 3000이 PID나 다른 포트의 일부로 포함된 결과까지 표시할 수 있습니다. 수신 대기 상태를 함께 확인하면 판단하기 쉽습니다.

netstat -ano | findstr LISTENING | findstr :3000

다만 :3000 검색은 :30000 같은 포트가 함께 표시될 가능성이 있습니다. 출력의 로컬 주소 열에서 정확한 포트 번호를 확인하세요.

실행 파일 이름까지 표시하기

관리자 권한 CMD에서는 다음 명령으로 연결과 실행 파일 정보를 함께 확인할 수 있습니다.

netstat -abno

특정 포트만 필터링할 수도 있습니다.

netstat -abno | findstr :3000

-b 옵션은 연결 또는 수신 포트를 만든 실행 파일을 표시하지만 시간이 오래 걸릴 수 있으며 충분한 권한이 필요합니다. 일반적으로는 netstat -ano로 PID를 찾은 뒤 tasklist로 확인하는 방식이 더 간단합니다.

PID로 프로세스 이름 확인하기

PID를 찾았다고 바로 종료해서는 안 됩니다. 먼저 어떤 프로그램인지 확인하세요.

PID가 12345라면 다음 명령을 실행합니다.

tasklist /FI "PID eq 12345"

출력 예시는 다음과 같습니다.

Image Name                     PID Session Name        Mem Usage
========================= ======== ================ ============
node.exe                     12345 Console             82,000 K

Microsoft의 tasklist는 로컬 또는 원격 컴퓨터에서 실행 중인 프로세스 목록을 표시하며, Windows 10과 Windows 11에서도 사용할 수 있습니다.

전체 프로세스 목록에서 찾기

다음 명령도 사용할 수 있습니다.

tasklist | findstr 12345

프로세스 이름을 기준으로 검색하려면 다음과 같이 입력합니다.

tasklist | findstr node.exe

단, 같은 이름의 프로세스가 여러 개 실행 중일 수 있으므로 이미지 이름만 보고 모든 프로세스를 한꺼번에 종료하지 마세요.

CMD에서 프로세스 종료하기

PID로 정상 종료 시도하기

먼저 /F 없이 종료를 시도할 수 있습니다.

taskkill /PID 12345

프로세스가 정상적으로 종료되면 데이터 정리와 종료 이벤트를 처리할 가능성이 있습니다.

프로세스 강제 종료하기

정상 종료가 되지 않을 때 다음 명령을 사용합니다.

taskkill /PID 12345 /F

/F는 프로세스를 강제로 종료합니다. Microsoft 공식 문서에 따르면 taskkill은 PID 또는 이미지 이름으로 프로세스를 종료하며 /F 옵션은 강제 종료에 사용됩니다.

하위 프로세스까지 종료하기

개발 도구가 여러 하위 프로세스를 만든 경우 /T 옵션을 사용할 수 있습니다.

taskkill /PID 12345 /T /F

이 명령은 지정한 프로세스와 해당 프로세스가 시작한 하위 프로세스를 종료합니다. 빌드 도구, 워커, 자동 재시작 프로그램이 함께 실행 중일 때 도움이 될 수 있습니다.

프로세스 이름으로 종료하기

taskkill /IM node.exe /F

이 방식은 실행 중인 모든 node.exe 프로세스에 영향을 줄 수 있습니다. 다른 Node.js 프로젝트, Electron 앱 또는 개발 도구가 실행 중이라면 함께 종료될 수 있으므로 PID 방식이 더 안전합니다.

PowerShell에서 포트와 프로세스 찾기

PowerShell에서는 Get-NetTCPConnection을 사용해 TCP 연결 정보를 구조화된 객체로 확인할 수 있습니다. 이 명령은 로컬·원격 주소, 포트, 연결 상태와 소유 프로세스 등의 TCP 연결 속성을 제공합니다.

특정 TCP 포트 확인

Get-NetTCPConnection -LocalPort 3000

수신 대기 상태만 찾으려면 다음과 같이 실행합니다.

Get-NetTCPConnection -LocalPort 3000 -State Listen

필요한 항목만 표시할 수도 있습니다.

Get-NetTCPConnection -LocalPort 3000 |
  Select-Object LocalAddress, LocalPort, State, OwningProcess

포트를 소유한 프로세스 확인

Get-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess

결과가 여러 개일 수 있으므로 더 안전하게 처리하려면 다음 형식을 사용할 수 있습니다.

Get-NetTCPConnection -LocalPort 3000 |
  Select-Object -ExpandProperty OwningProcess -Unique |
  ForEach-Object { Get-Process -Id $_ }

PowerShell에서 프로세스 종료

PID가 12345인 프로세스를 종료합니다.

Stop-Process -Id 12345

강제 종료가 필요하면 다음과 같이 실행합니다.

Stop-Process -Id 12345 -Force

한 줄로 포트를 점유한 프로세스를 강제 종료할 수도 있습니다.

Get-NetTCPConnection -LocalPort 3000 |
  Select-Object -ExpandProperty OwningProcess -Unique |
  ForEach-Object { Stop-Process -Id $_ -Force }

이 명령은 확인 없이 프로세스를 종료할 수 있으므로, 먼저 Get-Process로 대상을 확인한 뒤 실행하는 것이 안전합니다.

포트가 열려 있는지 테스트하기

Test-NetConnection -ComputerName localhost -Port 3000

Test-NetConnection은 TCP 연결 테스트, ping, 경로 추적 등의 진단 정보를 제공하는 PowerShell 명령입니다.

TcpTestSucceededTrue라면 해당 포트에서 연결을 받아들이는 서비스가 실행 중일 가능성이 있습니다.

작업 관리자에서 프로세스 종료하기

명령어 사용이 어렵다면 작업 관리자에서도 PID를 확인하고 프로세스를 종료할 수 있습니다.

  1. Ctrl+Shift+Esc를 눌러 작업 관리자를 엽니다.
  2. 세부 정보 탭으로 이동합니다.
  3. PID 열이 보이지 않으면 열 제목을 마우스 오른쪽 버튼으로 클릭합니다.
  4. 열 선택에서 PID를 활성화합니다.
  5. netstat에서 찾은 PID와 같은 항목을 찾습니다.
  6. 프로세스 이름을 확인합니다.
  7. 종료해도 되는 프로세스라면 마우스 오른쪽 버튼을 클릭합니다.
  8. 작업 끝내기 또는 프로세스 트리 끝내기를 선택합니다.

작업 관리자에서도 PID를 기준으로 확인해야 합니다. node.exe, java.exe, python.exe처럼 같은 이름의 프로세스가 여러 개 실행될 수 있기 때문입니다.

프로세스를 종료하지 않고 포트 변경하기

포트를 사용 중인 프로세스가 필요한 서비스라면 종료하지 말고 새 애플리케이션의 포트를 변경해야 합니다.

Node.js와 Express

const express = require('express');

const app = express();
const port = Number(process.env.PORT) || 3001;

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

PowerShell에서 일시적으로 PORT 환경 변수를 설정할 수 있습니다.

$env:PORT = 3001
npm start

CMD에서는 다음과 같이 실행합니다.

set PORT=3001 && npm start

React 개발 서버

도구에 따라 환경 변수나 실행 옵션이 다릅니다.

$env:PORT = 3001
npm start

Vite 프로젝트는 다음과 같이 실행할 수 있습니다.

npm run dev -- --port 3001

Next.js

npm run dev -- -p 3001

또는 프로젝트 스크립트가 지원한다면 다음과 같이 포트를 지정할 수 있습니다.

npx next dev -p 3001

각 프레임워크 버전과 package.json 스크립트에 따라 인수 전달 방식이 달라질 수 있으므로 현재 프로젝트의 공식 문서를 확인하세요.

Spring Boot

application.properties에서 다음과 같이 변경할 수 있습니다.

server.port=8081

Python 개발 서버

python -m http.server 8001

프로세스를 종료하는 것과 포트를 변경하는 것 중 어느 방식이 맞는지는 기존 서비스의 필요 여부에 따라 결정해야 합니다.

Node.js에서 EADDRINUSE 처리하기

Node.js 서버는 이미 점유된 포트에 listen()을 호출하면 EADDRINUSE 오류를 발생시킬 수 있습니다. 이는 애플리케이션 코드 문제라기보다 운영체제가 해당 주소와 포트의 중복 바인딩을 허용하지 않아 발생하는 경우가 일반적입니다.

서버가 두 번 실행됐는지 확인하기

다음 상황을 점검하세요.

  • VS Code 터미널과 외부 PowerShell에서 각각 실행했습니다.
  • npm startnode server.js를 동시에 실행했습니다.
  • nodemon이 실행 중인데 새 서버를 추가로 실행했습니다.
  • 디버거가 이미 서버를 실행했습니다.
  • 이전 터미널을 닫았지만 Node 프로세스가 남았습니다.

다음 명령으로 포트와 Node 프로세스를 확인합니다.

netstat -ano | findstr :3000
tasklist | findstr node.exe

Node.js 오류 이벤트 처리

애플리케이션에서 오류를 사용자 친화적으로 처리할 수도 있습니다.

import http from 'node:http';

const port = Number(process.env.PORT) || 3000;

const server = http.createServer((request, response) => {
  response.end('Server is running');
});

server.on('error', (error) => {
  if (error.code === 'EADDRINUSE') {
    console.error(`Port ${port} is already in use.`);
    process.exitCode = 1;
    return;
  }

  throw error;
});

server.listen(port, () => {
  console.log(`Listening on http://localhost:${port}`);
});

이 코드는 포트 충돌을 해결하지는 않지만 원인을 명확하게 표시하고 애플리케이션이 불완전한 상태로 남는 것을 방지합니다.

Docker 포트 충돌 해결하기

Docker에서는 다음과 같은 오류가 나타날 수 있습니다.

Bind for 0.0.0.0:5432 failed: port is already allocated

호스트의 5432 포트를 로컬 PostgreSQL이나 다른 컨테이너가 이미 사용하고 있다는 뜻일 수 있습니다.

실행 중인 컨테이너 확인

docker ps

포트 정보를 보기 쉽게 출력합니다.

docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}"

컨테이너 중지

docker stop 컨테이너_이름

더 이상 필요하지 않다면 삭제합니다.

docker rm 컨테이너_이름

호스트 포트 변경

기존 서비스가 필요하다면 다른 호스트 포트를 사용합니다.

docker run -p 5433:5432 postgres

이 설정은 호스트의 5433 포트를 컨테이너의 5432 포트에 연결합니다.

Docker 컨테이너를 종료했는데도 포트가 사용 중이라면 Windows 서비스로 설치된 데이터베이스나 다른 로컬 프로세스도 확인하세요.

TCP 포트와 UDP 포트 구분하기

Get-NetTCPConnection은 이름 그대로 TCP 연결을 확인하는 명령입니다. 애플리케이션이 UDP를 사용한다면 결과가 나오지 않을 수 있습니다.

netstat에서 UDP 확인

netstat -ano -p udp | findstr :5353

UDP는 TCP처럼 LISTENING 상태가 표시되지 않을 수 있습니다.

PowerShell에서 UDP 확인

Get-NetUDPEndpoint -LocalPort 5353

소유 프로세스를 찾습니다.

Get-NetUDPEndpoint -LocalPort 5353 |
  Select-Object LocalAddress, LocalPort, OwningProcess

TCP 명령에서 결과가 없다고 해서 포트가 사용되지 않는다고 단정하지 말고 애플리케이션이 사용하는 프로토콜을 확인하세요.

프로세스를 종료해도 다시 실행되는 이유

taskkill로 종료한 프로세스가 곧바로 다시 나타난다면 다른 프로그램이 자동으로 재시작하고 있을 수 있습니다.

대표적인 원인은 다음과 같습니다.

  • Windows 서비스
  • Docker의 재시작 정책
  • nodemon
  • PM2
  • IDE 디버거
  • 작업 스케줄러
  • 백그라운드 런처
  • 개발 서버의 watch 모드
  • 회사용 관리 에이전트

Windows 서비스 확인

Win+R을 누르고 다음을 실행합니다.

services.msc

포트를 사용하는 서비스의 이름을 알고 있다면 서비스 상태를 확인합니다. 필요한 서비스라면 무작정 사용 안 함으로 바꾸지 말고 애플리케이션 포트를 변경하세요.

PowerShell에서도 프로세스가 서비스와 연결돼 있는지 조사할 수 있습니다. 다만 Windows 서비스, 보안 제품, 데이터베이스를 강제 종료하면 시스템 기능이나 데이터가 손상될 수 있으므로 서비스의 역할을 먼저 확인해야 합니다.

Docker 재시작 정책 확인

docker inspect 컨테이너_이름

컨테이너에 always 또는 unless-stopped 같은 재시작 정책이 설정돼 있다면 프로세스나 Docker 재시작 후 다시 실행될 수 있습니다.

PID가 4로 표시되는 경우

PID 4는 Windows의 System 프로세스와 관련될 수 있습니다. 다음처럼 시스템이 포트를 점유하는 결과가 나타날 수 있습니다.

TCP    0.0.0.0:80    0.0.0.0:0    LISTENING    4

PID 4를 taskkill로 강제 종료하려고 해서는 안 됩니다.

이 경우 다음 항목을 확인해야 합니다.

  • IIS
  • Web Publishing Service
  • HTTP.sys 기반 서비스
  • 시스템 예약 URL
  • 다른 Windows 네트워크 서비스

관리자 권한 CMD에서 다음 명령으로 HTTP 서비스 등록 상태를 조사할 수 있습니다.

netsh http show servicestate

URL 예약을 확인하려면 다음 명령을 사용합니다.

netsh http show urlacl

등록 내용을 이해하지 못한 상태에서 URL 예약이나 시스템 서비스를 삭제하지 마세요.

TIME_WAIT는 강제 종료 대상이 아닙니다

netstat 결과에서 TIME_WAIT 상태가 많이 표시될 수 있습니다.

TCP    127.0.0.1:3000    127.0.0.1:52144    TIME_WAIT    0

TIME_WAIT는 종료된 TCP 연결의 지연 패킷이 새 연결에 영향을 주지 않도록 운영체제가 연결 정보를 잠시 유지하는 정상적인 상태입니다. PID가 0으로 표시될 수 있으며 일반적인 사용자 프로세스를 강제 종료하는 방식으로 해결하지 않습니다.

EADDRINUSE를 해결할 때는 우선 LISTENING 상태와 해당 포트를 소유한 PID를 확인하세요.

다만 포트가 BOUND 상태로 예약됐거나 비정상적인 포트 고갈 현상이 발생한 경우에는 단순한 개발 서버 충돌과 다른 진단이 필요할 수 있습니다. Microsoft는 최신 Windows에서 Get-NetTCPConnection과 업데이트된 netstat를 활용한 TCP 포트 사용 및 고갈 진단 방법을 제공합니다.

프로세스 종료 후 포트 해제 확인하기

프로세스를 종료한 다음 같은 명령을 다시 실행합니다.

netstat -ano | findstr :3000

결과가 없거나 해당 포트의 LISTENING 항목이 사라졌다면 서버를 다시 실행합니다.

PowerShell에서는 다음과 같이 확인할 수 있습니다.

Get-NetTCPConnection -LocalPort 3000 -ErrorAction SilentlyContinue

연결 가능 여부도 테스트할 수 있습니다.

Test-NetConnection localhost -Port 3000

기존 서버를 종료한 직후에는 TcpTestSucceededFalse여야 하며, 새 개발 서버를 실행한 후에는 True로 바뀔 수 있습니다.

접근 거부 오류가 발생할 때

다음과 같은 메시지가 표시될 수 있습니다.

ERROR: The process with PID 12345 could not be terminated.
Reason: Access is denied.

다음 순서로 확인하세요.

  1. 시작 메뉴에서 CMD 또는 PowerShell을 검색합니다.
  2. 마우스 오른쪽 버튼을 클릭합니다.
  3. 관리자 권한으로 실행을 선택합니다.
  4. PID와 프로세스 이름을 다시 확인합니다.
  5. taskkill 또는 Stop-Process를 다시 실행합니다.

관리자 권한으로도 종료되지 않는다면 보호된 시스템 프로세스, 보안 프로그램 또는 조직 정책에 의해 관리되는 프로세스일 수 있습니다. 강제 종료를 반복하지 말고 애플리케이션 포트를 변경하거나 시스템 관리자에게 문의해야 합니다.

포트 충돌 재발 방지 방법

프로젝트별 포트 지정

프로젝트마다 다른 포트를 사용하면 충돌을 줄일 수 있습니다.

프로젝트예시 포트
프런트엔드 개발 서버3000
API 서버4000
관리자 페이지3001
Spring Boot8080
테스트 서버8081
로컬 PostgreSQL5432
로컬 MongoDB27017

포트 번호를 코드에 직접 반복해서 작성하기보다 환경 변수로 관리하는 것이 좋습니다.

서버 종료 습관 만들기

터미널을 닫기 전에 Ctrl+C로 개발 서버를 정상 종료합니다.

Ctrl+C가 작동하지 않는다면 서버가 실행된 터미널이 맞는지 확인하고, 종료 프롬프트가 나타나면 응답하세요.

자동 재시작 도구 확인

nodemon, PM2, Docker Compose 또는 IDE 디버거가 서버를 자동으로 다시 실행할 수 있습니다. 사용하지 않는 감시 프로세스를 먼저 종료하세요.

시작 스크립트에 오류 처리 추가

Node.js 서버에서는 EADDRINUSE 오류를 감지해 사용자가 포트를 변경하거나 기존 프로세스를 종료하도록 명확하게 안내할 수 있습니다.

여러 터미널 정리

Windows Terminal, VS Code, PowerShell, Git Bash에 같은 프로젝트가 각각 실행되고 있지 않은지 확인합니다. 탭 제목에 프로젝트명과 실행 포트를 표시하면 관리하기 쉽습니다.

완전 해결 체크리스트

포트 3000을 예시로 다음 순서대로 확인하세요.

netstat -ano | findstr :3000
tasklist /FI "PID eq 12345"
taskkill /PID 12345 /F
netstat -ano | findstr :3000

PowerShell에서는 다음 순서를 사용할 수 있습니다.

Get-NetTCPConnection -LocalPort 3000
Get-Process -Id 12345
Stop-Process -Id 12345 -Force
Get-NetTCPConnection -LocalPort 3000 -ErrorAction SilentlyContinue

다음 항목을 모두 확인하면 대부분의 EADDRINUSE 오류를 해결할 수 있습니다.

  • 오류 메시지에서 정확한 포트를 확인했습니다.
  • 기존 서버를 Ctrl+C로 종료해 봤습니다.
  • TCP와 UDP 중 올바른 프로토콜을 조사했습니다.
  • 포트를 점유한 PID를 찾았습니다.
  • PID에 연결된 프로세스 이름을 확인했습니다.
  • 시스템 프로세스가 아닌지 확인했습니다.
  • 정상 종료를 먼저 시도했습니다.
  • 필요한 경우에만 강제 종료했습니다.
  • 자동 재시작 서비스가 없는지 확인했습니다.
  • 프로세스 종료 후 포트가 해제됐는지 검증했습니다.
  • 필요한 서비스라면 새 애플리케이션의 포트를 변경했습니다.

자주 묻는 질문

EADDRINUSE는 방화벽 오류인가요?

일반적으로는 아닙니다. EADDRINUSE는 애플리케이션이 사용하려는 로컬 주소와 포트를 다른 프로세스가 이미 점유할 때 발생합니다. 방화벽은 주로 외부 연결 허용 여부에 영향을 주며, 포트 중복 점유와는 다른 문제입니다.

Windows에서 포트 3000을 사용하는 프로세스를 찾는 명령은 무엇인가요?

CMD에서는 다음 명령을 사용합니다.

netstat -ano | findstr :3000

PowerShell에서는 다음 명령을 사용할 수 있습니다.

Get-NetTCPConnection -LocalPort 3000

PID를 강제 종료하는 명령은 무엇인가요?

CMD에서는 다음 명령을 사용합니다.

taskkill /PID 12345 /F

PowerShell에서는 다음과 같이 실행합니다.

Stop-Process -Id 12345 -Force

12345는 실제 프로세스 ID로 바꿔야 합니다.

node.exe를 모두 종료해도 되나요?

권장하지 않습니다. taskkill /IM node.exe /F는 여러 Node.js 프로젝트와 Node 기반 데스크톱 도구에 영향을 줄 수 있습니다. 포트를 점유한 PID를 찾아 해당 프로세스만 종료하는 것이 안전합니다.

taskkill에서 액세스가 거부되는 이유는 무엇인가요?

현재 사용자에게 프로세스 종료 권한이 없거나 관리자·시스템 계정이 실행한 프로세스일 수 있습니다. 관리자 권한 터미널을 사용하되 보호된 시스템 프로세스는 강제로 종료하지 마세요.

프로세스를 종료했는데 같은 PID가 다시 나타나는 이유는 무엇인가요?

Windows 서비스, nodemon, PM2, Docker 재시작 정책 또는 IDE 디버거가 프로세스를 다시 실행할 수 있습니다. 강제 종료를 반복하지 말고 프로세스를 관리하는 상위 서비스나 도구를 중지해야 합니다.

netstat 결과가 없는데 포트 충돌이 발생할 수 있나요?

가능합니다. TCP가 아니라 UDP를 사용하거나, 포트가 예약된 상태이거나, IPv4와 IPv6 결과를 잘못 확인했을 수 있습니다. Get-NetUDPEndpoint, 시스템 예약 포트와 실제 오류의 IP 주소도 함께 확인하세요.

컴퓨터를 재부팅하면 해결되나요?

남아 있는 프로세스 때문에 발생한 충돌이라면 해결될 수 있습니다. 그러나 Windows 서비스나 시작 프로그램이 같은 포트를 다시 점유하면 재부팅 후 재발합니다. 어떤 프로세스가 포트를 사용하는지 먼저 확인하는 것이 근본적인 해결 방법입니다.

결론

Windows의 EADDRINUSE 오류는 대부분 동일한 포트를 다른 프로세스가 이미 사용하고 있을 때 발생합니다.

가장 확실한 해결 절차는 netstat -ano | findstr :포트번호로 PID를 찾고, tasklist로 프로세스의 정체를 확인한 뒤 taskkill로 필요한 프로세스만 종료하는 것입니다. PowerShell에서는 Get-NetTCPConnection, Get-Process, Stop-Process를 이용해 같은 작업을 수행할 수 있습니다.

프로세스를 종료하기 전에는 반드시 개발 서버인지, Docker 컨테이너인지, 데이터베이스인지, Windows 시스템 서비스인지 확인해야 합니다. 종료할 수 없는 필수 서비스가 해당 포트를 사용한다면 기존 서비스를 중단하는 대신 새 애플리케이션의 포트를 변경하세요.

또한 프로세스를 종료해도 다시 실행된다면 Windows 서비스, nodemon, PM2, Docker 재시작 정책 또는 IDE 디버거를 점검해야 합니다. PID를 무작정 강제 종료하는 것보다 포트 확인 → 프로세스 식별 → 정상 종료 → 필요할 때만 강제 종료 → 해제 검증 순서를 따르는 것이 가장 안전합니다.