📦 Assets

[무료 배포] Windows 포트 충돌 해결 도구 PortManager (EADDRINUSE 원클릭 해결)

this.Serena 2026. 3. 26. 10:51

Windows에서 포트 충돌 에러(EADDRINUSE)를 겪을 때 netstat -ano 명령어 없이 GUI로 포트를 확인하고 프로세스를 종료할 수 있는 무료 데스크톱 앱, PortManager를 소개합니다. 설치 없이 exe 하나로 실행할 수 있으며, Electron 기반으로 직접 개발했습니다.

더보기

EADDRINUSE란?

EADDRINUSE는 "Error: Address Already In Use"의 약자로, 네트워크 프로그래밍에서 발생하는 에러 코드입니다.

쉽게 말하면

내가 사용하려는 포트 번호를 다른 프로세스가 이미 점유하고 있을 때 발생하는 에러입니다.

예를 들어 설명하면 이렇습니다.

카페에 콘센트 자리가 하나 있는데, 이미 누가 앉아 있으면 내가 거기 앉을 수 없는 것과 같습니다. 포트도 마찬가지로, 하나의 포트를 두 프로그램이 동시에 사용할 수 없습니다.

실제 에러 메시지

Node.js로 서버를 실행할 때 가장 흔하게 볼 수 있습니다.

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

이 메시지는 "3000번 포트를 이미 누군가 쓰고 있어서 서버를 시작할 수 없다"는 뜻입니다.

왜 발생하나?

주요 원인은 다음과 같습니다.

원인상황
서버 중복 실행 이전에 실행한 서버를 종료하지 않고 다시 npm start 한 경우
비정상 종료 Ctrl+C 없이 터미널을 그냥 닫아서 프로세스가 백그라운드에 남아 있는 경우
다른 앱이 같은 포트 사용 예: 3000번 포트를 Node.js와 다른 앱이 동시에 쓰려는 경우

해결 방법

기존에는 아래 명령어를 매번 수동으로 입력해야 했습니다.

# 1단계: 3000번 포트를 점유 중인 프로세스 PID 확인
netstat -ano | findstr :3000

# 2단계: 해당 PID의 프로세스 종료
taskkill /F /PID 1234

PortManager가 바로 이 과정을 GUI에서 클릭 한 번으로 해결하기 위해 만들어진 앱입니다. 포트 목록에서 충돌이 발생한 포트를 찾고, Kill 버튼을 누르면 해당 프로세스가 종료되어 포트가 해제됩니다.

요약

항목내용
정식 명칭 EADDRINUSE (Error: Address Already In Use)
의미 사용하려는 포트가 이미 다른 프로세스에 의해 점유된 상태
발생 환경 Node.js, Python, Java 등 네트워크 서버 실행 시 공통
핵심 해결 해당 포트를 점유 중인 프로세스를 찾아 종료하면 해결

💾 다운로드: PortManager 릴리즈 페이지
📂 GitHub: hayohio-bit/PortManager


왜 만들었나: 포트 충돌, 매번 netstat 치기 귀찮다

개발하다 보면 이런 에러를 자주 만납니다.

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

이 에러가 뜰 때마다 해야 하는 작업은 항상 같습니다.

  1. netstat -ano | findstr :3000 으로 PID 확인
  2. tasklist로 프로세스 이름 확인
  3. taskkill /F /PID xxxx 로 종료

세 번의 명령어를 매번 반복하는 것이 번거로워서, 이 과정을 클릭 한 번으로 해결하는 GUI 앱을 만들어봤습니다.


주요 기능

기능 설명
실시간 포트 조회 LISTEN 중인 TCP/UDP 포트를 전체 목록으로 표시
통합 검색 포트 번호, 프로세스 이름, PID, 주소를 한 번에 검색 (디바운싱 200ms)
프로토콜 필터 전체 / TCP / UDP 탭으로 빠르게 필터링
컬럼 정렬 프로토콜, 주소, 포트, PID, 프로세스 이름 기준 오름/내림차순
원클릭 프로세스 종료 Kill 버튼 → 확인 모달 → 강제 종료 (taskkill /F)
시스템 프로세스 보호 Windows 커널 프로세스(PID 4 등) 종료 차단
토스트 알림 성공/실패 결과를 화면 우측 하단에 3초간 표시
포터블 실행 설치 없이 exe 하나로 즉시 실행

💡 이런 분들에게 추천합니다

netstat 명령어에 익숙하지 않은 분
포트 점유 프로세스를 빠르게 확인하고 종료하고 싶은 분


다운로드 및 실행 방법

시스템 요구사항

  • Windows 10 / 11 (x64)
  • 일반 사용자 권한으로 실행 가능 (프로세스 종료 시에만 UAC 요청)

설치 및 실행

  1. 릴리즈 페이지에서 PortManager 1.0.0 Portable.exe 다운로드
  2. 파일을 더블클릭하여 실행
  3. 앱이 열리면 포트 목록이 자동으로 로드됩니다
  4. 프로세스 종료 시 UAC 창이 나타납니다. "예"를 클릭하면 해당 프로세스만 관리자 권한으로 종료됩니다

⚠️ Windows SmartScreen 경고가 뜨는 경우:
코드 서명이 없는 exe에서 발생합니다. "추가 정보" → "실행"을 클릭하면 정상 실행됩니다.


사용 화면

앱 레이아웃:

⚡ Port Manager [127개 포트] [🔄 새로고침]
🔍 [포트 번호 또는 프로세스 이름으로 검색...]
[전체] [TCP] [UDP]

프로토콜 | 주소      | 포트 | PID  | 프로세스   | 작업
TCP      | 0.0.0.0  | 3000 | 1234 | node.exe  | [종료]
TCP      | 0.0.0.0  | 5432 | 5678 | postgres  | [종료]
UDP      | 0.0.0.0  | 5353 | 912  | svchost   | [종료]

기술 스택

항목 내용
프레임워크 Electron 33
언어 JavaScript (Node.js 20+)
포트 조회 netstat -ano + tasklist (UTF-8 강제)
프로세스 종료 PowerShell Start-Process -Verb RunAs + taskkill
빌드 도구 electron-builder 25
배포 형태 Portable EXE (설치 불필요)

핵심 구현 설명

포트 조회: netstat + tasklist 병렬 실행

netstat -anotasklistPromise.all로 병렬 실행한 뒤, PID를 기준으로 매핑합니다. chcp 65001을 선행 실행하여 한글 Windows(CP949)에서도 UTF-8 출력을 보장합니다.

const [netstatResult, processMap] = await Promise.all([
  execAsync('chcp 65001 >nul 2>&1 && netstat -ano', { shell: true }),
  getProcessMap(),
]);

권한 모델: Hybrid Elevation

앱 자체는 asInvoker로 실행되어 UAC 차단 없이 즉시 시작됩니다. 프로세스 종료 시에만 PowerShell RunAs 동사로 해당 명령에 한해 관리자 권한을 요청합니다.

const command = `powershell -Command "Start-Process cmd -ArgumentList '/c taskkill /F /PID ${safePid}' -Verb RunAs -WindowStyle Hidden -Wait"`;
await execAsync(command);

보안 설계

  • 렌더러 격리: contextIsolation: true, nodeIntegration: false, sandbox: true
  • IPC 화이트리스트: contextBridge를 통해 getPorts(), killProcess() 두 개 API만 노출
  • 커맨드 인젝션 방지: PID 입력값을 정수로 검증 후 사용
  • 시스템 프로세스 보호: PID 4(Windows 커널) 등 보호 목록에 포함된 프로세스 종료 차단
  • CSP 적용: 인라인 스크립트, 외부 리소스 로딩 차단

프로젝트 구조

PortManager/
├── main.js                # Electron 메인 프로세스 (윈도우 생성, IPC 핸들러)
├── preload.js             # contextBridge IPC 브릿지
├── src/
│   └── services/
│       └── portService.js # netstat / tasklist 파싱, 프로세스 종료
└── renderer/
    ├── index.html         # 앱 레이아웃
    ├── css/style.css      # 스타일
    ├── js/app.js          # 검색/필터/정렬/모달/토스트 로직
    └── fonts/             # @fontsource/inter 오프라인 폰트

FAQ

Q. netstat로 직접 확인하는 것과 뭐가 다른가요?
A. netstat은 텍스트 출력이라 PID를 찾고, tasklist로 프로세스 이름을 다시 확인하고, taskkill로 종료하는 세 단계를 거쳐야 합니다. PortManager는 이 과정을 하나의 화면에서 검색, 확인, 종료까지 원클릭으로 처리합니다.

Q. 관리자 권한 없이도 사용할 수 있나요?
A. 포트 목록 조회는 일반 사용자 권한으로 가능합니다. 프로세스 종료 시에만 UAC 확인 창이 나타납니다.

Q. SmartScreen 경고는 왜 뜨나요?
A. 코드 서명이 없는 exe 파일에서 발생하는 일반적인 경고입니다. "추가 정보" → "실행"을 클릭하면 됩니다.

Q. 시스템 프로세스를 실수로 종료할 위험은 없나요?
A. Windows 커널 프로세스(PID 4 등)는 앱 내부에서 종료가 차단되며, 모든 종료 작업에 확인 모달이 표시됩니다.


마무리

포트 충돌은 개발 중 자주 마주치는 문제입니다. 기존에는 커맨드라인에서 여러 명령어를 조합해야 했지만, PortManager를 사용하면 GUI에서 클릭 한 번으로 해결할 수 있습니다. 버그 리포트, 기능 제안, PR 모두 환영합니다.

📥 다운로드: PortManager v1.0.0
🔗 GitHub: hayohio-bit/PortManager