JSP를 사용한 Spring Boot 프로젝트를 Docker를 활용해 배포를 시도하던 과정에서 여러 시행착오가 생겼다.
처음에는 Spring Boot 프로젝트를 JAR 파일로 빌드하여 Docker 컨테이너에서 실행하려고 했다.
보통 Spring Boot에서는 spring-boot-starter-web을 사용하면 내장 Tomcat을 통해 JAR로 쉽게 실행할 수 있다.
docker build -t app .
docker run -p 8080:8080 app
하지만 실행하는 과정에서 JSP 파일을 찾지 못하는 문제가 발생했다. JSP는 기본적으로 내장 톰캣의 JAR 실행 방식과 호환되지 않는다는 점을 알게 되었다.
JAR 배포가 어렵다면, WAR 파일로 배포하면 해결될 것이라 생각했다.
그래서 프로젝트를 WAR로 변경하고, provided 스코프를 사용하여 내장 톰캣을 제외한 후 외부 톰캣에 배포하려고 했다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.4.1'
id 'io.spring.dependency-management' version '1.1.7'
id 'war'
}
bootJar {
enabled = false
}
war {
enabled = true
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}
package app.App;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder applicationBuilder) {
return applicationBuilder.sources(AppShopApplication.class);
}
}
프로젝트는 실행되었지만 웹 페이지는 에러를 띄워주고 있었다.

로컬 환경에서 테스트를 진행할 때는 프로젝트가 잘 실행되었다.
컨테이너로 실행될 때만 문제가 있으니 도커 컨테이너의 로그를 확인해봤다.
로그 파일은 Docker의 usr/local/tomcat/logs 경로에서 확인할 수 있다.

13-Mar-2025 06:12:05.924 WARNING [main] org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [6.0]. Default version will be used.
13-Mar-2025 06:12:05.934 WARNING [main] org.apache.tomcat.util.descriptor.web.WebXml.setVersion Unknown version string [5.0]. Default version will be used.
이 메시지는 Tomcat이 web.xml의 버전을 제대로 인식하지 못하는 경우 발생한다고 한다.
도커 이미지를 빌드할 때 Tomcat 9를 사용했지만 web.xml이 6.0이나 5.0으로 설정되어 있어 Tomcat이 이를 올바르게 처리하지 못하고 기본 버전으로 대체한 것이다.
하지만 내장 Tomcat을 사용할 경우 별도로 web.xml을 작성하지 않아도 되기 때문에 프로젝트에 web.xml이 없었다.
그래서 web.xml을 직접 작성해야 할지 고민을 하다가 Tomcat과 Java의 호환 버전에 대한 글을 찾았다.
Java 17과 Tomcat 9을 사용하고 있었는데, Tomcat 9은 Java 17을 공식적으로 지원하지 않는다는 점을 알게 되었다.
Docker 이미지를 Java 17과 호환되는 Tomcat 11 기반으로 변경하였다.
FROM tomcat:9-jdk17
WORKDIR /usr/local/tomcat
RUN rm -rf /webapps/*
COPY build/libs/app-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/ROOT.war
EXPOSE 8080
CMD ["catalina.sh", "run"]
이후 다시 빌드 및 실행해보니 정상적으로 동작했다.
JSP를 사용하는 Spring Boot 프로젝트는 WAR로 빌드하여 외부 Tomcat에 배포해야 한다.
내장 Tomcat을 사용할 경우 web.xml을 직접 작성하지 않아도 자동으로 처리되지만, Java와 Tomcat 버전의 호환성을 반드시 확인해야 한다.