우아한테크코스/레벨2

[Java] 서블릿(Servlet) 이란? Java Application에서 어떻게 사용될까?

MINGYUM 2024. 5. 11. 12:15

 

😎 서블릿이란?

서블릿은 자바 어플리케이션에서 클라이언트의 요청을 처리하고 응답을 반환하는 역할을 하는 하나의 클래스이다.

예를 들어, 우리는 자바 언어를 사용해서 클라이언트와 HTTP 요청과 응답을 주고받는 웹 환경을 구성할 수 있다. 이러한 역할을 수행하는 것이 바로 서블릿 (Servlet)이다. 

 

서블릿이 있기 때문에 할 수 있는 일들은 다양하다. 몇 가지를 예시로 들어보겠다.

  • HTML 폼에 사용자가 입력을 할 수 있다. 
    • 사용자가 입력한 데이터가 폼을 통해 서버로 전송된다. 사용자가 아이디와 비밀번호를 입력하고 확인 버튼을 누르면 HTTP 요청으로 서블릿에게 데이터가 전송되고, 서블릿은 데이터를 사용해 로그인 로직을 처리한다.
  • 데이터베이스에 쿼리를 날린다.
    • 서블릿은 외부 서버 중 하나인 데이터베이스와의 연결을 담당하기도 한다. JDBC API를 사용해 Connection 객체를 생성하고 PreparedStatment 객체 등을 사용해서 SQL 쿼리를 데이터베이스에 전송한다.
  • 동적 웹 환경을 구성한다.
    • 서버 측에서 데이터를 기반으로 HTML을 생성하여 클라이언트에게 전송하면 클라이언트에서 동적인 웹 페이지를 확인할 수 있다.

이렇게 서블릿은 자바 어플리케이션에서 HTTP 요청 응답 매커니즘에 한정되지 않고 외부 서버와 통신하는 역할을 한다.

이러한 서블릿 기술은 다른 웹 기술의 주요한 기반이 되기도 한다. 예를 들면 JSP나 Spring MVC 등이 있다.

 

🤔 서블릿 컨테이너란? 

서블릿은 서블릿 컨테이너 (Servlet Container) 라고 불리는 또다른 자바 어플리케이션의 경계 하에 동작한다. 

서블릿 컨테이너는 웹 서버의 한 부분에 속한다. 서버가 요청을 전달 받았을 때 서블릿 컨테이너에게 이 요청을 전달하고, 서블릿 컨테이너가 요청을 처리할 수 있는 서블릿에게 요청을 위임하는 구조이다.

출처 : https://sergiomartinrubio.com/articles/get-started-with-java-servlets/

 

이렇게 서블릿 컨테이너는 여러 개의 서블릿을 관리하고 실행하는 역할을 한다. 그래서 서블릿 컨테이너는 서블릿 엔진 (Servlet Engine) 이라고 불리기도 한다. 

 

서블릿 컨테이너의 역할을 정리하면 다음과 같다. 

  • 서블릿이 생성되고 종료되는 생명주기를 관리한다. 
  • 클라이언트로부터 요청을 받고 적절한 서블릿에게 요청을 위임한다.

🚗 자바 어플리케이션에서 서블릿이 동작하는 과정

클라이언트에서 HTTP 요청을 보내고 서블릿에서 받아 처리하여 응답을 보내는 과정을 정리해보자. 

 

1. 클라이언트는 웹 서버에게 HTTP 요청을 보낸다.

2. 웹 서버는 서블릿 컨테이너에게 요청을 위임하고 서블릿 컨테이너는 HttpServletRequest와 HttpServletResponse 객체를 새로 생성한다.

3. 이 객체가 서블릿에게 전달되고 서블릿은 요청의 HTTP Method에 해당되는 적절한 메서드에서 요청을 처리한다.

4. 응답값이 HttpServletResponse에 담아 서블릿 컨테이너에게 전달된다. 서블릿 컨테이너는 이 객체에서 응답 데이터와 헤더, 상태 코드를 추출하여 클라이언트에게 HTTP 응답을 보낸다.

 

 

서블릿이 어떻게 요청을 처리하는 지 서블릿 클래스의 메서드를 오버라이딩한 예제 코드로 살펴보자. 

@WebServlet("/example")
public class ExampleServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException {
        String message = request.getParameter("message");
        
       	response.setContentType("text/html;charset=utf-8");
       	PrintWriter out = response.getWriter();
        out.println("hello" + message);
    }
}

 

"/example" 경로로 보내진 GET 요청에 대해서 파라미터를 받고 응답 값에 직접 정의한 메시지를 담아 보내는 방식이다. 요청을 받았을 때 서블릿 컨테이너가 여러 가지 서블릿 중에서 요청에 적합한 ExampleServlet을 찾아 GET 요청을 실행하는 과정으로 동작하게 된다.

 

이렇게 서블릿이 무엇인지에 대해 알아보았다. 다음 포스팅에서는 서블릿을 기반으로 구축된 Spring MVC에 대해서 알아보겠다.

 

참고 

https://www.baeldung.com/intro-to-servlets

https://javaee.github.io/tutorial/servlets001.html

https://mangkyu.tistory.com/14

https://www.baeldung.com/java-servlets-containers-intro