Spring boot를 tomcat에서 war 구동 시 tomcat이 꺼지는 이슈

6678 단어 tomcattomcat

❗ 이슈 사항

Spring Boot 기반의 프레임워크로 개발하여 War파일로 말아 tomcat에서 구동했을 때,
이 프로세스가 자동으로 죽는 증상이 발생한다.
개발을 Spring Boot로 해본적이 없다보니 이 원인을 확인하기 위해서 Spring Boot 의 구조나 구동에 대해서 알아야 했다.
또한 DB의 경우 Hikari를 이용한 DB Connection 을 사용한다고 하는데 내가 다니는 회사에서는 처음 사용한 기술이라고 했다.

* 버전 내용
Spring Boot version : 2.6.3
Tomcat Version : 8.5


💥 원인 예상

1. 스프링부트의 이중 실행

서버 로그에서 Spring boot 를 Tomcat으로 구동했을 때, 로그 내에서 스프링부트를 두번 실행하는 것처럼
동일한 로그가 두번 찍히는게 보였다.
처음에 스프링부트의 내용을 자세하게 몰랐고, 또한 톰캣 로그 설정 시 설정이 잘못되어 로그를
catalina 로그에 두번 찍는 경우도 있었기 때문이다.


2. Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found, trying direct instantiation 에러

디버깅 로그에서 찾은 에러로그이다.
오라클 9 이후로는 oracle.jdbc.OracleDriver 로 사용을 하는데
oracle.jdbc.driver.OracleDriver로 사용하게 되면 발생하는 에러지만 이는 자동으로 자기가 맞는 드라이버를 찾아서 사용하는 로그가 보여서 의심하긴 했지만 큰 기대는 안했다.


3. Spring Boot 와 Tomcat 버전 호환 관련

로컬에서는 정상적으로 구동이 됬다고 했고 장기간 사용하지 않고 구동해놔도 문제가 없었다고 한다.
로컬의 톰캣 버전은 9.0 버전
서버의 톰캣 버전은 8.5 버전
이 톰캣 버전이 제대로 호환이 되지 않아서 그렇지 않을까 라는 의심도 했다.


💬 원인 확인

1. Spring Boot 와 Tomcat 버전 호환 관련
Tomcat 버전을 로컬에서 사용하는 버전으로 변경

Tomcat Release Note
Apache Tomcat 9.x 는 가장 최신형 버전이며 아직 안정적인 단계는 아닙니다.
Tomcat 8.0.x 및 8.5.x를 기반으로하며 Servlet 4.0 , JSP 2.3 , EL 3.0 , WebSocket 1.1 및 JASPIC 1.1 사양 (Java EE 8 플랫폼에 필요한 버전)을 구현합니다.
여기에는 다음과 같은 중요한 개선 사항이 포함됩니다.
HTTP / 2에 대한 지원 추가 (Java 9 (Apache Tomcat 9.0.0.M18 이후) 또는 Tomcat 네이티브 라이브러리가 설치되어 있어야 함)
JSSE 커넥터 (NIO 및 NIO2)와 함께 TLS 지원을위한 OpenSSL 사용에 대한 지원을 추가합니다.
SNI (TLS 가상 호스팅)에 대한 지원을 추가합니다.

2. Registered driver with driverClassName=oracle.jdbc.driver.OracleDriver was not found, trying direct instantiation 에러
이 드라이버를 제대로 못잡았다면 DB Connection 도 되지 않을 것이라고 한다. 그래서 이 의심 대상에서 제외하였다.

3. 스프링부트의 이중 실행
로컬에서는 테스트에서 극히 정상적으로 구동됬다고 한다.
구글링을 해본 결과 비슷한 증상을 겪은 사람은 흔치 않았다...
실질적으로 톰캣이 꺼지거나 했던 증상은 없었던거 같다.
하지만 서버에서 톰캣을 구동했을 때, 두번을 실행하는 것 같아 보였다.
이렇게 되면, 실질적으로 프로세스가 두개뜨거나 하진 않는다.
1차로 구동되고 자기가 알아서 다시 죽이고 다시 올린다.
하지만 스케줄러 및 인스턴스는 죽지 않는다고 한다.
혹시나 추후에 발생한다면 아래와 같이 처리하면 될 것 같다.

원인은 하나의 Host에서 appBase와 docBase가 같은 경로를 바라보고 있었던 것이 문제라고한다.
Tomcat에서 동일한 Web Application Context가 두 개가 작동하는 것이 문제가 될 수 있음.

appBase : 여러 webapp들이 들어가는 부모디렉토리
docBase : 실제로 동작하는 프로젝트 디렉토리

구동 시, tomcat이 webapps에서 한번 실행시키고 프로젝트 war를 언패킹하면서 한번더 실행한다고 한다.
이중으로 뜨는건 아니지만, 이게 스케쥴러는 죽지 않는다고 한다.

[변경전]
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
         <Context path="/" docBase="war/ZEPOINT_IF.war" reloadable="false"/>


[변경후]         
      <Host name="localhost"  appBase=""
            unpackWARs="true" autoDeploy="false">
         <Context path="/" docBase="war/ZEPOINT_IF.war" reloadable="false"/>

✅ 문제 해결

[2022.03.18]
Tomcat 버전을 9.0이상으로 변경하고 나니 이 증상은 해결되었다.
아무래도 이중 실행에 대한 부분은 톰캣이 재 기동되는 증상은 흔하지 않았고 추후에 다른 증상으로 나올듯 보인다.
하지만 이번 이슈에 대한 해답은 버전이였다.
Spring Boot 와 tomcat버전이 맞지 않아서 발생한것으로 보여진다.

좋은 웹페이지 즐겨찾기