알아가기/Spring

[Spring] SpringBootServletInitializer 알아보기 (ApplicationContextException: Unable to start 에러 해결)

XEV 2023. 8. 5. 14:34

IntelliJ에서 생성한 프로젝트를 STS에서 실행하려는데 `ApplicationContextException: Unable to start` 에러가 출력되었다.

어플리케이션을 실행하는 클래스에 `extends SpringBootServletInitializer`를 추가하니 해결이 되었다.

발생한 오류를 발판삼아 SpringBootServletInitializer에 대해 알아본다.

 

@SpringBootApplication
public class YourAppliationName extends SpringBootServletInitializer{
 public static void main(String[] args) {
 SpringApplication.run(YourAppliationName.class, args);
 }
}

 

WAR 파일로 배포하기 위한 클래스

`SpringBootServletInitializer`는 Spring Boot 애플리케이션을 WAR 파일로 배포할 때 사용되는 클래스이다. WAR(웹 애플리케이션 아카이브) 파일은 서블릿 컨테이너에 배치하여 실행되는 Java 웹 애플리케이션의 압축된 형식이다. 이때 `SpringBootServletInitializer`는 Spring Boot 애플리케이션을 서블릿으로 등록하여 WAR 파일이 서블릿 컨테이너에서 실행될 수 있도록 해준다.


Spring Boot는 기본적으로 내장형 서버(embedded server)를 사용하여 JAR 파일로 실행될 수 있다. 이렇게 하면 애플리케이션을 간단하고 빠르게 실행할 수 있으며, WAR 파일로 묶지 않아도 된다. 따라서 일반적으로 Spring Boot 애플리케이션은 `SpringBootServletInitializer`를 상속하지 않아도 잘 작동한다.


하지만 특정 상황에서는 WAR 파일로 배포해야 할 필요가 있을 수 있다. 예를 들어, 기존의 웹 애플리케이션에 Spring Boot 기능을 통합하거나, 특정 호스팅 환경에서 WAR 파일로 실행해야 하는 경우가 있을 수 있다. 이때 `SpringBootServletInitializer`를 상속하여 `configure` 메서드를 오버라이드하면 된다.

IntelliJ에서는 기본적으로 Spring Boot의 내장형 서버를 사용하여 애플리케이션을 실행하기 때문에, WAR 파일로 배포할 필요가 없는 경우에는 `SpringBootServletInitializer`를 상속하지 않아도 정상적으로 작동한다.

하지만 STS(Spring Tool Suite)와 같은 특정 IDE나 환경에서는 기본적으로 WAR 파일로 배포하는 설정으로 되어있을 수 있다. 이때 WAR 파일로 배포하려면 `SpringBootServletInitializer`를 상속하고, `configure` 메서드를 구현해야 합니다. 만약 `SpringBootServletInitializer`를 상속하지 않은 상태로 WAR 파일로 배포하려고 하면, `ApplicationContextException: Unable to start`와 같은 에러가 발생할 수 있다.

따라서 IntelliJ에서는 기본적으로 JAR 파일로 실행되므로 `SpringBootServletInitializer`를 상속하지 않아도 되지만, STS와 같은 IDE에서는 WAR 파일로 배포하려면 `SpringBootServletInitializer`를 상속해야 한다.

 

오류 해결 참고

https://stackoverflow.com/questions/50231736/applicationcontextexception-unable-to-start-servletwebserverapplicationcontext

 

ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean

I have written a spring batch application using Spring boot. When I am trying to run that application using command line and classpath on my local system it is running fine. However, when I tried t...

stackoverflow.com