Spring/Spring Boot

[Spring MVC] 02. Spring MVC

생각없이 해도 생각보다 좋다. 2022. 10. 22. 12:00

Spring MVC
>Spring MVC
Spring MVC는 Spring의 여러 모듈 중 웹 계층을 담당하는 모듈 중 하나이다. 정확한 모듈명은 spring-webmvc인데 줄여서 Spring MVC라고 하는 것이다. 그리고 웹 프레임워크의 한 종류라는 이유로 Spring MVC 프레임워크라고도 부른다.
Spring MVC는 Servlet API 기반으로 클라이언트의 요청을 처리한다.Servlet이란 클라이언트의 요청을 처리하기 위해 java 코드로 작성된 클래스 파일이고, 이를 담고있는 컨테이너를 Servlet Container라고 하며 기본적으로 Apache Tomcat이 사용된다. 쉽게 그냥 Sevlet이라는 웹 서버 프로그래밍을 하기 위한 사양을 갖춘 자바 코드를 기반으로 Spring MVC를 사용한다고 생각하면 좋다.
Spring MVC의 M은 Model, V는 View, C는 Controller를 의미한다. 각각을 가볍게 알아보자.
>Model
Model은 한마디로 작업의 결과물이다.
Spring MVC 기반의 웹 애플리케이션에서 클라이언트의 요청을 전달받고 이를 처리하여 만들어낸 데이터를 Model이라고 한다.
>View
View는 애플리케이션 화면에 보여줘야할 것들의 정보(리소스)를 제공한다.
Model이라는 데이터에는 애플리케이션 화면에 무엇을 어떻게 보여줘야한다는 데이터가 포함되어 있다. 그런데 Model 데이터는 제품으로 치면 원재료들이다. 제품을 기대한 애플리케이션은 원재료에 당황할 수 밖에 없다. 그래서 View라는 공장이 중간에서 원재료를 받아다가 물건을 만들어서 애플리케이션에 전달한다.
View는 물건을 아예 완제품으로 만들어 줄 수도 있고, 각 부품들로만 만들어서 애플리케이션이 직접 조립해서 만드는 DIY 제품을 전달할 수도 있다. 완제품을 만들어 주는 것을 SSR(서버 사이드 렌더링)이라고 하며 HTML 문서를 만들어 제공하는 것이고, DIY 부품을 제공하는 것은 CSR(클라이언트 사이드 렌더링)이라고 하며 XML, JSON 등의 클라이언트에서 조립할 수 있는 특정 형식의 포맷으로 제공하는 것이다.
JSON을 기억하자
>Controller
Controller는 클라이언트의 요청을 직접적으로 전달 받는 엔드포인트이다.
Controller는 대리점의 같은 친구이다. 애플리케이션이라는 손님은 대리점에 가서 물건을 주문한다. 주문을 받은 Controller는 Model에게 주문받은 제품의 원재료를 부탁한다. 그리고 Model에게 받은 원재료를 View에게 전달하며 어떤 형식으로 제품을 만들지 부탁하고 직접 배송까지 해달라고 요청한다.
즉, Controller는 손님의 요청을 직접받는 시작점이고, Model과 Veiw와 상호 작용하는 매개체 역할을 한다.

Spring MVC의 동작 방식과 구성 요소
위에서 얘기했던 MVC의 동작 방식을 좀 더 세밀하게 살펴보자.
세밀하게 볼 때는 위에서 했던 대리점, 공장 얘기는 적절한 비유가 아니게 될 수 있다...
<그림 참고>
1. 클라이언트의 요청(URL)을 DispatcherServlet이라는 클래스가 전달받는다.
2. DispatcherServlet 클래스는 클라이언트 요청을 처리할 적합한 Controller를 찾아달라고 Handler Mapping 인터페이스에게 요청한다.
3. Handler Mapping 인터페이스는 일에  적합한 Controller를 Spring Bean중에서 찾고, 찾은 Handler 객체를 다시 DispatcherServlet 클래스에게 전달한다.
4. DispatcherServlet 클래스는 조금 게을러서(?) 사용할 Controller(Handler 객체)의 어떤 메소드를 써야할 지도 남에게  부탁한다. 이 역할을 HandlerAdapter가 한다.
5. HandlerAdapter는 DispatcherServlet에게 전달받은 Controller의 정보를 바탕으로 Controller의 요청을 처리할 수 있는 메서드(Handler 메서드)를 호출한다.
6. Controller가 Handler 메서드를 사용하여 요청을 처리하고 Model 데이터를 만들고 Model 데이터를 사용할 View에 대한 정보를 같이 보관한다. 그리고 만든 데이터를 HandlerAdapter에게 전달한다.
7. HandlerAdapter는 전달받은 View 정보와 Model 데이터를 DispatcherServlet에게 넘긴다.
8. DispatcherServlet은 View 정보를 바탕으로 일을 처리할 View를 찾아달라고 ViewResolver에게 부탁한다.
9. ViewResolver는 View 정보를 바탕으로 해당되는 View 찾아 DispatcherServlet에게 전달한다.
10. DispatcherServlet는 View에게 Model 데이터를 가공하라고 부탁한다.
11. View는 Model 데이터를 클라이언트가 사용할 수 있는 Response 데이터로 가공하고 DispatcherServlet에게 전달한다.
12. DispatcherServlet는 response 데이터를 클라이언트에게 제공한다.

DispatchseServlet
DispatchseServletsms 클라이언트와 직접 접촉할 수 있는 맨 앞에 위치하고, 다른 구성요소에게 요청과 응답을 받으면 상호작용한다.
이런 방식을 Front Controller Pattern이라고 한다.
모든 요청을 하나의 Controller를 통해 수행하기 때문에 추적 및 보안을 적용할 때 용이하다.