서블릿 컨테이너 초기화1

2023. 11. 16. 01:28Spring/스프링부트_핵심원리와 활용

WAS를 실행하는 시점에 초기화를 해야하는 작업이 있다. 스프링 부트 강의를 듣다가 서블릿 컨테이너를 초기화 할 수 있다는 것을 처음 알게 되었다. 과거에는 web.xml으로 초기화하였지만 요즘에는 자바 코드를 사용한 초기화도 지원하고 있어서 자바를 통해 알아보겠다. 

[초기화가 필요한 이유]
1) 서비스에 필요한 필터와 서블릿 등록 
2) 스프링 사용하면 스프링컨테이너를 만들고 서블릿과 스프링을 연결하는 Dispatcher Servlet도 등록해야한다. 

서블릿 컨테이너와 스프링 컨테이너

서블릿에는 초기화 인터페이스를 제공한다. 이름은 ServletContainerInitializer이다. 
https://tomcat.apache.org/tomcat-10.1-doc/servletapi/jakarta/servlet/ServletContainerInitializer.html

ServletContainerInitializer 설명

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값이 나온다. 이 부분에 대해서는 다음 포스팅에서 자세히 설명하도록 하겠다.