서블릿(Servlet)은 웹 서버에서 동작하는 자바 클래스로, 클라이언트의 HTTP 요청을 처리하고, HTTP 응답을 반환합니다.
Spring에서는 서블릿 API를 기반으로 클라이언트의 요청을 처리하는 spring-web 모듈과 spring-webmvc 모듈을 제공하여 자바 웹 애플리케이션 개발을 더욱 쉽게 할 수 있도록 지원하고 있습니다. spring-webmvc를 줄여서 Spring MVC라고 부릅니다.
클라이언트가 HTTP 요청을 보내면, 웹 서버는 서블릿 컨테이너(Tomcat)에서 spring-webmvc 모듈을 실행합니다. spring-webmvc 모듈은 클라이언트의 요청을 받아들이고, 이를 처리하기 위해 서블릿 API를 기반으로 구현된 컨트롤러를 호출합니다.
컨트롤러는 비즈니스 로직을 실행하여 요청을 처리하고 결과를 뷰(View)에 전달합니다. 뷰는 이 결과를 클라이언트가 이해할 수 있는 HTML, JSON, XML 등의 형식으로 변환하여 HTTP 응답으로 반환합니다.
개발자는 비즈니스 로직과 뷰를 분리하여 코드의 재사용성과 유지보수성을 높일 수 있습니다. 또한, 다양한 라이브러리와의 연동이 용이하여 개발 생산성을 높일 수 있습니다.
패션 모델은 디자이너가 만든 작업의 결과물을 관객들에게 보여주기 위한 역할입니다.
spring에서는 클라이언트에게 응답으로 돌려주는 '작업의 처리 결과 데이터'를 Model이라고 합니다.
View는 Model 데이터를 이용해서 웹브라우저 같은 클라이언트 애플리케이션의 화면에 보여지는 리소스를 제공하는 역할을 합니다.
세가지 방식 중에서 XML, JSON 등 특정 형식의 포맷으로의 변환하는 방식은 프론트엔드 영역과 백엔드 영역이 명확하게 구분되므로 개발 및 유지보수가 상대적으로 용이하고, 프론트엔드 측에서 비동기 클라이언트 애플리케이션을 만드는 것이 가능하는 장점이 있기 때문에 Model 데이터를 JSON 프로토콜 데이터로 변환하는 view 형태를 집중적으로 학습했습니다.
Controller는 클라이언트 측의 요청을 직접적으로 전달 받는 엔드포인트(Endpoint)로써 Model과 View의 중간에서 상호 작용을 해주는 역할을 합니다.
즉, 클라이언트 측의 요청을 전달 받아서 비즈니스 로직을 거친 후에 Model 데이터가 만들어지면, 이 Model 데이터를 View로 전달하는 역할을 합니다.
Client가 요청 데이터 전송
→ Controller가 요청 데이터 수신
→ 비즈니스 로직 처리
→ Model 데이터 생성
→ Controller에게 Model 데이터 전달
→ Controller가 View에게 Model 데이터 전달
→ View가 응답 데이터 생성
(1) 클라이언트가 요청을 전송하면 DispatcherServlet이라는 클래스에 요청이 전달됩니다.
(2) DispatcherServlet은 클라이언트의 요청을 처리할 Controller에 대한 검색을 HandlerMapping 인터페이스에게 요청합니다.
(3) HandlerMapping은 클라이언트 요청과 매핑되는 핸들러 객체를 다시 DispatcherServlet에게 리턴해줍니다.
핸들러 객체는 해당 핸들러의 Handler 메서드 정보를 포함하고 있습니다.
Handler 메서드는 Controller 클래스 안에 구현된 요청 처리 메서드를 의미합니다.
(4) 요청을 처리할 Controller 클래스를 찾았으니 이제는 실제로 클라이언트 요청을 처리할 Handler 메서드를 찾아서 호출해야 합니다. DispatcherServlet은 Handler 메서드를 직접 호출하지 않고, HandlerAdpater에게 Handler 메서드 호출을 위임합니다.
(5) HandlerAdapter는 DispatcherServlet으로부터 전달 받은 Controller 정보를 기반으로 해당 Controller의 Handler 메서드를 호출합니다.
(6) Controller의 Handler 메서드는 비즈니스 로직 처리 후 리턴 받은 Model 데이터를 HandlerAdapter에게 전달합니다.
(7) HandlerAdapter는 전달받은 Model 데이터와 View 정보를 다시 DispatcherServlet에게 전달합니다.
(8) DispatcherServlet은 전달 받은 View 정보를 다시 ViewResolver에게 전달해서 View 검색을 요청합니다.
(9) ViewResolver는 View 정보에 해당하는 View를 찾아서 View를 다시 리턴해줍니다.
(10) DispatcherServlet은 ViewResolver로부터 전달 받은 View 객체를 통해 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청합니다.
(11) View는 응답 데이터를 생성해서 다시 DispatcherServlet에게 전달합니다.
(12) DispatcherServlet은 View로부터 전달 받은 응답 데이터를 최종적으로 클라이언트에게 전달합니다.
DispatcherServlet이 굉장히 바빠보이지만 실제로 요청에 대한 처리는 다른 구성 요소들에게 위임(Delegate)하고 있습니다.
마치 “HandlerMapping(핸들러매핑)아 Handler Controller 좀 찾아줄래? → ViewResolver(뷰리졸버)야 View 좀 찾아줄래? → View야 Model 데이터를 합쳐서 컨텐츠 좀 만들어 줄래?” 라고 하는것과 같습니다.
이처럼 DispatcherServlet이 애플리케이션의 가장 앞단에 배치되어 다른 구성요소들과 상호작용하면서 클라이언트의 요청을 처리하는 패턴을 Front Controller Pattern이라고 합니다.