2장 Tomcat과 Jakarta 호환성을 먼저 잠근다
배포 장애의 상당수는 소스가 아니라 세대 차이다. Tomcat 10 이상은 Jakarta EE 네임스페이스인 jakarta.*를 사용한다. 오래된 애플리케이션이 javax.servlet.*로 컴파일됐다면 단순히 WAR를 Tomcat 11에 복사해 해결되지 않는다. 소스를 마이그레이션하거나 호환되는 컨테이너 계열을 유지해야 한다.
2026년 8월 기준 Tomcat 11.0 문서는 Servlet 6.1 계열과 Java 17 이상을 전제로 한다. 운영에서는 “최신”이라는 말 대신 다음 호환성 표를 저장소에 둔다.
| 경계 | 프로젝트가 고정할 값 | 확인 명령 |
|---|---|---|
| 빌드 JDK | 예: 21 | ./mvnw -version |
| bytecode target | 예: 17 또는 21 | 빌드 설정과 javap -verbose |
| Servlet namespace | jakarta 또는 javax |
import와 의존성 트리 |
| Tomcat 계열 | 예: 11.0.x | $CATALINA_HOME/bin/version.sh |
| 운영 JVM | 검증된 공급자·패치 | java -version |
개발 PC의 java -version만 보면 부족하다. Maven이나 IDE가 다른 JDK를 사용할 수 있다. 빌드 로그에 Maven JVM, compiler release, Git commit을 남긴다. UnsupportedClassVersionError가 나면 서버 JVM을 무작정 올리기 전에 조직 지원 정책과 애플리케이션의 target을 비교한다.