Spring MVC : 스프링 환경에서 서블릿 사용해보기
- Spring/Spring MVC
- 2021. 12. 9.
스프링 환경에서 서블릿 사용해보기
앞서 말한 것처럼 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 정보가 하나하나 남은 것을 볼 수 있다.
서블릿 컨테이너의 동작 방식
- 스프링 부트를 실행한다.
- 스프링 부트가 실행될 때 내장 톰캣 서버도 함께 올라간다.
- 내장 톰캣 서버는 서블릿 컨테이너를 가지고 있다. 서블릿 컨테이너는 톰캣 서버가 실행될 때, 서블릿을 찾아서 모두 생성해서 서블릿 컨테이너에 보관해준다.(HelloServlet이 생성되어 싱글톤 형태로 사용됨)
- HTTP 요청 메세지가 나간다. (GET /hello?username="kim HTTP/1.1)
- 서버는 HTTP 요청 메세지를 받은 후, Response + Request 객체를 각각 생성한다. 그리고 그 객체를 기존에 생성되어있던 HelloServlet을 호출하면서 객체를 넘겨준다.
- HelloServlet이 실행되면 자동적으로 내부에 있는 Service 메서드(비즈니스 로직)가 실행된다.
- 필요한 작업이 완료되면, WAS가 Response 객체에 있는 정보를 바탕으로 HTTP 응답 메세지를 만들어서 클라이언트에 반환해준다.
- 웹 브라우저는 응답 메세지를 보고 웹 화면을 띄운다.
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이 정적 페이지로 구성되서 제공된다.
'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC : 스프링 MVC 단계별 구현 (0) | 2021.12.12 |
---|---|
Spring MVC : HttpServletRequest에 대한 정리 (0) | 2021.12.10 |
Spring MVC : 스프링 스타터로 프로젝트 생성하기 (0) | 2021.12.09 |
Spring MVC : HTML, HTTP API, CSR, SSR (0) | 2021.12.09 |
Spring MVC : 서블릿 간략 정리 (0) | 2021.12.09 |