2023. 11. 16. 01:28ㆍSpring/스프링부트_핵심원리와 활용
WAS를 실행하는 시점에 초기화를 해야하는 작업이 있다. 스프링 부트 강의를 듣다가 서블릿 컨테이너를 초기화 할 수 있다는 것을 처음 알게 되었다. 과거에는 web.xml으로 초기화하였지만 요즘에는 자바 코드를 사용한 초기화도 지원하고 있어서 자바를 통해 알아보겠다.
[초기화가 필요한 이유]
1) 서비스에 필요한 필터와 서블릿 등록
2) 스프링 사용하면 스프링컨테이너를 만들고 서블릿과 스프링을 연결하는 Dispatcher Servlet도 등록해야한다.
서블릿에는 초기화 인터페이스를 제공한다. 이름은 ServletContainerInitializer이다.
https://tomcat.apache.org/tomcat-10.1-doc/servletapi/jakarta/servlet/ServletContainerInitializer.html
package jakarta.servlet;
import java.util.Set;
public interface ServletContainerInitializer {
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException;
}
공식 문서를 보면
c - The (possibly null) set of classes that met the specified criteria
-> null이 될수도 있고, 명시된 기준을 지킨 클래스들의 집합이다.
ctx - The ServletContext of the web application in which the classes were discovered
-> 발견된 클래스의 웹어플리케이션의 서블릿 컨테이너이다. 이 객체를 통해서 필터나 서블릿을 등록할 수 있다.
초기화를 하는 클래스를 만든다. 이름은 MyContainerInitV1이다.
package hello.container;
import jakarta.servlet.ServletContainerInitializer;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import java.util.Set;
public class MyContainerInitV1 implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
System.out.println("MyContainerInitV1.onStartUp");
System.out.println("MyContainerInitV1 c = " + c);
System.out.println("MyContainerInitV1 ctx = " + ctx);
}
}
이렇게 만든다고 끝은 아니다. 공식 문서를 보면
ServletContainerInitializers (SCIs) are registered via an entry in the file META-INF/services/jakarta.servlet.ServletContainerInitializer that must be included in the JAR file that contains the SCI implementation.
이 위치에 META-INF/services/jakarta.servlet.ServletContainerInitializer 파일을 생성해야한다. 그리고 그 안에 초기화할 클래스를 지정한다.
그리고 파일 안에는 아래와 같이 클래스를 지정한다.
[jakarta.servlet.ServletContainerInitializer file]
hello.container.MyContainerInitV1
그리고 tomcat 서버를 실행한다. 실행하는 방법은 intellij에서 오른쪽 위를 보면 재생버튼이 있는데 그거를 누르면 된다.
그러면 아래와 같이 console 창에 보이게 된다.
MyContainerInitV1.onStartUp
MyContainerInitV1 c = null
MyContainerInitV1 ctx = org.apache.catalina.core.ApplicationContextFacade@584a1715
c가 null이고 ctx는 서블릿 컨테이너의 ApplicationContextFacade hash값이 나온다. 이 부분에 대해서는 다음 포스팅에서 자세히 설명하도록 하겠다.
'Spring > 스프링부트_핵심원리와 활용' 카테고리의 다른 글
스프링 MVC 서블릿 컨테이너 초기화 지원 (0) | 2023.11.27 |
---|---|
스프링 컨테이너 등록 (2) | 2023.11.26 |
서블릿 컨테이너 초기화2 (0) | 2023.11.26 |