메인 메소드를 작업하던 도중 오픈소스를 참고하다가 상속받고있는 저 문구가 계속 눈에 들어왔다.
기존에 봤었던 코드와 달리 스프링 부트 메인 클래스가 SpringBootServletInitializer를 상속하고 있는 형태였다. SpringBootServletInitializer는 무엇이고 왜 상속받고 있는지 궁금했다. 그리고 필요 없는 코드라면 삭제하고 싶었다.
pringBootServletInitializer는 무엇이고 왜 상속받고 있는가?
SpringBoot 웹 애플리케이션을 배포할 때는 주로 embedded tomcat이 내장된 jar파일을 이용한다. 하지만 특별한 경우에는 전통적인 배포 방식인 war 파일로 배포를 진행해야 하는 경우가 있을 수 있다. 이럴 경우 SpringBootServletInitializer를 상속받으면 된다.
즉, war 파일로 빌드하고 배포하지 않을 거라면 SpringBootServletInitializer를 상속할 필요가 없다는 의미다.
그럼 왜 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를 상속을 받는 것이 필요했던 것이다.
끝으로 해당 JSP 파일을 보고싶다면 아래와 같이 적용 해 주시면 됩니다.
spring.mvc.view.prefix=/WEB-INF/home
spring.mvc.view.suffix=.jsp
그리고 서비스를 실행하기 위한 build.gradle 파일도 수정하도록 하겠습니다. build.gradle의 dependency안에 아래 2줄을 입력합니다.
첫 번째는 내장된 Tomcat을 이용할 수 있도록 설정한 것입니다. Spring Boot를 사용하지 않은 일반적인 웹 프로젝트의 경우 war파일을 가지고 배포를 진행하게 되는데 Spring Boot는 내장된 Tomcat을 이용하여 자동으로 배포를 진행하도록 도와줍니다. 이 과정은 Spring Boot Application을 실행하면 진행됩니다.
'SPRING > 개발 TIP' 카테고리의 다른 글
[SPRING] 주문금액 집계 프로젝트 실습 part1 (0) | 2021.08.04 |
---|---|
[SPRING] 애노테이션 직접 만들기 (0) | 2021.04.27 |
[SPRING] SpringBoot로 완성하는 URL Shortener (1) (0) | 2021.04.16 |
[SPRING] AOP 정리 및 실습 (4) (0) | 2021.04.14 |
[SPRING] AOP 정리 및 실습 (3) (0) | 2021.04.14 |