포스트

Servlet

Servlet

Servlet

  • JSP가 나오기 전, 자바로 웹 애플리케이션을 개발할 수 있도록 만든 기술
  • 서버 단에서 클라이언트의 요청을 받아 처리한 후 응답하는 역할

서블릿 특징

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
  • MVC 모델에서 Controller 역할
  • 모든 메서드는 스레드로 동작
  • jakarta.servlet.http 패키지의 HttpServlet 클래스를 상속받음

서블릿 컨테이너

  1. 웹 서버로 HTTP 요청
  2. 웹서버에서 서블릿 컨테이너로 요청 전달
  3. 서블릿 컨테이너에서 서블릿 로드 -> 초기화 -> 요청 처리 후 HTTP 응답

현재 톰캣을 컨테이너로 사용

  • 서블릿의 수명 주기를 관리
  • 요청이 오면 스레드를 생성해 처리
  • 클라이언트의 요청을 받아 응답을 보낼 수 있도록 통신 지원

통신 지원

  • 클라이언트와 통신하려면 서버는 특정 포트로 소켓을 열고 I/O 스트림을 생성하는 등 복잡한 과정이 필요
  • 서블릿 컨테이너는 이 과정을 간단히 해주는 API 제공

수명주기 관리

  • 서블릿을 인스턴스화한 후 초기화하고, 요청에 맞는 적절한 메서드를 호출
  • 응답한 후에는 가비지 컬렉션을 통해 객체를 소멸

멀티스레딩 관리

  • 서블릿 요청들은 스레드를 생성해 처리
  • 즉, 멀티스레드 방식으로 여러 요청을 동시에 처리

선언적인 보안 관리 및 JSP 지원

  • 서블릿 컨테이너는 보안 기능을 지원하므로 별도로 구현 불필요

서블릿 동작 방식

  • 서블릿은 MVC 패턴에서 Controller 역할
  1. 클라이언트의 요청을 받음
  2. 분석 후 요청을 처리할 서블릿 찾음
  3. 서블릿을 통해 비즈니스 서비스 로직을 호출
  4. 모델로부터 그 결괏값 확보
  5. request 나 session 영역에 저장한 후 결괏값을 출력할 적절한 뷰를 선택
  6. 최종적으로 선택된 뷰(jsp page)에 결괏값을 출력한 후 요청한 클라이언트에 응답

서블릿 작성 규칙

  1. jakarta.servlet, jakarta.servlet.http, java.io 패키지 임포트
  2. 서블릿 클래스는 반드시 public으로 선언, HttpServlet을 상속받아야 함
  3. 사용자의 요청을 처리하기 위해 doGet() 메서드나 doPost() 메서드를 반드시 오버라이딩
  4. doGet() 또는 doPost() 메서드는 ServletException 과 IOException 예외를 던지도록 선언
  5. doGet() 또는 doPost() 메서드를 호출할 때의 매개변수는 HttpServletRequest와 HttpServletResponse를 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package 패키지명;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

public class ServletClassName extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
    }
}

서블릿 작성

  • 서블릿 작성은 클라이언트의 요청을 전달할 ‘요청명’을 결정하는 일부터 시작
  • JSP에서는 클라이언트의 요청을 JSP가 직접 받아 처리하지만, 서블릿은 요청명을 기준으로 이를 처리할 서블릿을 선택
  • 요청명과 서블릿을 연결해주는 작업을 mapping 이라고 함
  • web.xml에서 기술하는 방법과 @WebServlet 어노테이션을 사용하여 코드에 직접 명시하는 방법이 존재

web.xml에서 매핑

1
2
3
4
5
6
7
8
9
<servlet> <!-- 서블릿 등록 -->
    <servlet-name>서블릿명</servlet-name> <!-- 서블릿을 매핑하기 위한 서블릿명 -->
    <servlet-class>패키지를 포함한 서블릿 클래스명</servlet-class> <!-- 요청을 처리할 서블릿을 패키지를 포함하여 명시 -->
</servlet>
<servlet-mapping> <!-- 서블릿과 요청명 매핑 -->
<servlet-name>서블릿명</servlet-name>
<url-pattern>클라이언트 요청 URL</url-pattern> <!-- 컨텍스트 루트를 제외한 요청명 기입 -->
</servlet-mapping>

서블릿의 수명주기 메서드

서블릿 수명 주기

  • 서블릿은 클라이언트의 요청이 들어오면 가장 먼저 서블릿 객체를 생성하고, 서블릿을 초기화한 후, 요청을 처리
  • 마지막으로 서버를 종료할 때 서블릿 객체를 소멸시킴
  • 서블릿의 수명 주기 관리는 서블릿 컨테이너가 담당
  • 즉, 서블릿 컨테이너는 서블릿 객체를 생성하고 각 단계마다 자동으로 특정 메서드를 호출하여 해당 단계에 필요한 기능을 수행
  • 이 때 호출되는 콜백 메서드들을 수명주기 메서드라고 부름

서블릿 객체 생성 –> 전처리를 위한 @PostConstruct –> init() –> service()
–> doGet(), doPost() –> destroy() –> 후처리를 위한 @PreDestroy

@PostConstruct

  • 객체 생성 직후, init() 메서드를 호출하기 전에 호출
  • 어노테이션을 사용하므로 메서드명은 개발자가 지정

init()

  • 서블릿의 초기화 작업을 수행하기 위해 호출
  • 최초 요청 시 딱 한 번만 호출

sevice()

  • 클라이언트의 요청을 처리하기 위해 호출
  • 전송 방식이 get이면 doGet() 메서드를, post면 doPost() 메서드를 호출
  • 따라서 두 가지 전송 방식 모두를 처리 가능

destroy()

  • 서블릿이 새롭게 컴파일되거나, 서버가 종료될 때 호출

@PreDestroy

  • destroy() 메서드가 실행되고 난 후, 컨테이너가 이 서블릿 객체를 제거하는 과정에서 호출
  • @PostConstruct와 동일하게 메서드명은 개발자가 지정
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.