본문 바로가기
IT개발/이슈관리

포트 충돌 문제(해결)

by 시간기억자 2025. 1. 24.
반응형

인텔리제이로 스프링 부트 프로젝트를 진행하다가 잠깐 다른 스프링 프로젝트를 확인하기 위해 서버를 껐다가 다시 Run 했는데,

아래와 같은 에러가 발생했다.

/Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home/bin/java -Dcatalina.home=/Users/hyosukjung/workspace/apache-tomcat-9.0.89 -Dcatalina.base=/Users/hyosukjung/.SmartTomcat/portfolio_2024/spring -Djava.io.tmpdir=/Users/hyosukjung/.SmartTomcat/portfolio_2024/spring/temp -Djava.util.logging.config.file=/Users/hyosukjung/.SmartTomcat/portfolio_2024/spring/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager "-javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=52060:/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Users/hyosukjung/workspace/apache-tomcat-9.0.89/bin/bootstrap.jar:/Users/hyosukjung/workspace/apache-tomcat-9.0.89/bin/tomcat-juli.jar org.apache.catalina.startup.Bootstrap start
NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
23-Jan-2025 15:29:22.411 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 서버 버전 이름:    Apache Tomcat/9.0.89
23-Jan-2025 15:29:22.416 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server 빌드 시각:  May 3 2024 20:22:11 UTC
23-Jan-2025 15:29:22.416 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server 버전 번호:  9.0.89.0
23-Jan-2025 15:29:22.416 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 운영체제 이름:     Mac OS X
23-Jan-2025 15:29:22.416 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 운영체제 버전:     12.7.6
23-Jan-2025 15:29:22.416 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 아키텍처:          x86_64
23-Jan-2025 15:29:22.417 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 자바 홈:           /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home
23-Jan-2025 15:29:22.417 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM 버전:          11.0.24+7-LTS-271
23-Jan-2025 15:29:22.417 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM 벤더:          Oracle Corporation
23-Jan-2025 15:29:22.417 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:     /Users/hyosukjung/.SmartTomcat/portfolio_2024/spring
23-Jan-2025 15:29:22.417 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:     /Users/hyosukjung/workspace/apache-tomcat-9.0.89
23-Jan-2025 15:29:22.434 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  --add-opens=java.base/java.lang=ALL-UNNAMED
23-Jan-2025 15:29:22.434 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  --add-opens=java.base/java.io=ALL-UNNAMED
23-Jan-2025 15:29:22.434 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  --add-opens=java.base/java.util=ALL-UNNAMED
23-Jan-2025 15:29:22.434 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
23-Jan-2025 15:29:22.435 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
23-Jan-2025 15:29:22.435 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  -Dcatalina.home=/Users/hyosukjung/workspace/apache-tomcat-9.0.89
23-Jan-2025 15:29:22.435 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  -Dcatalina.base=/Users/hyosukjung/.SmartTomcat/portfolio_2024/spring
23-Jan-2025 15:29:22.435 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  -Djava.io.tmpdir=/Users/hyosukjung/.SmartTomcat/portfolio_2024/spring/temp
23-Jan-2025 15:29:22.436 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  -Djava.util.logging.config.file=/Users/hyosukjung/.SmartTomcat/portfolio_2024/spring/conf/logging.properties
23-Jan-2025 15:29:22.436 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
23-Jan-2025 15:29:22.436 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  -javaagent:/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar=52060:/Applications/IntelliJ IDEA CE.app/Contents/bin
23-Jan-2025 15:29:22.436 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log 명령 행 아규먼트:  -Dfile.encoding=UTF-8
23-Jan-2025 15:29:22.450 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent 프로덕션 환경들에서 최적의 성능을 제공하는, APR 기반 Apache Tomcat Native 라이브러리가, 다음 java.library.path에서 발견되지 않습니다: [/Users/hyosukjung/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:.]
23-Jan-2025 15:29:22.819 INFO [main] org.apache.coyote.AbstractProtocol.init 프로토콜 핸들러 ["http-nio-8080"]을(를) 초기화합니다.
23-Jan-2025 15:29:22.832 SEVERE [main] org.apache.catalina.util.LifecycleBase.handleSubClassException 구성요소 [Connector["http-nio-8080"]]을(를) 초기화하지 못했습니다.
	org.apache.catalina.LifecycleException: 프로토콜 핸들러 초기화가 실패했습니다.
		at org.apache.catalina.connector.Connector.initInternal(Connector.java:1012)
		at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
		at org.apache.catalina.core.StandardService.initInternal(StandardService.java:525)
		at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
		at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:990)
		at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:127)
		at org.apache.catalina.startup.Catalina.load(Catalina.java:686)
		at org.apache.catalina.startup.Catalina.load(Catalina.java:709)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:302)
		at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:472)
	Caused by: java.net.BindException: Address already in use
		at java.base/sun.nio.ch.Net.bind0(Native Method)
		at java.base/sun.nio.ch.Net.bind(Net.java:459)
		at java.base/sun.nio.ch.Net.bind(Net.java:448)
		at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227)
		at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:268)
		at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:223)
		at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1355)
		at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1368)
		at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:654)
		at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:75)
		at org.apache.catalina.connector.Connector.initInternal(Connector.java:1010)
		... 13 more
23-Jan-2025 15:29:22.834 INFO [main] org.apache.catalina.startup.Catalina.load [666] 밀리초 내에 서버가 초기화되었습니다.
23-Jan-2025 15:29:22.885 INFO [main] org.apache.catalina.core.StandardService.startInternal 서비스 [Catalina]을(를) 시작합니다.
23-Jan-2025 15:29:22.885 INFO [main] org.apache.catalina.core.StandardEngine.startInternal 서버 엔진을 시작합니다: [Apache Tomcat/9.0.89]
23-Jan-2025 15:29:22.894 INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor 배치 descriptor [/Users/hyosukjung/.SmartTomcat/portfolio_2024/spring/conf/Catalina/localhost/ROOT.xml]을(를) 배치합니다.
23-Jan-2025 15:29:25.856 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars 적어도 하나의 JAR가 TLD들을 찾기 위해 스캔되었으나 아무 것도 찾지 못했습니다. 스캔했으나 TLD가 없는 JAR들의 전체 목록을 보시려면, 로그 레벨을 디버그 레벨로 설정하십시오. 스캔 과정에서 불필요한 JAR들을 건너뛰면, 시스템 시작 시간과 JSP 컴파일 시간을 단축시킬 수 있습니다.
INFO : org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization started
WARN : org.mybatis.spring.SqlSessionFactoryBean - Property 'mapperLocations' was specified but matching resources are not found.
INFO : org.springframework.web.context.ContextLoader - Root WebApplicationContext initialized in 943 ms
INFO : org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'appServlet'
INFO : org.springframework.web.servlet.DispatcherServlet - Completed initialization in 2083 ms
23-Jan-2025 15:29:29.136 INFO [main] org.apache.catalina.startup.HostConfig.deployDescriptor 배치 descriptor [/Users/hyosukjung/.SmartTomcat/portfolio_2024/spring/conf/Catalina/localhost/ROOT.xml]의 배치가 [6,243] 밀리초 내에 완료되었습니다.
23-Jan-2025 15:29:29.144 INFO [main] org.apache.catalina.startup.Catalina.start 서버가 [6309] 밀리초 내에 시작되었습니다.
http://localhost:8080/
23-Jan-2025 15:29:29.148 SEVERE [main] org.apache.catalina.core.StandardServer.await 주소 [localhost]와(과) 포트 [8005]에, 서버 셧다운 소켓을 생성하지 못했습니다. (base 포트 [8005], offset [0])
	java.net.BindException: Address already in use (Bind failed)
		at java.base/java.net.PlainSocketImpl.socketBind(Native Method)
		at java.base/java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:452)
		at java.base/java.net.ServerSocket.bind(ServerSocket.java:381)
		at java.base/java.net.ServerSocket.<init>(ServerSocket.java:243)
		at org.apache.catalina.core.StandardServer.await(StandardServer.java:541)
		at org.apache.catalina.startup.Catalina.await(Catalina.java:825)
		at org.apache.catalina.startup.Catalina.start(Catalina.java:773)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
		at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
		at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
		at java.base/java.lang.reflect.Method.invoke(Method.java:566)
		at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:345)
		at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
23-Jan-2025 15:29:29.148 INFO [main] org.apache.coyote.AbstractProtocol.pause 프로토콜 핸들러 ["http-nio-8080"]을(를) 일시 정지 중
23-Jan-2025 15:29:29.148 INFO [main] org.apache.catalina.core.StandardService.stopInternal 서비스 [Catalina]을(를) 중지시킵니다.
23-Jan-2025 15:29:29.547 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc 웹 애플리케이션 [ROOT]이(가) JDBC 드라이버 [net.sf.log4jdbc.sql.jdbcapi.DriverSpy]을(를) 등록했지만, 웹 애플리케이션이 중지될 때, 해당 JDBC 드라이버의 등록을 제거하지 못했습니다. 메모리 누수를 방지하기 위하여, 등록을 강제로 제거했습니다.
23-Jan-2025 15:29:29.547 WARNING [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc 웹 애플리케이션 [ROOT]이(가) JDBC 드라이버 [oracle.jdbc.OracleDriver]을(를) 등록했지만, 웹 애플리케이션이 중지될 때, 해당 JDBC 드라이버의 등록을 제거하지 못했습니다. 메모리 누수를 방지하기 위하여, 등록을 강제로 제거했습니다.
23-Jan-2025 15:29:29.552 INFO [main] org.apache.coyote.AbstractProtocol.stop 프로토콜 핸들러 ["http-nio-8080"]을(를) 중지시킵니다.
23-Jan-2025 15:29:29.553 INFO [main] org.apache.coyote.AbstractProtocol.destroy 프로토콜 핸들러 ["http-nio-8080"]을(를) 소멸시킵니다.

Process finished with exit code 0

 

 

GTP에게 물어보니 포트가 충돌된 문제라고 하였다.

단순히 먼저 돌리던 서버를 끄고 새로 연 스프링 프로젝트에서 서버를 돌리니 문제가 없다고 생각했는데, 해당 문제가 발생한 것이다.

 

그래서 이런 경우에는 앞서 실행되고 있는 포트를 강제 종료 시켜줘야 한다.

 

해결방법

1) 터미널에서 현재 포트를 사용 중인 프로세스를 확인한 뒤 종료

  • MacOS 및 Linux : 결과에서 PID를 확인한 후, 해당 프로세스를 종료합니다:
lsof -i :8080
lsof -i :8005
kill -9 <PID>

 

  • Windows : PID를 확인한 뒤, 작업 관리자를 사용해 프로세스를 종료
netstat -ano | findstr :8080
netstat -ano | findstr :8005
taskkill /PID <PID> /F

 

2) 포트를 변경

 

  • server.xml 파일을 열어 HTTP 포트(8080) 및 Shutdown 포트(8005)를 다른 값으로 변경합니다.
  • 경로: /Users/hyosukjung/workspace/apache-tomcat-9.0.89/conf/server.xml
  • 예:

 

<Connector port="8081" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

<Server port="8006" shutdown="SHUTDOWN">

포트충돌이 발생하는 이유

1. 기존 서버 프로세스가 완전히 종료되지 않은 경우

서버를 중지시켰다고 생각했지만, 실제로는 서버 프로세스가 완전히 종료되지 않았을 수 있다. 특히 Tomcat 같은 서버는 중지 명령을 받더라도 프로세스가 완전히 종료되기까지 시간이 조금 걸릴 수 있다.
즉, 프로세스가 백그라운드에서 여전히 실행 중이라서 해당 포트를 점유하고 있을 가능성이 있다.

  • 해결 방법:
    1. 포트를 사용 중인 프로세스를 확인 (예: netstat, lsof 명령 사용)
    2. 해당 프로세스를 강제로 종료
    3. 이후 서버를 재시작
# Windows
netstat -ano | findstr :8080

# Mac/Linux
lsof -i :8080
kill -9 [PID]

 

2. Shutdown 포트(8005)가 충돌하는 경우

Tomcat은 기본적으로 **Shutdown 포트(8005)**를 사용하여 종료 명령을 받는다. 만약 이전 서버가 8005 포트를 점유하고 있거나, 중지 명령이 실패하여 여전히 포트를 점유하고 있다면 충돌이 발생할 수 있다.

  • 해결 방법:
    server.xml 파일에서 Shutdown 포트를 변경합니다. 예를 들어, 8006으로 변경할 수 있다.
    또는 Shutdown 포트를 사용하지 않도록 설정할 수도 있다.
<Server port="8006" shutdown="SHUTDOWN">
<Server port="-1" shutdown="SHUTDOWN">

 

3. 운영체제의 TIME_WAIT 상태

서버를 중지했더라도 운영체제가 해당 포트를 일정 시간 동안 TIME_WAIT 상태로 유지할 수 있다. 이는 네트워크 연결을 안전하게 종료하기 위한 TCP의 표준 동작이다.
TIME_WAIT 상태에서는 포트를 새로운 프로세스에서 사용할 수 없기 때문에 충돌이 발생한다.

  • 해결 방법:
    1. netstat 또는 lsof 명령어로 TIME_WAIT 상태를 확인
    2. TIME_WAIT 상태가 많다면 서버 재부팅을 고려하거나, 개발 환경에서만 TCP 포트 재사용 옵션을 활성화할 수 있다.
      (예: Linux의 경우 /etc/sysctl.conf에서 tcp_tw_reuse를 설정)
netstat -an | grep 8080

 

 

4. 다른 애플리케이션이 포트를 점유하고 있는 경우

다른 애플리케이션(예: Docker 컨테이너, 로컬 개발 서버 등)이 동일한 포트를 이미 사용 중일 수도 있다. 이전 서버와 무관하게 전혀 다른 프로세스가 8080 또는 8005 포트를 사용하고 있는 경우이다.

  • 해결 방법:
    1. 포트를 점유한 프로세스를 확인.
      점유 중인 프로세스의 PID를 확인한 뒤, 해당 프로세스를 종료.
    2. 서버에서 사용하는 포트를 변경합니다.
      예: application.properties 또는 server.xml 파일에서 8081 같은 다른 포트를 설정.
netstat -ano | findstr :8080
server.port=8081

 

5. 서버가 비정상 종료된 경우

서버가 비정상적으로 종료되면 해당 프로세스는 이미 종료되었지만, 운영체제는 여전히 포트를 사용 중인 것으로 간주할 수 있다. 이는 위의 TIME_WAIT 상태와 유사하지만, 더 비정상적인 상황일 수 있다.

  • 해결 방법:
    운영체제의 포트 점유 상태를 정리하거나 서버를 재부팅.

 

반응형

댓글