공식 문서에 의하면 스프링 웹 MVC는 서블릿 API 기반의 웹 프레임워크이다. 스프링 MVC에 대해 공부하던 중 서블릿에 대한 개념을 간단히 집고 넘어가야 진행할 수 있을 것 같아 정리해 보았다.
서블릿이란?
서블릿은 웹 서버 내에서 실행되는 작은 자바 프로그램(인터페이스)이다. 일반적으로 HTTP를 통해 웹 클라이언트의 요청을 수신하고 응답하며 동적 웹 페이지를 만들 때 사용된다.
개발자가 HTTP 요청과 응답을 직접 다 파싱하고 응답을 만든다고 생각하면 해야 할 일이 너무 많다.
하지만 서블릿을 사용한다면 개발자는 HTTP 스펙을 매우 편리하게 사용할 수 있다.
Servlet 인터페이스는 서블릿을 초기화하고, 요청을 처리하고, 서버에서 서블릿을 제거하는 방벙을 정의한다. 아래는 HttpServlet을 상속받아 직접 정의한 서블릿 클래스이다. HttpServlet API를 통해 간편하게 HTTP 요청 메시지 안의 정보를 조회하고 사용할 수 있다.
@WebServlet(name = "RequestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("[전체 파라미터 조회] - start");
request.getParameterNames().asIterator()
.forEachRemaining(paramName ->
System.out.println(paramName + "=" + request.getParameter(paramName)));
System.out.println("[단일_파라미터 조회]");
String username = request.getParameter("username");
String age = request.getParameter("age");
System.out.println("username = " + username);
System.out.println("age = " + age);
System.out.println("[이름이 같은 복수 파라미터 조회]");
String[] usernames = request.getParameterValues("username");
for (String name : usernames) {
System.out.println("username = " + name);
}
response.getWriter().write("OK");
}
}
일반적으로 우리가 사용하는 Servlet 클래스는 HttpServlet이다. 서블릿의 생명 주기를 담당하는 메서드 중 생성(init())과 파괴(destroy())에 관련한 메서드는 추상 클래스 GenericServlet에 간단히 정의되어 있기 때문에 사용자는 클라이언트 요청에 응답하는 기능을 하는 service() 메서드만 만들어주면 된다.
위의 코드에서도 봤듯이 Service 메서드는 HTTP 스펙을 ServletRequest, ServletResponse 인터페이스를 구현한 HttpServletRequest와 HttpServletResponse를 통해 편리하게 사용할 수 있다.
서블릿은 싱글톤으로 관리되는데 최초 로딩 시점에 서블릿 인스턴스를 생성하고 재활용한다. 서블릿이 요청될 때 init() 메서드가 호출되는데 다음에 서블릿이 요청되어도 초기화를 이미 했기 때문에 바로 재사용될 수 있다. 서블릿 객체는 서블릿 컨테이너가 종료될 때 함께 종료된다.
서블릿 실행 순서
1. 웹 브라우저에서 요청이 발생한다. (localhost:8080/hello)
2. HTTP 요청 메시지를 기반으로 서블릿 컨테이너가 request, response 객체를 생성한다.
3. 서블릿 컨테이너가 알맞은 서블릿 객체를 찾아 해당 서블릿의 service() 메서드 파라미터에 reqeust와 response를 넣어주어 실행시킨다.
4. response 객체를 통해 응답 메시지를 만들어 웹 브라우저에 전달한다.
서블릿 컨테이너
쉽게 말해서 서블릿을 관리해주는 컨테이너이다. 대표적으로 다음의 4가지 일을 해 준다.
1. 생명 주기 관리
개발자가 HttpServlet을 상속한 커스텀 서블릿을 직접 new 등으로 생성하지 않는다. 코드만 작성해주면 서블릿 객체를 서블릿 컨테이너가 자동으로 생성하고, WAS가 내려갈 때 객체를 없애는 등의 생명 주기를 관리한다. 뿐만 아니라 클라이언트의 요청에 따라 적절한 서블릿 객체를 호출한다.
2. 통신지원
클라이언트의 요청과 응답을 보낼 수 있게 웹 서버와 소켓을 만들어 통신하게 해준다.
3. 멀티스레딩 관리
어떤 서블릿에 요청이 들어오면 스레드를 생성한다. 동시에 많은 요청이 들어와도 스레드를 추가적으로 생성하여 멀티 스레드를 관리한다. 개발자가 멀티 스레드에 관해 크게 신경 쓰지 않아도 된다.
4. 선언적 보안관리
서블릿 또는 자바 클래스 안에 보안 관련된 메서드를 구현하지 않아도 서블릿 컨테이너가 보안 관련 기능을 지원한다.
참고
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#spring-web
https://mangkyu.tistory.com/14
https://sgcomputer.tistory.com/226
'스프링 > 스프링MVC' 카테고리의 다른 글
@RequestParam, @ModelAttribute, @RequestBody (0) | 2022.04.24 |
---|