서블릿 (Servlet)

Lilac-_-P·2023년 4월 13일
0

스프링 MVC

목록 보기
2/15

이전의 글에서 서블릿에 대해서 설명했기에, 서블릿에 대한 이론적인 내용은 생략한다.

이번 글에서는 실제 서블릿이 WAS 상에서 어떻게 동작하는지에 초점을 맞춰보자.
스프링 부트는 @ServletComponentScan이라는 annotation으로 서블릿을 직접 등록해서 사용할 수 있도록 지원한다.

@ServletComponentScan은 프로젝트 패키지에 있는 클래스중 @WebServlet annotation이 붙은 클래스를 스캔하여 스프링부트의 내장 톰캣에 서블릿으로 등록한다.

개발자는 @WebServlet과 HttpServlet 클래스를 상속받은 클래스를 작성하면 된다.
아래는 스프링부트에서 서블릿을 이용할 때 작성하는 예시 코드이다.

package hello.servlet.basic;

import java.io.IOException;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

  @WebServlet(name = "helloServlet", urlPatterns = "/hello")
  public class HelloServlet extends HttpServlet {

      @Override
      protected void service(HttpServletRequest request, HttpServletResponse response)
              throws ServletException, IOException {

          System.out.println("HelloServlet.service()");
          System.out.println(request);
          System.out.println(response);

          String username = request.getParameter("username");
          System.out.println(username);

          response.setContentType("text/plain");
          response.setCharacterEncoding("utf-8");
          response.getWriter().write(username);

      }

  }

위와 같이 코드를 작성하면, HelloServlet 클래스의 인스턴스가 싱글톤으로 생성되어 WAS의 서블릿 컨테이너에 등록되고, WAS에 의해 관리된다. 코드에 적힌 URL로 HTTP 요청이 들어오면, WAS는 HTTP 요청 메세지를 기반으로 HttpServletRequest와 HttpServletResponse(내용이 채워지지 않은 틀)를 생성하여 이들을 인자로 넘겨주며 HelloServlet의 service 함수를 호출한다. service 함수 내에서는 HttpServletRequest와 HttpServletResponse를 이용하여 들어온 HTTP 요청과 반환될 HTTP 응답을 자유롭게 조작할 수 있다.

서블릿을 통해 개발자는 HTTP 요청과 응답을 편리하게 사용할 수 있다. HTTP 요청을 직접 파싱하거나 HTTP 응답을 직접 구현할 필요가 없다.

HttpServletRequest와 HttpServletResponse 가 각각 제공하는 기능들은 이 글에서는 설명하지 않는다.(필요할 때 검색해서 찾아서 사용하면 되는 기능들이기 때문에)

HTTP 요청 데이터

HTTP 요청 메시지를 통해 Client에서 Server 데이터를 전달하는 방법은 크게 3가지가 있다.

  • GET - 쿼리 파라미터 : 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함시켜 전달
  • POST - HTML Form : 메시지 바디에 쿼리 파라미터 형식으로 전달(x-www-form-urlencoded)
  • HTTP Message Body에 데이터를 직접 담기 : JSON과 같은 형태로 데이터를 메시지 바디에 직접 담아서 전달

각 방법의 자세한 설명은 생략한다.

참고.
쿼리 파라미터를 이용한 방법과 HTML Form을 이용한 방법은 전달되는 데이터의 형식이 동일하다.
유일한 차이점은 전달되는 데이터가 어디에 위치하느냐? 이다.(URL 경로 or 메시지 바디)
전달되는 데이터 형식이 동일하기 때문에, 서버 측은 이 두 방식들로 전달된 데이터는 동일한 방법으로 처리한다.
그에 반해, HTTP 메시지 바디에 직접 데이터(쿼리 파라미터 형식 X)를 담는 방식은 위의 두 방식과 다르게 처리한다.

profile
열심히 하자

0개의 댓글