[Spring/MVC-Servlet] Hello 서블릿

서블릿은 톰캣 같은 웹 애플리케이션 서버를 직접 설치하고, 그 위에 서블릿 코드를 클래스 파일로 빌드해서 올린 다음, 톰캣 서버를 실행하면 된다. 하지만 이 과정은 매우 번거롭다. 스프링 부트는 톰캣 서버를 내장하고 있으므로, 톰캣 서버 설치없이 편리하게 서블릿 코드를 실행할 수 있다. 따라서 스프링 부트 환경에서 서블릿 코드를 등록하고 사용해보자.


스프링 부트 서블릿 환경 구성

@ServletComponentScan

스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan을 지원한다. 이를 사용하면, 스프링이 자동으로 현재 패키지를 포함하여 하위 패키지를 탐색해 모든 서블릿을 찾아 자동으로 등록하고 실행할 수 있도록 도와준다. 

서블릿 등록

실제로 동작하는 서블릿 코드를 등록해보자.

@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 = " + 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("hello" + username);

    }
}

HelloServlet이라는 클래스 파일을 하나 생성한다. 이때 서블릿은 HttpServlet을 상속받아야 한다.

서블릿 어노테이션은 @WebServlet을 사용한다. 뒤에 이름(name)과 경로(urlPatterns)을 넣어주는데, urlPatterns = "/hello"로 설정할 경우, /hello로 들어올 때, 이 서블릿을 실행한다는 의미이다. 

즉, HTTP 요청을 통해 매핑된 URL이 호출되면 서블릿 컨테이너는 아래의 메서드를 자동으로 호출한다. 

protected void service(HttpServletRequest request, HttpServletResponse response)

 

.getParameter(..)

request.getParameter(...)을 이용하여 쿼리 파라미터를 쉽게 조회할 수 있다.

이를 실행하고 웹주소 창에 local:8080/hello?username=lee를 입력하면 다음과 같은 결과를 얻을 수 있다.

 

응답 메시지 보내기 

응답메시지를 보내기위해서는 HttpServletResponse에 찍어줘야 한다. 여기에 어떤 값을 넣으면 HTTP 응답 메시지에 데이터가 담겨 나가게된다. 

response.getWriter().write(..)를 사용하면 HTTP 바디에 데이터가 들어간다. 이 위의 setContentType과 같은 메서드는 HTTP 헤더 정보에 입력된다. 이를 실행시켜보면 웹 창에서 다음과 같은 결과를 볼 수 있다.

그리고 웹에서 F12를 눌러 개발자 도구에 들어가 확인해보면 Response Header에서 다음의 정보를 확인할 수 있다. 

위의 코드에서 설정한 Context-Type이 잘 반영되어 있는 것을 확인할 수 있다.

마찬가지로 쿼리 파라미터도 확인할 수 있다.


HTTP 요청 메시지 로그로 확인하기

개발 시, 편리하게 HTTP 요청 메시지를 모두 보고 싶은 경우, application.properties에 아래의 설정을 추가해주면 된다. 

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

운영서버에 이렇게 모든 요청 정보를 다 남기면 성능저하가 발생할 수 있다. 개발 단계에서만 적용하도록 하자.


서블릿 컨테이너 동작 방식

먼저, 스프링 부트를 실행하면 내장 톰캣 서버를 띄워준다. 톰캣 서버는 내부에 서블릿 컨테이너 기능을 가지고 있다. 이 서블릿 컨테이너를 통해 서블릿을 생성해준다.

위에서 우리가 한 HTTP 요청/응답 메시지는 아래와 같다.

서버는 HTTP 요청 메시지가 들어오면 request, response 객체를 만들어 helloServlet을 호출하고 넘겨준다. 그리고 필요한 작업을 하고 종료되고 나가면서 WAS가 response 정보를 가지고 HTTP 응답 메시지를 위와 같이 만들어 반환해준다.


Welcome 페이지 추가

개발할 내용을 편리하게 참고할 수 있도록 welcome 페이지를 만들어두자.

webapp 경로에 index.html 을 두면 http://localhost:8080 호출시 index.html 페이지가 열린다.

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>
                <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>