Spring

서블릿

깊게 생각하고 최선을 다하자 2022. 7. 27. 19:54

- 서블릿이란 클라이언트의 요청을 처리하고 응답을 반환하는 것을 지원하는 자바 객체입니다. 

  자바에서는 HttpServlet 이라는 추상 클래스를 통해서 서블릿 객체의 생성을 지원합니다.  

  코드 예시는 다음과 같습니다. 

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


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

        super.service(request, response);
    }

 서블릿 클래스는 @WebServlet이라는 애노테이션을 통해 name과 urlPatterns를 지정할 수 있습니다. 

 여기서 urlPatterns란 클라이언트가 어떤 URL로 접속했을 때, 서블릿 클래스가 실행될지를 나타낸 것입니다. 

 그리고 service라는 메소드를 선언하고, 인자로 HttpServletRequest 객체인 request와 HttpServletResponse 객체인 response를 선언하였습니다. 

 

- 이제 서블릿을 통해 구체적으로 어떤 작업이 가능한지 알아보겠습니다. 

  우선 HttpServletRequest에 대하여 알아보겠습니다. 

  코드 예시는 다음과 같습니다.  

@WebServlet(name="requestHeaderServlet", urlPatterns="/request-header")
public class RequestHeaderServlet extends HttpServlet {


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

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

- 여기서는 url에 ?username="tom"이라고 이름을 지정했다면, request 객체의 getParameter를 통해서 해당 username을 가져올 수 있습니다. 즉, getParameter 메소드는 요청에 대한 파라미터를 반환하는 메소드입니다. 

  이것이 가능한 이유는 HttpServletRequest 객체가 요청에 관련된 정보들을 관리하기 때문입니다.

  HttpServletRequest 객체는 다음과 같은 메소드들을 통해 요청에 관련된 정보들을 제공합니다. 

 

 

- 서블릿은 또한 응답과 관련된 정보도 제공합니다.  

  이는 HttpServletResponse 객체를 통해서 가능합니다. 

  코드 예시는 다음과 같습니다. 

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

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        System.out.println("HelloServlet.service");

        System.out.println("req=" + req);
        System.out.println("res=" + res);

        String username = req.getParameter("username");

        System.out.println("username=" + username);

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

    }
}

- 위의 코드를 보면, HttpServletResponse 객체인 res에 setContentType과 setCharacterEncoding 메소드를 실행한 것을 볼 수 있습니다. setContentType은 응답 객체에 content-type을 지정해준 것이고, setCharacterEncoding 메소드는 인코딩 방식을 지정해준 것입니다. 이와 같이 HttpServletResponse 객체를 통해서 응답과 관련된 정보를 편리하게 설정할 수 있습니다.

 

※ Content-Type이란?

- Content-Type이란 전달되는 content의 형식을 나타낸 것입니다.

  Content-Type의 대표적인 예시로 text/html, multipart/form-data, application/json 등이 있습니다. 

 

-  HttpServletResponse 객체는 다음과 같은 메소드들을 통해 요청에 관련된 정보들을 제공합니다. 

 

- 결론적으로 웹 애플리케이션 서버(WAS)의 요청 응답 구조를 그림으로 나타내면 다음과 같습니다. 

           [그림1]

           [그림2] 

위의 그림을 단계별로 설명하면 다음과 같습니다. 

1) 스프링 부트가 실행되면 내장 톰캣 서버가 띄워지고, 

    톰캣 서버에 의해 관리되는 서블릿 컨테이너가 helloServlet 객체를 생성합니다.(그림1) 

    참고로, 서블릿 컨테이너가 helloServlet 객체를 생성할 수 있는 이유는,

    톰캣 서버가 실행될 때, @ServletComponentScan을 통해

    @WebServlet으로 선언된 서블릿 클래스를 찾기 때문입니다. 

 

2) localhost:8080/hello로 요청이 들어오면 웹 어플리케이션 서버는 request, response 객체를 생성하고,

    이를 서블릿 컨테이너의 helloServlet 객체에 전달합니다. (그림2)

 

3) helloServlet 객체는 request 객체와 response 객체를 전달 받아 작업을 한 후,

    종료하면서 WAS 서버에 response 객체를 전달합니다. (그림2)

 

4) WAS 서버는 response 객체를 전달 받으면, 해당 정보로 HTTP 응답 메시지를 생성해서,

    웹 브라우저에 반환합니다. 

   

 

참고

김영한 스프링 MVC 1편

https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequest.html   

https://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponse.html 

https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/Content-Type 

https://tecoble.techcourse.co.kr/post/2021-05-23-servlet-servletcontainer/