Spring MVC : 스프링 환경에서 서블릿 사용해보기

    스프링 환경에서 서블릿 사용해보기


    앞서 말한 것처럼 WAS는 서블릿 객체를 제공해서 개발자들이 비즈니스 로직에만 신경쓸 수 있도록 해준다. 이런 서블릿은 사실 스프링 환경과는 아무런 상관이 없다. 단지 스프링부트를 통하면 환경설정이 쉽기 때문에 스프링부트로 파일을 만들어서 사용하는 것이다. 

     

    스프링 부트 서블릿 환경 구성(@ServletComponentScan)


    먼저 서블릿 환경을 구성하기 위해서는 스프링 빈을 등록할 때 사용하는 @ComponentScan처럼 @ServletComponetScan 어노테이션을 달아줘야한다. @ComponentScan과 유사하게 해당 위치부터 하위 항목들을 모두 조사해서 서블릿을 서블릿 컨테이너에 등록해준다. 

     

    HelloServlet 서블릿 하나 등록해서 찍먹해보기


    @WebServlet(name = "helloServlet", urlPatterns = "/hello")
    public class HelloServlet extends HttpServlet {
    
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("HelloSErvletServiceMethod");
            System.out.println("request = " + request);
            System.out.println("response = " + response);
    
            String username = request.getParameter("username");
            System.out.println("username = " + username);
    
            response.setContentType("text/plain");
            response.setCharacterEncoding("utf-8");
            response.getWriter().write(username);
    
        }
    }

    HelloServlet을 위와 같이 등록했다. 등록 후, localhost:8080/hello?username=kim으로 접근해보았다. 그리고 이에 대한 결과를 살펴봤다.

    콘솔에서는 다음 실행 결과를 볼 수 있었다. 앞에서 공부한 내용을 살펴보면 "WAS 서버는 HTTP 요청이 오면 Request, Response 객체를 생성해서 매개변수로 전달해준다.'라는 것이 잘 이루어진 것을 볼 수 있다. 이 때, 쿼리 파라메터로 'username=kim'을 보냈다.

    실제 실행 결과를 F12(개발자 도구)에서 좀 더 자세히 살펴 볼 수 있었다. HTTP Method는 'GET'으로 전달된 것을 볼 수 있다. 주로 우리가 직접 URL로 접근하는 것은 'GET'이라는 것을 여기서 유추할 수 있다. 이 때 상태코드는 200으로 정상 응답이 온 것을 볼 수 있다. 

    Request Header에는 어떤 값이 들어갔는지도 볼 수 있다. gzip 형태로 데이터가 압축되서 전달되었고, 가장 선호하는 언어가 ko-KR인 것을 볼 수 있다. 그리고 Cache-Control에서 캐시가 0초 만에 죽는 것도 볼 수 있고, 어떤 호스트로 접근했는지도 볼 수 있다. 

     

    HTTP 요청 메세지 로그로 확인하기. 


    톰캣 서버에는 HTTP 요청이 온다. 그런데 이런 HTTP 요청을 로그로 남겨서 추적해보고 싶은 경우가 있다. 주로 운영 서버에서 이러면 큰 성능 저하가 일어나지만, 개발 단계에서는 사용하면서 하나하나 추적해봄직하다. HTTP 요청 메세지 로그 모니터링을 위해서는 다음과 같이 설정을 해야한다. 

    스프링부트 → MAIN → resources → ApplicationProperties에 특정 코드를 추가한다.

    logging.level.org.apache.coyote.http11=debug

    위 코드를 추가하고, localhost:8080으로 접근을 한번 해본다. 그리고 내 콘솔을 한번 살펴봐서 변화가 있는지 본다.

    콘솔을 살펴보면 이전에 없던 것들이 요청이 올 때마다 생기는 것을 볼 수 있다. 이 메세지는 HTTP 요청이 올 때 마다 그 요청에 대한 정보를 하나하나 남겨준다. 특히, HTTP 요청의 HEADER 정보가 하나하나 남은 것을 볼 수 있다. 

     

    서블릿 컨테이너의 동작 방식


    1. 스프링 부트를 실행한다.
    2. 스프링 부트가 실행될 때 내장 톰캣 서버도 함께 올라간다.
    3. 내장 톰캣 서버는 서블릿 컨테이너를 가지고 있다. 서블릿 컨테이너는 톰캣 서버가 실행될 때, 서블릿을 찾아서 모두 생성해서 서블릿 컨테이너에 보관해준다.(HelloServlet이 생성되어 싱글톤 형태로 사용됨)
    4. HTTP 요청 메세지가 나간다. (GET /hello?username="kim HTTP/1.1)
    5. 서버는 HTTP 요청 메세지를 받은 후, Response + Request 객체를 각각 생성한다. 그리고 그 객체를 기존에 생성되어있던 HelloServlet을 호출하면서 객체를 넘겨준다.
    6. HelloServlet이 실행되면 자동적으로 내부에 있는 Service 메서드(비즈니스 로직)가 실행된다.
    7. 필요한 작업이 완료되면, WAS가 Response 객체에 있는 정보를 바탕으로 HTTP 응답 메세지를 만들어서 클라이언트에 반환해준다.
    8. 웹 브라우저는 응답 메세지를 보고 웹 화면을 띄운다. 

     

    Welcome Page 만들기


    main 바로 밑에 "webapp"이라는 디렉토리를 만든다. 그리고 그 디렉토리에 "index.html' 파일을 만든 후 아래 코드를 붙여넣어준다.

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <ul>
        <li><a href="basic.html">서블릿 basic</a></li>
    </ul>
    </body>
    </html>

    이후 동일 폴더에 'basic.html'이라는 파일을 만들어 준 후 아래 코드를 넣어준다.

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>Title</title>
    </head>
    <body>
    <ul>
      <li>hello 서블릿
        <ul>
          <li><a href="/hello?username=servlet">hello 서블릿 호출</a></li>
        </ul>
      </li>
      <li>HttpServletRequest
        <ul>
          <li><a href="/request-header">기본 사용법, Header 조회</a></li>
          <li>HTTP 요청 메시지 바디 조회
            <ul>
              <li><a href="/request-param?username=hello&age=20">GET -
                쿼리 파라미터</a></li>
              <li><a href="/basic/hello-form.html">POST - HTML Form</a></li>
              <li>HTTP API - MessageBody -> Postman 테스트</li>
            </ul>
          </li>
        </ul>
      </li>
      <li>HttpServletResponse
        <ul>
          <li><a href="/response-header">기본 사용법, Header 조회</a></li>
          <li>HTTP 응답 메시지 바디 조회
            <ul>
              <li><a href="/response-html">HTML 응답</a></li>
              <li><a href="/response-json">HTTP API JSON 응답</a></li>
            </ul>
          </li>
        </ul>
      </li>
    </ul>
    </body>
    </html>

     

    위 코드를 넣어준 후에, localhost:8080으로 접근해보면 웰컴 페이지가 좌측처럼 튼다. 그리고 a href 태그로 basic.html로 넘어가게 되는데, 오른쪽에 basic.html이 정적 페이지로 구성되서 제공된다. 

    댓글

    Designed by JB FACTORY