Servlet 이란?
자바를 사용하여 웹페이지를 동적으로 생성하거나 데이터를 처리하는 서버측 프로그램 또는 기술(사양)을 의미한다.
서블릿이 없는 상황에서 아래와 같이 HTML Form 데이터를 서버로 전송하고 이를 처리하는 서버 프로그램을 만든다고 생각해보자.
이 때 서버에서 처리해야 하는 업무는 다음과 같이 매우 많다.
서블릿을 사용하지 않는다면 이러한 모든 처리를 직접 구현해야한다. 그러나 서블릿을 사용한다면 비즈니스 로직에만 집중 할 수 있다.
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
System.out.println("username = " + username);
response.setContentType("text/plain");
response.setCharacterEncoding("utf-8");
response.getWriter().write("hello" + username);
}
}
위와 같이 service 함수 안에서 비즈니스 로직에 집중할 수 있는 것이다.
HttpServletRequest
- HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편할 것이다.
- HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그리고 그
결과를 HttpServletRequest 객체에 담아서 제공한다. - HttpServletRequest를 사용하면 HTTP 요청 메시지를 편리하게 조회할 수 있다.
HttpServletResponse
- HttpServletResponse는 개발자 대신에 HTTP 응답 메시지를 만들어준다.
- 기능
- HTTP 응답 메시지 생성
- HTTP 응답코드 지정
- 헤더 생성
- 바디 생성
- 편의 기능 제공
- Content-Type, 쿠키, Redirect
Servlet Container
톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다. 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출 종료하는 등 생명주기를 관리한다.
서블릿 객체는 싱글톤으로 관리
- 고객의 요청이 올 때 마다 계속 객체를 생성하는 것은 비효율적이다.
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용하는 방식을 사용한다.
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
- 공유 변수 사용 주의
- 서블릿 컨테이너 종료시 함께 종료
동시 요청을 위한 멀티 쓰레드 처리 지원
- 매번 요청 시 마다 쓰레드를 생성하는 방식은 큰 비용이든다. 따라서 WAS는 아래와 같이 쓰레드 풀로 쓰레드를 관리하며 매 요청을 각 쓰레드에게 할당하는 멀티 쓰레드 처리를 지원한다.
Dispatcher Servlet
앞에서 Servlet Container는 Servlet 객체를 관리한다고 설명했다. 그렇다면 Dispatcher Servlet은 무엇일까?
일단 DispatcherServlet도 Servlet이다. Servlet이라는 이야기는 곧 Servlet Container가 생명주기를 관리하는 대상이라는 말이다.
FrontController 패턴
디스패처 서블릿을 이해하려면 FrontController 패턴을 이해하는게 필요하다. FrontController 패턴이란 컨트롤러들이 각각 클라이언트의 요청을 직접 받아서 처리하는 것과는 반대로 FrontController 가 모든 요청을 받아서 공통 로직을 처리하고 개별 컨트롤러를 찾아서 호출해주는 역할을 하는 방식을 의미한다.
FrontController 패턴 특징
- 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
- 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출 입구를 하나로!
- 공통 처리 가능
- 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨
스프링 웹 MVC의 핵심인 DispatcherServlet이 FrontController 패턴으로 구현되어 있다.
DispatcherServlet은 서버의 제일 앞에서 모든 요청을 받고 요청에 대한 개별 컨트롤러를 찾고 호출하고 응답하는 등의 역할을 하는 서블릿이다.
Dispatcher Servlet 의 구조
- 상속관계 : DispatcherServlet → FrameworkServlet → HttpServlet
- 스프링 부트는 DispatcherServlet을 서블릿으로 자동으로 등록하면서 모든 경로(urlPatterns="/")에 대해서 매핑한다.
- 참고 : 더 자세한 경로가 우선순위가 높다. 그래서 기존에 등록한 서블릿도 함께 동작한다.
'Spring' 카테고리의 다른 글
빈 후처리기, BeanPostProcessor (0) | 2022.06.11 |
---|---|
스프링이 제공하는 프록시, 프록시 팩토리 (0) | 2022.06.09 |
Fetch join, N+1 문제 (0) | 2021.11.19 |
토비의 스프링 vol.2 4장 @MVC (0) | 2021.06.05 |
객체 지향 설계와 스프링 (0) | 2020.10.19 |