서블릿 컨테이너(Servlet Container)는 서블릿을 실행하고 관리하는 런타임 환경을 제공하는 웹 서버의 일종입니다.
서블릿 컨테이너는 웹 서버와 연동하여, 클라이언트로부터 오는 HTTP 요청을 받아들이고, 해당 요청에 대해 적절한 서블릿을 실행하여 HTTP 응답을 생성합니다. 서블릿 컨테이너는 서블릿의 생명주기를 관리하며, 서블릿의 인스턴스를 생성하고 초기화하며, 요청이 왔을 때 해당 서블릿의 service() 메서드를 호출합니다.
서블릿 컨테이너는 여러 가지 기능을 제공하는데, 대표적인 기능으로는 다음과 같습니다.
- 서블릿 라이프사이클 관리
서블릿 컨테이너는 서블릿의 라이프사이클을 관리합니다. 즉, 서블릿의 인스턴스를 생성하고 초기화하며, 요청이 왔을 때 해당 서블릿의 service() 메서드를 호출합니다. 또한, 서블릿이 제거될 때 destroy() 메서드를 호출하여 자원을 정리합니다.
- 멀티스레드 지원
서블릿 컨테이너는 멀티스레드 환경에서 안전하게 서블릿을 실행할 수 있도록 보장합니다. 즉, 서블릿이 여러 클라이언트 요청을 동시에 처리할 수 있도록 스레드를 안전하게 제어합니다.
- 요청과 응답 처리
서블릿 컨테이너는 클라이언트 요청을 받아들이고, 해당 요청에 대해 적절한 서블릿을 실행하여 HTTP 응답을 생성합니다. 서블릿 컨테이너는 HTTP 요청을 파싱하고, 파라미터를 추출하고, HTTP 응답을 생성하는 등의 작업을 수행합니다.
- 세션 관리
서블릿 컨테이너는 웹 애플리케이션에서 세션을 관리합니다. 세션은 클라이언트와 서버 간의 상태 정보를 유지하기 위한 방법으로, 서블릿 컨테이너는 세션 ID를 생성하고, 세션을 저장하고, 세션 타임아웃을 처리하는 등의 작업을 수행합니다.
- 보안
서블릿 컨테이너는 웹 애플리케이션의 보안을 강화
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);
}
}
onStartup
메서드는 서블릿 컨테이너가 초기화될 때 자동으로 호출됩니다. resources/META-INF/services/jakarta.servlet.ServletContainerInitializer
hello.container.MyContainerInitV1
onStartup
을 호출하게 되고 Servlet Container가 초기화된다.Build and run using을 Gradle로 하면 잘 나올거다!