본문 바로가기

Language/JAVA

[Java] 서블릿 컨테이너(Servlet Container)에 대해서 - 컴도리돌이

728x90

A servlet is a small Java program that runs within a Web server. Servlets receive and respond to requests from Web clients, usually across HTTP, the HyperText Transfer Protocol.

 


서블릿과 서블릿 컨테이너(Servlet and Servlet Container)

일반적으로 웹 서버는 정적인 페이지를 제공합니다. 동적인 페이지를 제공하기 위해서 웹 서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 합니다. 동적인 페이지로 임의의 이미지만을 보여주는 페이지와 같이 사용자가 요청한 시점에 페이지를 생성해서 전달해 주는 것을 의미합니다. 여기서 웹 서버가 동적인 페이지를 제공할 수 있도록 도와주는 애플리케이션이 서블릿이며, 동적인 페이지를 생성하는 애플리케이션이 CGI입니다. 

 

서블릿을 관리하고 실행하는 환경을 제공하는 소프트웨어를 서블릿 컨테이너라고 합니다. 웹 애플리케이션의 동적인 요청을 처리하기 위해 서블릿 컨테이너가 필요하며, 서블릿 컨테이너는 웹 서버와 함께 사용되어 웹 애플리케이션을 실행합니다. 

 

서블릿 라이프 사이클(Servlet Life Cycle)

package jakarta.servlet;

import java.io.IOException;

public interface Servlet {

    public void init(ServletConfig config) throws ServletException;

    public ServletConfig getServletConfig();

    public void service(ServletRequest req, ServletResponse res)
            throws ServletException, IOException;

    public String getServletInfo();

    public void destroy();
}

 

init(), service(), destory() 메서드를 라이프 사이클 메서드라고 하며, 서블릿 컨테이너는 라이프 사이클 메서드를 호출하여 서블릿의 생애주기를 관리합니다. 

 

  • init(): 서블릿 생성 시 호출됩니다. 파라메터로 jakarta.servlet.ServletConfig Interface 기반의 인터페이스가 넘어오는데, Servlet을 초기화하고 Servlet이 이용하는 자원을 할당하는 동작을 수행합니다. 
  • service(): 서블릿으로 요청이 전달될 때마다 호출됩니다. 실제 서비스 로직(service Logic)을 수행합니다.
  • destroy(): 서블릿이 삭제될 때 호출되며, 서블릿에서 이용하는 자원을 해지하는 동작을 수행합니다. 

https://www.techguruspeaks.com/servlet-life-cycle/

 

1. 클라이언트로부터 온 HTTP 요청은 웹 서버에 의해 받아지고, 웹 서버는 해당 요청을 서블릿 컨테이너에 전달합니다. 대표적으로 Apache Tomcat, Jetty, Undertow 등이 서블릿 컨테이너 역할을 합니다. 

2. 서블릿 컨테이너는 요청을 처리할 적절한 서블릿 인스턴스를 생성합니다. 이때 서블릿 클래스의 'init()' 메서드가 호출되어 초기화 작업을 수행합니다. 

3. 서블릿 컨테이너는 요청을 받은 서블릿 인스턴스에게 요청을 전달하고, 서블릿은 요청을 처리하여 응답을 생성합니다. 이때 서블릿 클래스의 'service()' 메서드가 호출되어 요청을 처리합니다. 

4. 서블릿 컨테이너는 서블릿이 생성한 응답을 클라이언트에게 전송합니다. 이때 서블릿이 생성한 데이터나 뷰를 클라이언트에게 반환하여 화면에 표시됩니다. 

5. 서블릿 컨테이너는 요청 처리가 완료된 후 서블릿 인스턴스를 소멸시킵니다. 이때 서블릿 클래스의 'destroy()' 메서드가 호출되어 마무리 작업을 수행합니다. 

 

서블릿 컨테이너(Servlet Container)

 

서블릿 컨테이너는 웹 애플리케이션의 동적인 요청을 처리하기 위해 서블릿을 실행하고 관리합니다. HTTP 요청을 도식화하면 다음과 같습니다. 

https://sigridjin.medium.com/servletcontainer%EC%99%80-springcontainer%EB%8A%94-%EB%AC%B4%EC%97%87%EC%9D%B4-%EB%8B%A4%EB%A5%B8%EA%B0%80-626d27a80fe5

 

1. 클라이언트(웹 브라우저)가 서버에 HTTP 요청을 보냅니다. 이 요청을 서블릿 컨테이너에 도착하게 됩니다. 

2. 서블릿 컨테이너는 요청된 URL을 기반으로 어떤 서블릿에게 요청을 전달할지를 결정합니다. 이 과정을 URL 패턴 매핑이라고 합니다. 
3. 서블릿 컨테이너는 해당 URL에 매핑된 서블릿을 실행하기 위해 요청 객체(HttpServletRequest)와 응답 객체(HttpServletResponse)를 생성합니다. 이 요청 객체에는 클라이언트가 보낸 요청과 관련된 청보들이 담겨있습니다. 

4. 요청을 처리할 서블릿의 인스턴스를 생성하고 초기화합니다.

5. 서블릿 컨테이너는 요청을 받은 서블릿의 'service()' 메서드를 호출하여 요청을 처리합니다. 요청의 HTTP 메서드(GET, POST 등)에 따라 적절한 메서드(doGet(), doPost() 등)를 호출합니다. 

6. 서블릿은 요청을 처리한 후, 응답을 생성하여 응답 객체를 담습니다. 이 응답에는 클라이언트에게 전송할 데이터(HTML, JSON 등) 및 상태 코드(200, 404 등) 등이 포함됩니다. 

7. 서블릿 컨테이너는 생성된 응답을 클라이언트에게 전송합니다. 이때 서블릿의 'doGet()' 또는 'doPost()' 메서드에서 생성된 응답을 클라이언트에게 반환합니다.

8. 요청 처리 완료된 후, 서블릿 컨테이너는 해당 서블릿의 인스턴스를 소멸시킵니다. 이 단계에서 서블릿의 'destory()' 메서드가 호출되어 마무리 작업을 수행합니다. 

 

one WAS per one JVM

우리가 대표적으로 알고 있는 서블릿 컨테이너는 톰캣입니다. 서블릿 컨테이너는 하나의 웹 애플리케이션 하나씩을 붙는데, 톰캣도 자바 프로그램이기 때문에 하나의 JVM이 붙습니다. 


서블릿 필터(Servelt Filter)

필터는 리소스(서블릿 또는 정적 콘텐츠)로의 요청 또는 리소스로부터의 응답 또는 둘 다에 대한 필터링 작업을 수행하는 객체입니다. 필터는 doFilter 메서드에서 필터링 작업을 수행하며, 각 필터는 초기화 매개변수를 얻을 수 있는 FilterConfig 객체와 필터링 작업에 필요한 리소스를 로드하는 데 사용할 수 있는 ServletContext에 대한 참조를 얻을 수 있습니다. 

package jakarta.servlet;

import java.io.IOException;

public interface Filter {
    default void init(FilterConfig filterConfig) throws ServletException {
    }

    void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException;

    default void destroy() {
    }
}

 

서블릿 필터 공식 문서에서는 다음과 같은 예시가 적혀있습니다. 인증, 로깅, 이미지 처리, 암호화 등 눈에 띄는 필터가 존재합니다.

Authentication Filters
Logging and Auditing Filters
Image conversion Filters
Data compression Filters
Encryption Filters
Tokenizing Filters
Filters that trigger resource access events
XSL/T filters
Mime-type chain Filter

 

Servlet (Jakarta EE Platform API)

Called by the servlet container to indicate to a servlet that the servlet is being taken out of service. This method is only called once all threads within the servlet's service method have exited or after a timeout period has passed. After the servlet con

jakarta.ee

 

Filter (Jakarta Servlet API documentation)

All Known Implementing Classes: GenericFilter, HttpFilter public interface Filter A filter is an object that performs filtering tasks on either the request to a resource (a servlet or static content), or on the response from a resource, or both. Filters pe

jakarta.ee

 

Servlet Life Cycle - TechGuruSpeaks

Prev Home Next Servlet Life Cycle The life cycle of a Java Servlet is determined by three of its methods: init(), service(), and destroy(). The life cycle starts when Servlet container instantiates the object of Servlet class and calls the init() method, a

www.techguruspeaks.com

 

서블릿과 서블릿 컨테이너

서블릿과 서블릿 컨테이너 서블릿은 요청-응답 프로그래밍 모델의 서버를 구현하기 위해 사용되는 Jakarta 프레임워크의 구성요소이다. 많은 블로그에서 서블릿은 HTTP 요청과 응답을 처리하기 위

hudi.blog