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`를 상속해야 한다.
오류 해결 참고
'알아가기 > Spring' 카테고리의 다른 글
[Spring] 임의의 서버 포트 번호 (random server port number) (0) | 2023.11.18 |
---|---|
[Spring] Advice Types inside AOP (0) | 2023.11.08 |
[Spring] Eager Instantiation Vs Lazy Instantiation (0) | 2023.11.05 |
[Spring] SecurityFilterChain 로그인 후 특정 주소로 이동 (0) | 2023.08.30 |
[Spring] Spring Boot Actuator 사용 (0) | 2023.08.29 |