Servlet, 그게 뭔데?

Yong Lee·2025년 10월 15일

"서블릿을 아는 만큼 설명해주세요."라는 질문을 받았다.
그런데 막상 정확하게 무엇이다라고 설명하기 어려움을 겪게되어 정리하기로 하였다.

Servlet이란?

서블릿은 클라이언트의 HTTP 요청을 받아서 동적인 웹 페이지나 데이터를 생성하고, 다시 클라이언트에게 응답을 보내는 자바 기반의 웹 프로그램입니다.

조금 더 풀어 설명하면, 웹 서버가 받은 요청을 자바 언어로 처리할 수 있도록 도와주며, 서블릿 컨테이너라는 관리자에 의해 생명주기가 관리되는 자바 클래스라고 할 수 있습니다.

솔직히 이렇게만 봐서는 이해하기 어렵다.
그러니 이것이 왜 필요한지 이야기해보자.


Servlet이 필요한 이유

웹 서버가 처음 등장 시기에는 HTML과 같은 정적인 파일들만 제공했다.
사용자가 특정 URL을 요청하면 서버는 미리 저장된 HTML 파일을 그대로 보내주는 방식이다.
하지만 웹이 발전하면서 사용자마다 다른 정보를 보여주거나, 데이터베이스에서 정보를 가져와 보여주는 등 '동적인' 웹 페이지가 필요해진 것이다.

이런 문제를 해결하기 위해 자바 측에서는 서블릿이라는 기술을 개발했다.
서블릿은 다음과 같은 이유로 동적인 웹 페이지 생성에 필수적이다:

  • 효율적인 요청 처리: 서블릿은 스레드를 사용하여 처리하므로 메모리 사용량이 적고 처리 속도가 빠르다.
  • 자바의 강점 활용: 자바 언어 강점이라 할 수 있는 객체지향, 다양한 라이브러리, 플랫폼 독립성 등을 웹 개발에서도 활용할 수 있게 해줬다.
  • 데이터 공유 및 상태 관리: 서블릿은 여러 요청 간에 데이터를 공유하고 세션관리 등을 효과적으로 할 수 있는 기능을 제공한다.
  • 쿠키 처리: 서블릿은 쿠키를 쉽게 처리할 수 있어 사용자 상태를 추적하는데 유용하다.
  • 웹 서버와의 직접 통신: 서블릿은 웹 서버와 직접 통신할 수 있어 더 효율적인 웹 어플리케이션 개발이 가능하다.

서블릿의 구조와 작동 방식

일단 서블릿은 API(Application Programming Interface)라는 것을 꼭 기억해야한다.
우리가 흔히 기억하는 RestAPI와 같은 Web API가 아니다.
이 부분은 아래에서 구분하여 얘기를 해보는 것으로 할테니 서블릿은 API라는 것만 기억하자.

서블릿은 기본적으로 클라이언트의 HTTP 요청을 처리하고 동적인 웹 응답을 생성하는 자바 프로그램이다.
이 과정은 주로 서블릿 컨테이너라는 관리자에 의해 이루어진다.

서블릿 컨테이너의 역할

  • 서블릿 컨테이너(ex:톰캣)는 서블릿의 생명주기(생성, 초기화, 요청처리, 소멸)를 관리하는 주체다.
  • 클라이언트로부터 HTTP 요청이 오면, 이 요청을 받아 처리할 적절한 서블릿을 찾아 실행한다.
  • 요청을 서블릿이 처리할 수 있는 HTTPServletRequest객체로 변환하고, 응답을 보낼 HttpServletResponse객체를 생성하여 서블릿에게 전달한다.

서블릿의 생명주기(Lifecycle) 메서드:

  • init() 메서드: 서블릿이 서블릿 컨테이너에 의해 처음 로드될 때 한 번만 호출되어 초기화 작업을 수행합니다. 서블릿은 여러 클라이언트 요청을 처리할 수 있는 단일 인스턴스(싱글턴)로 메모리에 상주하며, init()은 이 인스턴스 생성 시 호출됩니다.
  • service() 메서드: 클라이언트로부터 요청이 올 때마다 서블릿 컨테이너가 호출하는 핵심 메서드입니다. 이 메서드는 요청(HttpServletRequest)과 응답(HttpServletResponse) 객체를 매개변수로 받아서 실제 비즈니스 로직을 수행합니다. (참고: HttpServlet을 상속받으면 service() 메서드 안에서 요청 방식(GET, POST 등)에 따라 자동으로 doGet(), doPost() 등을 호출해 줍니다.)
  • destroy() 메서드: 서블릿이 컨테이너에서 제거될 때 한 번만 호출되어 자원 해제 등의 마무리 작업을 수행합니다.

HttpServletRequest 객체:

  • 클라이언트로부터 전송된 HTTP 요청 정보를 담는 객체입니다.
  • 요청 파라미터(Parameter), 헤더(Header), 쿠키(Cookie), 세션 정보(Session) 등을 이 객체를 통해 얻을 수 있습니다.

HttpServletResponse 객체:

  • 서블릿이 클라이언트에게 보낼 HTTP 응답 정보를 담는 객체입니다.
  • 콘텐츠 타입(Content-Type), 상태 코드(Status Code), 응답 본문(Response Body) 등을 이 객체를 통해 설정하고 클라이언트로 전송합니다.

서블릿 요청 처리 흐름

  1. 클라이언트 요청: 웹 브라우저(클라이언트)가 URL을 통해 웹 서버에 HTTP 요청을 보냅니다.
  2. 웹 서버 전달: 웹 서버는 동적인 요청임을 인지하고 해당 요청을 서블릿 컨테이너(WAS)로 전달합니다.
  3. 서블릿 로드 및 init() 호출: 서블릿 컨테이너는 요청 URL에 매핑된 서블릿을 찾아 로드하고, 필요시 - init() 메서드를 호출하여 서블릿을 초기화합니다. (최초 요청 시 한 번만 발생)
  4. service() 호출: 서블릿 컨테이너는 요청이 올 때마다 HttpServletRequest와 HttpServletResponse 객체를 생성하고, 서블릿의 service() (혹은 doGet(), doPost() 등) 메서드를 호출합니다. 이 과정에서 각 요청은 별도의 스레드에서 처리됩니다.
  5. 비즈니스 로직 수행: 서블릿은 HttpServletRequest에서 요청 데이터를 읽고, 비즈니스 로직을 수행하여 HttpServletResponse에 응답 데이터를 기록합니다.
  6. 응답 전송: 서블릿 컨테이너는 HttpServletResponse에 담긴 정보를 바탕으로 HTTP 응답 메시지를 생성하여 웹 서버를 통해 클라이언트에게 전송합니다.

Web API vs 서블릿 API

Web API의 역할 (외부 통신 규약 정의):

  • Web API는 클라이언트와 서버가 어떻게 소통할지, 어떤 형식으로 데이터를 주고받을지에 대한 '외부 규약'을 정의합니다. (예: /users 경로로 GET 요청 시 JSON 형식의 사용자 목록 반환)
  • 클라이언트는 이 Web API 규약에 따라 요청을 생성하여 서버로 보냅니다.

서블릿 API의 역할 (규약 구현을 위한 자바 도구):

  • 서버에 요청이 도달하면, 서블릿 컨테이너는 이 클라이언트의 HTTP 요청을 '자바 프로그램'이 이해하고 처리할 수 있는 형태로 변환해 줍니다. (예: HTTP 요청 메시지를 HttpServletRequest 객체로 변환)
  • 이때, 개발자는 서블릿 API가 제공하는 메서드와 객체(HttpServletRequest, HttpServletResponse 등)를 사용하여 Web API 규약에 정의된 로직을 자바 코드로 구현합니다. 즉, Web API 규약을 '수정'하는 것이 아니라, Web API 규약을 자바 언어로 '구현'하고 처리하는 데 필요한 기반과 도구를 서블릿 API가 제공하는 것입니다.

응답 처리 및 Web API 규약 준수:

  • 구현된 자바 로직이 처리된 후, 개발자는 서블릿 API를 사용하여 Web API 규약에 맞는 응답(예: JSON 형식의 데이터)을 HttpServletResponse 객체에 담습니다.
  • 그러면 서블릿 컨테이너가 이 HttpServletResponse 객체에 담긴 정보를 다시 HTTP 응답 메시지 형태로 변환하여 클라이언트에게 전송합니다.
profile
오늘은 어떤 새로운 것이 나를 즐겁게 할까?

0개의 댓글