BE/Java

Springboot에서 ServletInitializer를 상속받아야 하는 이유?

jjuni_96 2024. 1. 16. 15:17
728x90

Spring boot 에서 war 배포가 안되는 현상?

일반적으로 intellij(저자가 해당 툴을 쓰기때문...)에서 개발을 진행하는 경우 따로 tomcat을 설정해주지는 않는다.

왜냐면 intellij에서 내장 tomcat을 사용하여 웹 서비스를 기동하며 작업을 하기 때문이다.

 

현 상태로 war 를 빌드하여 외장 tomcat으로 배포를 하면 Springboot 프로젝트를 정상적으로 인식하지 못할것이다.

 

 

Spring 과 Tomcat의 web.xml

왜냐면 이전 Spring 3.x 버전에서 web.xml에 Spring 웹 애플리케이션 컨텍스트(WebApplicationContext) 구성 하는 작업을 했다. 

그 중에 대표적인 것이 서블릿 애플리케이션 컨텍스트(DispatcherServlet)를 web.xml에 등록 하는 것이었다.

<servlet>
   <servlet-name>example</servlet-name>
   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
   <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
   <servlet-name>example</servlet-name>
   <url-pattern>/</url-pattern>
</servlet-mapping>

 

위와 같은 작업은 Spring과 tomcat과 같은 Servlet Container에서 동작하도록 하는 설정이다.

 

 

그러나 Servlet 3.0 1), Tomcat 7.0 2) 이상 부터는 web.xml 없이도 배포가 가능하게 변경되었다.

(과거에 위 같은 작업을 했던 이유는 Servlet 버전이 낮아서 했던 것)

 

 

Spring Framework와 Servlet 3.0

Spring Framework는 Servlet 3.0 이상 환경에서 web.xml 대신하여 ServletContext를 프로그래밍적으로 다룰 수 있게 WebApplicationInitializer 인터페이스를 제공 한다.

 

아래 처럼 web.xml 역할을 WebApplicationInitializer 인터페이스를 구현하여 프로그래밍적으로 ServletContext에 Spring IoC 컨테이너(AnnotationConfigWebApplicationContext)를 생성하여 추가할 수 있다.

 

SpringBootServletInitializer는 WebApplicationInitializer 인터페이스의 구현체

SpringBootServletInitializer는 웹 애플리케이션 컨텍스트를 생성하여 ServletContext 에 추가한다. 이 과정에서 웹 애플리케이션 컨텍스트로는 AnnotationConfigEmbeddedWebApplicationContext 를 사용한다.

 

 

 

결론

SpringBootServletInitializer 상속 이란?
Tomcat 같은 Servlet Container 환경에서 Spring Boot 애플리케이션 동작 가능 하도록 웹 애플리케이션 컨텍스트 구성한다는 의미

 

 

 

Refs

1) Servlet 3.0 관련 문서

2) Apache Tomcat 관련 문서

3) 참고 사이트

728x90
반응형
LIST