Post

서블릿 개념

서블릿 개념

서블릿(Servlet) 정리

개요

이번 시간에는 서블릿(Servlet)에 대해 알아봅니다.
서블릿은 HTTP 기반의 웹 애플리케이션 개발 시, 반복적으로 처리해야 하는 HTTP 요청/응답 처리 과정을 대신 수행해주어 개발자가 비즈니스 로직에 집중할 수 있도록 하는 핵심 기술입니다.

왜 서블릿인가?

초기 상황 가정

HTML 폼을 이용해 사용자의 이름, 나이 등을 서버에 전송하여 회원 가입을 시킨다고 가정해봅시다.

  1. 사용자가 폼에 이름과 나이를 입력하고 전송(Submit) 버튼을 누릅니다.
  2. 브라우저는 POST /save로 HTTP 요청을 생성하여 서버에 전송합니다.
    • HTTP 요청 메시지에는 Content-Type, username, age 등의 정보가 포함됩니다.

직접 구현 시 문제점

서버 개발자가 HTTP 요청을 직접 파싱하고, TCP/IP 소켓 연결을 만들고, HTTP 요청 메시지를 해석하고, 응답 메시지를 직접 작성하는 것은 매우 번거로운 작업입니다.

비즈니스 로직(예: DB에 회원 정보 저장) 외에 너무 많은 수작업이 필요합니다.

서블릿의 등장

서블릿의 역할

서블릿(Servlet)은 이러한 반복적인 작업(요청 파싱, 응답 생성, 헤더 처리 등)을 대신 처리해주는 기술입니다.
개발자는 서블릿을 사용함으로써 HTTP 메세지를 직접 파싱하거나 응답을 수동으로 만드는 대신, 비즈니스 로직 구현에만 집중할 수 있습니다.

서블릿의 구조

  • HttpServlet 클래스를 상속받아 서블릿을 구현합니다.
  • 특정 URL 패턴(예: /hello)에 서블릿을 매핑해두면, 해당 경로로 요청이 올 때 WAS(웹 애플리케이션 서버)와 서블릿 컨테이너가 서블릿의 service() 메서드를 호출합니다.
  • HttpServletRequest, HttpServletResponse 객체를 파라미터로 받으며, 이 객체들을 통해 요청 파라미터를 읽고 응답을 손쉽게 작성할 수 있습니다.

예를 들어, request.getParameter("username")을 호출하면 자동으로 파싱된 요청 파라미터를 얻을 수 있으며, response.getWriter().write("hello")를 호출하면 HTTP 응답을 쉽게 생성할 수 있습니다.

Servlet Container의 역할

Servlet Container란?

서블릿을 지원하는 WAS(예: Tomcat)는 Servlet Container를 포함하고 있습니다. 이 컨테이너는 다음과 같은 일을 수행합니다.

  • 서블릿 객체의 생성, 초기화, 호출, 종료 관리(생명주기 관리)
  • HTTP 요청이 들어올 때마다 HttpServletRequest, HttpServletResponse 객체를 생성하여 서블릿에 전달
  • 서블릿 실행 결과를 바탕으로 최종 HTTP 응답 메시지 생성 및 전송

싱글톤(Servlet) 객체

  • 서블릿 객체는 싱글톤(singleton)으로 관리됩니다.
    • 최초 한 번만 서블릿 객체를 생성한 뒤, 동일한 서블릿 인스턴스를 모든 요청이 공유합니다.
  • 대신 요청별로 매번 새로운 Request, Response 객체를 생성하므로, 각 요청에 대해 독립적인 요청/응답 처리가 가능합니다.

주의사항: 공유 변수

  • 싱글톤 서블릿 인스턴스는 멤버 변수를 공유합니다.
  • 공용 멤버 변수를 잘못 사용할 경우, 서로 다른 사용자의 데이터가 섞이는 문제가 발생할 수 있으므로 주의해야 합니다.

JSP와의 관계

  • JSP(JavaServer Pages) 또한 최종적으로는 서블릿으로 변환되어 사용됩니다.
  • JSP는 뷰(View) 템플릿 역할을 하며, 서블릿과 결합되어 동작합니다.

멀티스레드 지원

  • Servlet Container는 동시 요청 처리를 위해 멀티스레드를 지원합니다.
  • 하나의 서블릿 인스턴스를 공유하면서 각 요청마다 새로운 스레드가 생성되어 요청을 처리합니다.
  • 개발자는 멀티스레드 환경에서 안전하게 동작하도록 코드를 작성해야 합니다.

결론

서블릿은 HTTP 기반 애플리케이션 개발에서 핵심적인 역할을 합니다.

  • HTTP 메시지 파싱, 응답 생성 등의 반복적인 작업을 컨테이너가 맡아 처리
  • 개발자는 비즈니스 로직에만 집중 가능
  • 생명주기, 멀티스레드, 싱글톤 관리까지 WAS가 자동으로 처리

다음 포스팅에서는 동시 요청과 멀티스레드 처리 방식에 대해 더 자세히 알아보겠습니다.

This post is licensed under CC BY 4.0 by the author.