🌿With Spring

Spring MVC

코딩베이비 2022. 11. 24. 22:34

Spring MVC

Spring의 모듈 중에서 Servlet API를 기반으로 클라이언트의 요청을 처리해주는 모듈이 있다. 이 모듈의 이름이 spring-webmvc인데, 얘가 바로 spring MVC라고 불리는 프레임워크이다. 우리는 Spring MVC 웹 프레임워크가 제공해주는 기능들을 이용해서 클라이언트의 요청을 편리하게 처리해줄 수 있다.

 

MVC의 의미

M(Model)

우리가 패션 모델이라고 부르는 사람들은 패션 디자이너가 만든 옷을 관객들에게 선보인다.

이것과 비슷하게 Spring MVC에서의 Model도 같은 역할을 한다. Spring MVC 기반의 웹 애플리케이션이 클라이언트의 요청을 받으면 요청 사항을 처리하기 위한 작업을 하고, 처리한 작업의 결과 데이터를 클라이언트에게 응답으로 돌려줘야하는데, 이 때 클라이언트에게 응답으로 돌려주는 작업의 처리 결과 데이터를 Model이라고 한다.

❗참고❗
Service layer(서비스 계층) : 클라이언트의 요청 사항을 구체적으로 처리하는 영역
Business logic(비지니스 로직) : 요청 사항을 처리하기 위해 실제로 Java 코드로 구현한 것

 

 

V(View)

Spring MVC에는 다양한 View기술이 포함되어 있는데, View는 Model 데이터를 이용해서 웹 브라우저 같은 클라이언트 애플리케이션의 화면에 보여지는 Resource를 제공한다.

  • HTML 페이지 출력
    • 클라이언트 애플리케이션에 보여지는 HTML 페이지를 직접 렌더링 후 클라이언트로 보내는 방식
         →기본적인 HTML 태그로 구성된 페이지에 Model 데이터를 채워넣고, 최종적인 HTML 페이지를 만들어서 클라이언트 측으로 전송
    • Spring MVC에서 지원하는 HTML 페이지 출력 기술에는 Thymeleaf, FreeMarker, JSP+JSTL, Tiles 등이 있다.
  • PDF, Excel 등의 문서 형태로 출력
    • Model 데이터를 가공 후 문서로 클라이언트 측에 전송하는 방식
    • 문서 내에서 데이터가 동적으로 변경되어야 할 때 사용할 수 있는 방식
  • XML, JSON 등의 특정 포맷으로 변환
    • Model 데이터를 특정 프로토콜 형태로 변환 후 클라이언트 측에 전송하는 방식
    • 특정 형식의 데이터만 전송하고 프론트엔드 측에서 이 기반으로 HTML을 만드는 방식
    • front/back 영역이 확실하게 구분되므로 개발 및 유지보수가 상대적으로 용이하다.
    • 프론트엔드 측에서 비동기 클라이언트 애플리케이션을 만드는게 가능해진다.
  • JSON(JavaScrpit Object Notation)
    • 데이터를 저장/전송할 때 많이 사용되는 경량 Data 교환 형식
    • key / value 형태로 존재하고 key나 문자열은 (“ ”) 를 이용해서 표기해야 한다.

 

C(Controller)

Controller는 클라이언트 측의 요청을 직접적으로 전달받는 endpoint로써 Model과 View의 중간에서 상호작용 해주는 역할을 맡고 있다.

→ 클라이언트 측의 요청을 받아서 비지니스 로직을 거쳐 Model 데이터가 만들어지면, 이 데이터를 View로 전달해준다.

 

 

Spring MVC 동작 과정 & 구성 요소

1. 클라이언트가 요청을 전송하면 DispatcherServlet이라는 클래스로 요청이 전달된다.

 

2. DispatcherServlet은 클라이언트 요청을 처리할 Controller를 찾기 위해 HandlerMapping 인터페이스에게 검색을 요청한다(request URL을 HandlerMapping 객체에게 넘긴다).

 

3. HandlerMapping은 클라이언트의 요청과 매핑되는 Handler 객체DispatcherServlet에게 리턴한다.

 

4. 요청을 처리할 Controller 클래스를 찾고, 다음으로는 실질적으로 클라이언트의 요청을 처리할 Handler 메소드를 찾아서 호출해야하는데, Handler 메소드를 직접 호출하는 것이 아닌 HandlerAdapter에게 Handler 메소드 호출을 위임한다.

 

5. HandlerAdapter는 전달받은 Controller 정보를 기반으로 해당 ControllerHandler 메소드를 호출한다.

 

6. ControllerHandler 메소드는 비지니스 로직 처리 후 리턴 받은 Model 데이터HandlerAdapter에게 전달한다.

 

7. HandlerAdapter는 전달받은 Model 데이터+View 정보DispatcherServlet에 전달한다.

 

8. DispatcherServlet은 전달받은 View 이름을 ViewResolver에게 전달해서 View 검색을 요청한다.

 

9. ViewResolverView 이름과 매핑되는 View 정보를 찾아서 리턴해준다.

 

10. DispatcherServlet은 정보와 일치하는 View에게 Model 데이터를 넘겨주면서 클라이언트에게 전달할 응답 데이터 생성을 요청한다.

 

11. View응답 데이터를 생성해서 다시 DispatcherServlet에 리턴한다.

 

12. DispatcherServlet은 전달받은 응답 데이터를 최종적으로 클라이언트에게 전달한다.

 

➡️DispatcherServlet은 요청에 대한 처리를 직접 하는 것이 아니라 다른 구성 요소들에게 위임(Delegate)한다.

➡️DispatcherServlet이 애플리케이션 가장 앞에 배치되어 다른 구성요소들과 상호작용하며 클라이언트의 요청을 처리하는 것처럼 모든 리소스 요청을 처리해주는 하나의 컨트롤러를 두는 것을 Front Controller Pattern이라고 한다.

 

Handler

  • 클라이언트의 요청을 처리하는 처리자
  • Spring MVC에서의 Handler는 Controller 클래스이고, Controller 클래스에 있는 @GetMapping, @PostMapping 같은 애너테이션이 붙은 메소드들을 Handler 메소드라고 한다.

HandlerMapping

  • 사용자의 요청과 요청을 처리하는 Handler를 매핑해주는 역할
  • @GetMapping(”/coffee”)처럼 HTTP Request 메소드(GET, POST 등)와 Mapping URL을 기준으로 해당 Handler와 매핑이 되는데 Spring에서는 여러가지 유형의 HandlerMapping 클래스를 제공한다. 디폴트는 RequestMappingHandlerMapping이다.

HandlerAdapter

  • 다른 프레임워크의 Handler를 Spring MVC에 통합하기 위해 사용
    → Spring은 객체지향 설계 원칙을 아주 잘 따르는 유연한 구조를 가지고 있는 프레임워크이기 때문에 Spring이 제공하는 Spring MVC에서 지원하는 Handler를 사용해도 되지만 다른 프레임워크의 Handler를 Spring MVC에 통합할 수 있다.

https://taes-k.github.io/2020/02/16/servlet-container-spring-container/