ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SpringBootServletInitializer 란 무엇이고 왜 상속받고 있는가?
    실무에서 배운 내용 정리 2020. 8. 14. 01:22

    주제 선정 이유


    아래 소스는, 현재 담당하고 있는 서비스의 코드를 그대로 가져온 것이다.

    @SpringBootApplication
    public class SuperApplication extends SpringBootServletInitializer {
    	public static void main(String[] args) {
    		SpringApplication.run(SuperApplication.class, args);
    	}
    
    	@Override
    	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
    		return application.sources(SuperApplication.class);
    	}
    }
    

    기존에 봤었던 코드와 달리 스프링 부트 메인 클래스가 SpringBootServletInitializer를 상속하고 있는 형태였다. SpringBootServletInitializer는 무엇이고 왜 상속받고 있는지 궁금했다. 그리고 필요 없는 코드라면 삭제하고 싶었다.

     

     

    SpringBootServletInitializer는 무엇이고 왜 상속받고 있는가?


    SpringBoot 웹 애플리케이션을 배포할 때는 주로 embedded tomcat이 내장된 jar파일을 이용한다. 하지만 특별한 경우에는 전통적인 배포 방식인 war 파일로 배포를 진행해야 하는 경우가 있을 수 있다. 이럴 경우 SpringBootServletInitializer를 상속받으면 된다. 

     

    즉, war 파일로 빌드하고 배포하지 않을 거라면 SpringBootServletInitializer를 상속할 필요가 없다는 의미다.

     

    The first step in producing a deployable war file is to provide a 
    SpringBootServletInitializer subclass and override its configure method. 
    
    This makes use of Spring Framework’s Servlet 3.0 support and 
    allows you to configure your application when it’s launched by the servlet container. 
    
    Typically, you update your application’s main class to extend SpringBootServletInitializer:
    
    원본 링크: https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto-traditional-deployment

     

     

    그럼 왜 SpringBoot 웹 애플리케이션을 war로 배포할 때 SpringBootServletInitializer를 상속해야 하는 걸까?


    Spring 웹 애플리케이션을 외부 Tomcat에서 동작하도록 하기 위해서는 web.xml (Deployment Descriptor, DD)에 애플리케이션 컨텍스트를 등록해야만 한다. 이는, Apache Tomcat(Servlet Container)이 구동될 때 /WEB-INF 디렉토리에 존재하는 web.xml을 읽어 웹 애플리케이션을 구성하기 때문이다. 

     

    하지만 Servlet 3.0 스펙으로 업데이트되면서 web.xml이 없어도 동작이 가능해졌다. 이는, web.xml 설정을 WebApplicationInitializer인터페이스를 구현하여 대신할 수 있게 됐고, 프로그래밍적으로 ServletContext에 Spring IoC 컨테이너(AnnotationConfigWebApplicationContext)를 생성하여 추가할 수 있도록 변경됐기 때문이다.

     

    이와 비슷한 맥락에서, web.xml이 없는 SpringBoot 웹 애플리케이션을 외부 Tomcat에서 동작하도록 하기 위해서는 WebApplicationInitializer 인터페이스를 구현한 SpringBootServletInitializer를 상속을 받는 것이 필요했던 것이다.

     

     

     

    해당 내용을 작성하며 도움을 받았던 블로그


    https://medium.com/@SlackBeck/spring-boot-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98%EC%9D%84-war%EB%A1%9C-%EB%B0%B0%ED%8F%AC%ED%95%A0-%EB%95%8C-%EC%99%9C-springbootservletinitializer%EB%A5%BC-%EC%83%81%EC%86%8D%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94%EA%B1%B8%EA%B9%8C-a07b6fdfbbde 

    '실무에서 배운 내용 정리' 카테고리의 다른 글

    Redis  (0) 2019.08.09
    Guava Cache 란 [1편]  (0) 2018.12.24
    상속보다 구성을 이용한 재사용 [1편]  (3) 2018.12.21
    실행 계획  (0) 2018.12.19
    Clustered Index & Non-Clustered Index 차이  (0) 2018.12.17

    댓글

Designed by Tistory.