Servlet은 Java를 사용한 웹 애플리케이션 개발의 기본 기술로, 클라이언트의 요청을 처리하고 응답을 반환하는 역할을 한다. 웹 서버가 HTTP 요청을 받으면, 해당 요청을 처리할 Servlet을 찾아 요청을 전달한다.
그러나 Servlet만으로 웹 애플리케이션을 개발하려면 많은 코드를 작성해야 하며, 프로젝트가 커지면 관리하기 어려워질 수 있다. 이러한 문제를 해결하기 위해 등장한 것이 MVC(Model-View-Controller) 패턴이다. MVC 패턴은 애플리케이션을 Model, View, Controller 세 부분으로 분리하여 관리하는 디자인 패턴을 말한다.
Spring MVC의 핵심 구성 요소 중 하나가 DispatcherServlet이다. DispatcherServlet은 Front Controller 패턴을 구현한 것으로, 모든 클라이언트의 요청을 한 곳에서 받아 적절한 Controller로 요청을 전달하는 역할을 한다.
기존 Servlet 방식과 Spring MVC의 DispatcherServlet 사이의 주요 차이점은 요청 처리, 설정 및 확장성, 테스트 용이성에서 두드러진다.
기존 Servlet 방식에서는 각 Servlet이 하나의 요청을 처리하므로 여러 요청에 대해 여러 Servlet을 작성해야 한다. 반면에 Spring MVC에서는 모든 요청이 DispatcherServlet을 통해 들어오고, DispatcherServlet이 요청을 적절한 Controller에게 전달한다. 이로 인해 요청 처리 과정을 훨씬 간편하게 구성할 수 있다.
Servlet을 사용하면 각 Servlet의 매핑을 web.xml 파일에 직접 작성해야 한다. 그러나 Spring MVC는 자바 코드나 어노테이션을 사용한 설정을 지원하므로 설정 과정이 훨씬 간편해진다. 또한, Spring의 DI(Dependency Injection), AOP(Aspect Oriented Programming) 등의 기능을 활용하여 애플리케이션을 더욱 효과적으로 구성하고 확장할 수 있다.
Servlet은 테스트를 위해 Servlet API에 의존적인 테스트 코드를 작성해야 한다. 그러나 Spring MVC는 Mock 객체를 사용한 테스트를 지원하므로, Servlet 환경 없이도 Controller를 테스트할 수 있다.
다음은 DispatcherServlet이 요청을 처리하는 주요 과정이다
DispatcherServlet이 요청을 받으면, 요청이 어떤 컨트롤러에게 전달될지를 결정해야 한다. 이를 위해 DispatcherServlet은 Handler Mapping에게 도움을 청한다. Handler Mapping은 요청 URL, HTTP 메소드 등의 정보를 분석하여 적절한 핸들러(컨트롤러)를 찾아 반환한다.
DispatcherServlet은 Handler Mapping이 찾아준 컨트롤러의 메소드를 실행합니다. 이 메소드는 비즈니스 로직을 처리하고, 결과 데이터와 뷰 이름을 모델과 뷰 객체에 담아 반환한다.
DispatcherServlet은 컨트롤러가 반환한 뷰 이름을 실제 뷰로 변환해야 한다. 이를 위해 DispatcherServlet은 View Resolver에게 도움을 청한다. View Resolver는 뷰 이름을 분석하여 실제 뷰 객체를 찾아 반환한다.
DispatcherServlet은 View Resolver가 찾아준 뷰 객체에 모델 데이터를 전달하고 뷰를 렌더링하게 한다. 렌더링된 결과는 HTTP 응답으로 클라이언트에게 반환된다.
이 외에도 DispatcherServlet은 멀티파트 요청 처리, Locale 및 Theme 변경, 예외 처리 등과 같은 다양한 고급 기능을 제공한다. 이러한 기능들은 핸들러 인터셉터, 핸들러 어댑터, 핸들러 예외 리졸버 등의 컴포넌트를 통해 구현되며, 필요에 따라 이들을 커스터마이즈하여 사용할 수 있다.