스프링으로 프로그래밍을 하다보면, 디버깅할 때나 실행할 때나 지긋지긋하게 보이는 것이 있다. 바로 DispatcherServlet 이다.
이토록 지겹게 마주치는 서블릿이지만, 이 서블릿이 하는 일을 설명해보라 했을 때 자세하게 설명할 수 있는 자신은 없다.
물론 대강 어떤 역할을 하는지는 어렴풋이 눈치채고 있지만, 눈치껏 아는 것과 확실히 개념을 알고 이해하고 있는 것은 하늘과 땅 차이이다.
서블릿은 사실상, 웹 개발에서 떼려야 뗄 수 없는 관계이다. 그렇기 때문에 더더욱, 서블릿의 역할과 하는 일들은 확실하게 이해하고 있어야 한다.
그런 이유로, 금일은 서블릿에 대해서 학습하고 이를 정리하는 시간을 가져보고자 한다.
Java 프로그램이며, Java EE (= Jakatra EE)의 표준 기술Java 기반Java 로 작성되므로, 플랫폼 독립성이 뛰어남HTTP 요청 및 응답 처리HttpServlet 을 상속 받아 GET 이나 POST 같은 HTTP 요청을 처리Tomcat 의 경우, 기본값으로 200개의 작업 스레드가 존재MVC 패턴의 컨트롤러 역할JSP 나 템플릿 엔진과 결합해 View 를 렌더링 후 응답으로 반환web.xml 혹은 @WebServlet 을 통해 URL 과 매핑되며, 클라이언트의 요청이 해당 서블릿에 전달될 수 있도록 설정됨init()init() 를 호출하여 서블릿 초기화init() 메서드 또한 단 한 번만 호출되며, 이 서블릿은 종료될 때까지 유지됨service()service() 메서드 호출service() 메서드는 클라이언트의 요청을 처리하며, HTTP 요청 방식에 따라 doGet() , doPost() 등 적절한 메서드 호출HttpServletResponse (응답 객체) 를 사용하여 클라이언트에게 응답을 반환distroy()distroy() 메서드 호출Apache Tomcat , Jetty , WildFly , GlassFish 등의 웹 애플리케이션 서버(WAS) 안에 포함되어 있음WAS 는 서블릿 컨테이너의 역할 뿐만 아니라, JSP 실행, 트랜잭션 관리, 데이터 소스 관리 등의 기능 또한 제공Spring MVC 같은 프레임워크도 실행할 수 있도록 지원WAS 내에서 서블릿을 실행할 수 있도록 도와주는 역할HTTP 요청 및 응답 처리JSP 컴파일 및 실행getServletContext() 로 접근 가능setAttribute() , getAttribute() ...web.xml 에서 설정한 파라미터getResourceAsStream()log()getRequestDispatcher()Spring MVC , 즉 Spring 프레임워크에서 사용되는 서블릿Spring Boot 와 함께 가장 많이 사용됨HTTP 요청을 DispatcherServlet 으로 전달DispatcherServlet 이 여러 컨트롤러의 액션 메서드를 라우팅하여 실행@RestController
@RequireMapping("/api/hotels")
public class HotelController {
@GetMapping
public List<Hotel> getHotels() {
// ...
}
}
/api/hotels 경로로 요청이 오면 DispatcherServlet 이 HandlerMapping 을 통해 해당 컨트롤러의 getHotels() 메서드 호출Spring MVC 에서의 서블릿 실행 흐름HTTP 요청 보냄web.xml 또는 Spring Boot 설정을 통해 DispatcherServlet 이 요청을 받도록 설정Spring Boot 는 별도의 설정없이 자동으로 DispatcherServlet 을 등록DispatcherServlet 으로 전달DispatcherServlet 이 요청을 분석하고 핸들러(Controller)를 찾음HandlerMapping 을 사용하여, 어떤 컨트롤러 및 메서드가 요청을 처리할지 결정HandlerAdapter 가 HandlerMapping 이 찾아낸 컨트롤러의 액션 메서드를 실행한 후 결과를 반환DispatcherServlet 이 View 를 선택하거나 JSON 응답을 반환ViewResolver 를 사용해 적절한 JSP , Thymeleaf 같은 View 를 선택JSON 응답 반환💡
HandlerMapping과HandlerAdapter
- Spring MVC에서 요청을 적절한 컨트롤러로 연결하고 실행하는 핵심 컴포넌트
- DispatcherServlet이 서블릿 컨테이너 내에서 요청을 처리할 때 사용하는 핵심 인터페이스
HandlerMapping 이 찾아낸 컨트롤러의 액션 메서드를 실제로 실행하는 역할@RequestMapping , @RestController , @Controller )를 확인하고, 적절한 방식으로 호출🤔
HandlerMapping과HandlerAdapter가 없으면?
DispatcherServlet 은 컨트롤러로 연결할 방법을 알 수 없음HTTP 요청이 오더라도, 이를 어떤 컨트롤러가 처리해야 할지 판단 불가- 즉, HandlerMapping 과 HandlerAdapter 는 DispatcherServlet 이 요청을 적절한 컨트롤러의 메서드로 연결하고 실행하는 핵심 역할을 함
참고) OpenAI. (2024).ChatGPT(4o)[Large language model].https://chatgpt.com/