블스뜸 2025. 5. 4. 21:03

Servlet

Servlet은 HTTP 프로토콜 기반의 요청(Request) 및 응답(Response)을 처리하는 데 사용되는 Java 기술이다. Java에서 Servlet은 javax.servlet.http.HttpServlet 클래스를 상속받아 구현되며, 웹 애플리케이션 개발의 핵심 구성 요소 중 하나이다.

Servlet의 역할 예시

클라이언트가 HTTP POST 요청을 통해 HTML Form 데이터를 서버에 전송하는 상황을 가정해 보자 (예: 회원 가입).

  • HTTP Request Message 예시:
  • POST /api/users HTTP/1.1
    Host: localhost:8080
    Content-Type: application/x-www-form-urlencoded
    
    userId=아이디&pssword=비밀번호
    
  • HTTP Response Message 예시:
  • HTTP/1.1 200 OK
    Content-Type: text/html;charset=UTF-8
    Content-Length: 3423
    <html>
    	<body>
    		...
    	</body>
    </html>
    

서버에서 처리해야 하는 작업

서버는 클라이언트의 HTTP 요청을 받아 다음과 같은 작업을 처리해야 한다.

  1. 서버와 TCP/IP 연결 설정
  2. HTTP Request Message를 필요한 형태로 변환하여 읽기
    • HTTP Method 및 URL 분석
    • HTTP Header 분석
    • HTTP Message Body 읽기 및 변환
  3. 분석한 결과를 통해 프로세스 실행
    • 비즈니스 로직 실행
  4. HTTP Response Message 생성
    • HTTP Start Line 생성
    • Header 생성
    • HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 작성
  5. 처리가 불가하다면 예외 처리
  6. 응답 전달
  7. 연결 종료

Servlet의 역할: 위 서버 처리 과정에서 1, 2, 3 (일부)5, 6, 7번은 Servlet Container가 처리해주며, 개발자는 비즈니스 로직 (3번의 핵심) 구현에 집중할 수 있다.

Servlet 동작 순서

클라이언트가 localhost:8080/example HTTP API를 호출했을 때 일어나는 과정은 다음과 같다.

  • Servlet 예시 코드 (현재는 어노테이션 방식으로 주로 사용하여 현대에는 사용하지 않음)
    @WebServlet(name="ExampleServlet", urlPatterns = "/example")
    public class ExampleServlet extends HttpServlet { // HttpServlet을 상속받아 구현한다.
        @Override
        protected void service( 
        	HttpServletRequest request, // HTTP 요청 정보를 쉽게 사용할 수 있게 만드는 Servlet
            HttpServletResponse response // HTTP 응답 정보를 쉽게 제공할 수 있게 만드는 Servlet
        ) {
            // application logic
        }
    }
  1. WAS는 수신된 HTTP 요청 메시지를 기반으로 새로운 HttpServletRequest와 HttpServletResponse 객체를 생성한다.
  2. WAS는 생성된 Request와 Response 객체를 서블릿 컨테이너에 전달하며, @WebServlet 설정에 따라 /example URL에 매핑된 ExampleServlet 객체의 service() 메서드를 호출한다.
  3. ExampleServlet의 service() 메서드 내에서 비즈니스 로직이 처리된다.
  4. 개발자는 response 객체를 사용하여 HTTP 응답에 필요한 정보 (Content Type, 응답 데이터 등)를 입력한다.
  5. WAS는 response 객체에 담긴 정보를 바탕으로 HTTP 응답 메시지를 생성하여 클라이언트에게 전송한다.

개발자가 하는 일

  • HttpServletRequest 객체에 담겨 있는 HTTP 요청 정보를 꺼내서 사용한다 (요청 URL, Method, Header, Message Body 등).
  • 요청 정보를 기반으로 필요한 기능 (비즈니스 로직)을 수행한다.
  • 생성된 HttpServletResponse 객체에 HTTP 응답 정보를 입력한다 (응답 데이터, Content Type 등).

Servlet Container

  • Servlet을 지원하는 WAS 내부에는 서블릿 컨테이너가 존재한다.
  • 서블릿 컨테이너는 서블릿의 생명주기 (초기화, 생성, 관리, 호출, 종료) 전체를 관리하는 역할을 수행한다.

Servlet의 생명주기

  • Servlet 객체의 생성 및 관리는 개발자가 직접 하는 것이 아니라 서블릿 컨테이너가 담당한다.
  • WAS (서블릿 컨테이너 포함)가 시작될 때 서블릿이 초기화되고, 클라이언트의 첫 요청 시 (또는 WAS 설정에 따라) 서블릿 객체가 생성된다.
  • 이후 들어오는 동일한 URL에 대한 요청에 대해서는 서블릿 컨테이너가 생성해 둔 서블릿 객체를 재활용 (싱글톤) 한다.
  • WAS가 종료될 때 Servlet 객체도 함께 소멸된다.

Servlet Container가 하는 일

  • 서블릿 초기화 (init() 메서드 호출)
  • 서블릿 객체 생성 (service() 메서드 호출을 위한 객체 생성)
  • 서블릿 관리 (생성된 객체 유지 및 재사용)
  • 클라이언트 요청 시 서블릿 메서드 호출 (service(), doGet(), doPost() 등)
  • 서블릿 종료 (destroy() 메서드 호출)
  • 서블릿 객체를 싱글톤으로 관리하여 효율적인 자원 관리를 수행한다.
  • 동시 요청 처리를 위해 Multi Thread를 지원한다 (각 요청마다 새로운 스레드를 생성하여 처리).