[Java Spring] JSP를 사용한 Spring 프로젝트 배포

khj·2025년 3월 13일

Java

목록 보기
1/10

JSP를 사용한 Spring Boot 프로젝트를 Docker를 활용해 배포를 시도하던 과정에서 여러 시행착오가 생겼다.

1. 처음 시도: JAR 빌드 후 배포

처음에는 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 실행 방식과 호환되지 않는다는 점을 알게 되었다.

2. WAR 빌드로 전환

JAR 배포가 어렵다면, WAR 파일로 배포하면 해결될 것이라 생각했다.
그래서 프로젝트를 WAR로 변경하고, provided 스코프를 사용하여 내장 톰캣을 제외한 후 외부 톰캣에 배포하려고 했다.

설정 변경

2.1. build.gradle에서 war 플러그인 적용

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
}

2.2. spring-boot-starter-tomcat을 provided로 설정

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
}

2.3. SpringBootServletInitializer를 상속받아 configure() 메서드 오버라이딩

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);
    }
}

위와 같이 설정한 후 WAR 파일을 Docker 컨테이너에서 실행해 보았다.

프로젝트는 실행되었지만 웹 페이지는 에러를 띄워주고 있었다.

3. Docker Container Logs 확인

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


로그 파일은 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의 호환 버전에 대한 글을 찾았다.

4. 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"]

이후 다시 빌드 및 실행해보니 정상적으로 동작했다.

5. 결론

  • JSP를 사용하는 Spring Boot 프로젝트는 WAR로 빌드하여 외부 Tomcat에 배포해야 한다.

  • 내장 Tomcat을 사용할 경우 web.xml을 직접 작성하지 않아도 자동으로 처리되지만, Java와 Tomcat 버전의 호환성을 반드시 확인해야 한다.

profile
Spring, Django 개발 블로그

0개의 댓글