Soda

[Soda] Tomcat is not listening...

오잎 클로버 2023. 8. 10. 16:08
728x90

출처: https://benycat.co.kr/47

Java 17+ 에 친화적인 웹 프레임워크를 직접 만들고자 Embedded Tomcat를 사용하여 HTTP 요청과 응답이 정상적으로 이루어지는지가 궁금하여 테스트하던 도중, Tomcat Server가 Listening 하고 있는 port number가 -1로 나와서 당황하였다.

 

그도 그럴 것이 필자는 스프링 부트를 통한 간접적인 사용을 주로 했었기에 어떻게 해결해야 하는 지를 몰랐다. 물론 Tomcat을 직접 사용해 본 경험이 있으나 7 ~ 8 사이의 버전을 주로 사용했었고, 해당 EmbeddedTomcat의 버전은 10.1.11로 현재 마일스톤 버전들을 제외하고선 가장 최신 버전이다. 

 

문제 접근

출처: 익명이

필자가 기억하기로는 다음과 같이 설정하면 port number가 설정되었다.

Tomcat tomcat = new Tomcat();
tomcat.setPort(port);

여기서 port가 이미 점유되고 있다면 tomcat#start에서 예외가 발생한다.

 

필자는 기억했던 대로 위와 같이 코드를 구성하였지만 톰캣은 특정 port를 읽고(점유)있다는 로그가 나오지 않았으며, terminal을 사용하여 특정 포트가 점유 중인지 확인했을 때에는 해당 포트는 애당초 사용 중이 아니었다. 그렇기에 현재 톰캣은 무슨 포트를 점유하고 있는 지를 파악하기 위해 직접 로그를 출력하였다. (tomcat.getServer().getPort()를 통해 현재 서버가 점유하고 있는 포트 넘버를 확인할 수 있다.)

 

문제 해결

본 문제는 얼떨결에 해결하게 되었다. 필자는 tomcat 인스턴스가 사용할 수 있는 메소드들 중 해결방법이 있으리라 굳게 믿고, 각 메소드들의 Javadoc을 읽기 시작했다. 그중 getConnector()라는 메소드가 눈에 띄었는 데, Javadoc을 읽어보면 embeddedTomcat을 사용하여 기본적인 Http connector를 만들 수 있고, 톰캣 설정들로 connector를 생성한다고 명시되어 있었다. 해당 메소드를 이용한다면 tomcat의 멤버 변수인 server에 connector를 주입시킬 수 있을 것이고 그렇게 된다면 start 메소드를 호출했을 때 정상적으로 연결이 될 것이라고 생각하여 곧바로 실행에 옮겼다.

 

그리고 필자의 생각은 정확히 맞아떨어졌다.

 

문제 원인

Tomcat 9+ 부터는 더 이상 자동으로 getConnector()를 호출해주지 않아 발생하는 이슈라고 한다. 저 메소드의 역할은 앞서 설명하였듯 멤버 변수인 server에 connector를 주입시키고, start 메소드를 호출시키면, server 변수를 통해 실행되는 원리였다. 즉, server가 초기화 혹은 새로 할당되지 않아 문제가 발생했던 것이었다.

 

여담

EmbeddedTomcat을 직접 사용해 보는 건 처음이라 아직 모든 것이 어색하다. 하지만 동시에 많은 걸 경험하며 색다른 개발을 할 수 있는 것 같아 신이 난다.