25.03.18 TIL 서블릿(Servlet)

신성훈·2025년 3월 18일
0

TIL

목록 보기
150/162

1. 서블릿이란?

서블릿(Servlet)은 Java를 이용해 웹 요청을 처리하는 서버측 프로그램이다.
HTTP 요청을 받아 처리하고, 응답을 반환하는 역할을 한다.

  • Java EE(현재는 Jakarta EE)에서 제공하는 웹 애플리케이션 기술
  • 클라이언트의 요청을 처리하고 동적인 웹 페이지를 생성
  • javax.servlet 패키지를 사용하여 구현

2. 서블릿의 동작 과정

서블릿은 서블릿 컨테이너(Servlet Container, WAS)에서 실행된다.

  1. 클라이언트(브라우저)가 HTTP 요청을 보낸다.
  2. 요청이 WAS(Web Application Server)로 전달된다.
  3. 서블릿 컨테이너가 서블릿 객체를 생성 또는 재사용한다.
  4. service() 메서드가 호출되어 요청을 처리한다.
  5. 처리 결과를 HTTP 응답으로 반환한다.

3. 서블릿 생명주기(Lifecycle)

서블릿은 다음과 같은 생명주기를 가진다.

  1. 서블릿 객체 생성 (init())

    • 최초 요청 시 서블릿 컨테이너가 서블릿 객체를 생성한다.
    • init() 메서드가 실행되며, 한 번만 호출됨
  2. 서비스 실행 (service())

    • 클라이언트 요청이 들어오면 service() 메서드가 실행됨
    • 요청 방식(GET, POST 등)에 따라 doGet(), doPost() 메서드 실행
  3. 서블릿 종료 (destroy())

    • 컨테이너가 서블릿을 제거할 때 destroy() 메서드 실행
    • 리소스 해제 등의 작업 수행.

4. 서블릿 구현 예제

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello")  // URL 매핑
public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().println("<h1>Hello, Servlet!</h1>");
    }
}
  • @WebServlet("/hello") : 서블릿 URL 매핑 설정.

  • doGet() : GET 요청 처리.


5. 서블릿 컨테이너(Servlet Container)의 역할

서블릿 컨테이너(WAS, Web Application Server)는 다음과 같은 역할을 수행한다.

  1. 서블릿 생명주기 관리 (init(), service(), destroy() 실행)
  2. 클라이언트 요청 처리 (HTTP 요청 파싱 및 서블릿에 전달)
  3. 멀티스레드 처리 (각 요청을 별도의 스레드로 실행)
  4. 보안 관리 (인증 및 권한 제어)
  5. 세션 관리 (사용자 세션 및 쿠키 처리)

대표적인 서블릿 컨테이너로는 Tomcat, Jetty, WildFly 등이 있다.


6. 서블릿과 필터(Filter), 리스너(Listener)

1) 필터(Filter)

  • 요청 및 응답을 가로채어 사전/사후 처리 가능
  • 로깅, 인코딩 설정, 인증 처리 등에 사용
@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }
}
  • 모든 요청(/*)을 가로채어 UTF-8 인코딩을 설정

2) 리스너(Listener)

  • 웹 애플리케이션의 이벤트를 감지하여 실행
  • 세션 생성/소멸, 컨텍스트 초기화 등 관리
@WebListener
public class AppListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("웹 애플리케이션 시작됨");
    }
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("웹 애플리케이션 종료됨");
    }
}
  • 애플리케이션 시작 및 종료 시 메시지 출력

7. Spring MVC와 서블릿의 관계

Spring MVC는 DispatcherServlet을 기반으로 동작하며 서블릿과 밀접한 관련이 있다.

  • DispatcherServlet이 요청을 받아 컨트롤러로 전달
  • 서블릿 기반이지만 Spring이 제공하는 MVC 구조를 따름
  • 서블릿을 직접 사용하기보다는 Spring MVC를 활용하는 것이 일반적

8. 마무리

Spring을 사용하면서 서블릿을 직접 구현할 일은 많지 않지만 기본 동작 원리를 이해하는 것이 중요하다. 서블릿 컨테이너의 역할과 함께 필터 & 리스너를 활용하면 더욱 강력한 웹 애플리케이션을 만들 수 있다.

profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글