본문 바로가기
Web/Spring

[Spring] Spring의 MVC

by 희조당 2022. 9. 14.
728x90

✍️ 학습 목표

  • MVC 패턴 이해하기
  • Spring의 MVC

📌 MVC 패턴

스프링은 MVC 패턴을 준수하는 프레임워크이다. 

따라서, 스프링의 MVC 패턴을 이해하기 위해서는 먼저 MVC 패턴이 무엇인지 알아야한다.

MVC (Model - View - Controller) 패턴은 소프트웨어 공학에서 사용되는 디자인 패턴이다.

이렇게 각자의 규칙과 역할을 가진 3개의 컴포넌트로 구성된 패턴을 MVC 패턴이라고 한다.

✔️ 모델, Model

애플리케이션의 정보, 데이터, DB 등을 담당하는 컴포넌트이다.

다음과 같은 규칙을 가진다.

  • User가 원하는 모든 데이터를 가지고 있어야한다. 
  • View와 Controller에 대한 어떠한 정보도 알지 말아야한다.
  • 변경이 발생하면 변경사항을 처리(수정, 전달 등) 할 수 있어야한다.

✔️ 뷰, View

유저에게 보이는 화면을 담당하는 컴포넌트이다. Model로부터 받은 정보를 토대로 화면에 출력한다.

다음과 같은 규칙을 가진다.

  • Model이 가지고 있는 정보를 따로 저장하면 안된다.
  • Model과 Controller에 대해서 몰라야 된다.
  • 변경이 발생하면 변경사항을 전달 할 수 있어야한다.

✔️ 컨트롤러, Controller

Model과 View를 이어주고 발생하는 이벤트를 처리하는 컴포넌트이다.

다음과 같은 규칙을 가진다.

  • Model과 View를 알아야 한다.
  • Model과 View의 변경을 감시하고 있어야한다.

✔️ 왜 MVC패턴을 사용할까?

뷰, 모델, 컨트롤러 이 3가지 컴포넌트를 자세히 들여다보면 각각 맡은 역할에 집중할 수 있는 구조로 되어있다.

주방의 모든 구성원이 같이 재료 손질을 하고, 설거지를 하고, 요리를 한다면 동선이 꼬이는 등 다양한 문제가 발생한다.

하지만 역할을 나눠 작업한다면 훨씬 효율적으로 처리할 수 있다.

MVC 패턴도 동일하다. 서로 분리되어 각자의 역할에 집중할 수 있기 때문에 생산성, 유지보수 등 다양한 이점 생긴다.


📌 Spring MVC 패턴

MVC 패턴을 준수하는 스프링 프레임워크는 다음 그림과 같은 흐름으로 작동한다.

Spring MVC Pattern

여기서 핵심은 FrontController 패턴으로 구현된 DispatcherServlet이다.

✔️ FrontController 패턴

각 컨트롤러의 헤드가 되는 Front Controller를 추가하는 패턴이다.

Front Controller는 각 컨트롤러들의 공통 코드를 처리하고 User의 요청에 맞는 컨트롤러를 찾아서 호출한다.

✔️ Spring MVC의 구성요소

  • DispatcherServelt : 받은 요청과 결과를 올바른 객체에 전달해준다. 
  • Handler Mapping : 요청에 맞는 Controller를 매핑한다.
  • Handler Adapter : 요청을 처리할 Controller를 실행시킨다. 컨트롤러 구현은 3가지 방법(Controller Annotation, Controller Interface, HttpRequestHandler Interface)이 있는데, 구현 방법에 구애받지 않기 위해서 Adapter가 존재한다.
  • Controller : 받은 요청을 처리한 뒤 DispatcherServlet에 리턴한다.
  • ModelAndView : Controller가 처리한 결과와 View 선택에 필요한 정보를 가진 객체이다.
  • ViewResolver : 처리한 결과를 넘겨받을 View를 선택한다.
  • View : 넘겨받은 결과를 화면에 출력한다.

'Web > Spring' 카테고리의 다른 글

[Spring] AOP (feat. Proxy Pattern)  (0) 2022.09.21
[Spring] Servlet, 서블릿  (0) 2022.09.15
[Spring] Spring의 DB 접근 기술  (0) 2022.08.23
[Spring] Spring의 핵심 : IoC, DI (23.05.16 updated)  (0) 2022.08.23
[Spring] Spring vs Spring Boot (2)  (0) 2022.08.23

댓글