톰캣 9에 스프링 부트 3 올렸다가 하루 날린 이야기
다른 프로젝트 때문에 로컬에 톰캣 9를 깔아 두고 쓰고 있었는데, 개인 프로젝트도 그냥 거기에 WAR로 올려 보려고 했다. 스프링 부트 3으로 만든 프로젝트였다.
배포는 잘 됐다. webapps 아래에 폴더도 풀렸고 톰캣 로그에도 "Deployment of web application ... has finished" 라고 찍혔다. 그런데 어떤 주소로 들어가도 404.
컨텍스트 경로를 잘못 잡았나 싶어서 ROOT로 바꿔 보고, server.xml도 열어 보고, 캐시 지우고 재시작도 몇 번 했다. 그래도 404. 제일 답답했던 건 에러가 하나도 없다는 거였다. 스프링 배너조차 안 뜨는데 실패했다는 말도 없다.
원인
스프링 부트 3부터는 javax.servlet이 아니라 jakarta.servlet을 쓴다. 톰캣 9는 javax 기반(Servlet 4.0)이고, jakarta는 톰캣 10부터다.
WAR로 배포하면 톰캣이 ServletContainerInitializer 구현체를 찾아서 애플리케이션을 띄우는데, 톰캣 9는 javax.servlet.ServletContainerInitializer만 찾는다. 스프링 쪽 구현체는 jakarta.servlet... 패키지에 있으니까 톰캣 입장에서는 그냥 "초기화할 게 없는 빈 웹앱"이 된다. 그래서 에러 없이 조용히 404가 나온 거였다.
알고 나니까 허무했다.
버전 정리
내가 헷갈려서 적어 둔다.
| 스프링 부트 | 서블릿 | 톰캣 |
|---|---|---|
| 2.x | javax (4.0) | 9 |
| 3.x | jakarta (6.0) | 10.1 이상 |
| 4.x | jakarta (6.1) | 11 |
결국
개인 프로젝트용으로 톰캣 10.1을 따로 받아서 IntelliJ에 하나 더 등록했다. 톰캣은 압축만 풀면 되니까 버전별로 여러 개 둬도 크게 상관없다.
다음에 비슷한 증상이 나오면 로그부터 뒤지지 말고 톰캣 버전부터 확인할 것.