개발을 하던 도중 갑자기 뜬금없이
이런 에러가 뜨면서 실행이 안된다...
org.springframework.boot.web.server.PortInUseException: Port 8080 is already in use
Caused by: java.lang.IllegalArgumentException: standardService.connector.startFailed
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
Caused by: java.net.BindException: Address already in use
Description:
Web server failed to start. Port 8080 was already in use.
결론은 웹 서버가 시작하려고 했으나 이미 8080 포트가 다른 프로세스에 의해 사용 중이어서 서버를 시작할 수 없다는 것이다. 포트 충돌로 인해 발생하는 일반적인 문제이며, 주로 로컬 개발 환경에서 자주 발생한다.
에러 메시지가 길어보이지만, 사실상 Description 부분만 잘 살펴봐도 어떤게 문제인지 딱 느낌이 온다.
보통 이 경우에는 해결 방법이 크게 두 가지가 있다.
왜인지 모르겠지만 실행되고 있는 8080 포트를 종료시키거나, 어플리케이션 포트를 8080이 아닌 다른 것으로 바꾸는 것이다.(ex.실행하려는 애플리케이션 포트를 8088로 변경한다던지...)
나는 현재 모든 프로젝트를 기본 8080포트를 사용해 진행하고 있고, 여러 프로젝트를 동시에 개발해야 하는 상황이다 보니 이 문제를 다시 마주할 확률이 높다.
때문에 어플리케이션 포트를 바꾸는 것이 가장 근본적인 해결책이지만, 팀원들에게 물어보지 않고 포트를 마음대로 바꾸는 것은 무리가 있으니 첫 번째 해결 방법으로 간단하게 해결하고자 한다!
sudo lsof -i :8080
중요한 몇 가지 부분만 살펴보면
COMMAND: 실행 중인 프로그램의 이름. 여기서는 java라는 이름이 보이는데, 이는 Java 기반의 애플리케이션이 포트 8080을 사용하고 있다는 것을 나타낸다.
PID: 프로세스 ID
NODE NAME: 네트워크 연결의 엔드포인트 이름
http-alt는 8080 포트의 공식 이름 중 하나이다. 즉, 여기서 모든 인터페이스에서 8080포트를 리스닝하고 있다는 것을 알 수 있다.
sudo kill -9 [PID]
kill -9 명령은 입력한 PID를 가진 프로세스를 강제로 종료한다. -9 옵션은 해당 프로세스를 정상적인 종료 절차 없이 즉시 종료시키므로, 일반적으로 다른 종료 방법이 효과가 없을 때 사용한다.
현재 나는 도대체 이 프로세스가 어떻게 어디서 왜 실행됐는지 모르는 상황이므로, 그냥 kill -9 를 써서 종료시키겠다.
종료시키고 다시 sudo lsof -i :8080 명령어로 조회해보니 아무것도 나오지 않는 것을 볼 수 있다.
-> 성공적으로 종료 됐다고 보면 된다.
문제 없이 실행된다! 해결! 👍👍