본문 바로가기

Spring

MVC패턴과 동작방식

MVC의 각 컴포넌트의 역할

Controller(컨트롤러)

일종의 조정자라고 할 수 있다. 클라이언트의 요청을 받았을 때, 그 요청에 대해 실제 업무를 수행하는 모델 컴포넌트를 호출한다. 또한 클라이언트가 보낸 데이터가 있다면, 모델에 전달하기 쉽게 데이터를 가공한다. 모델이 업무를 마치면 그 결과를 뷰에게 전달한다.

 

Model (모델)

컨트롤러가 호출할 때, 요청에 맞는 역할을 수행한다. 비즈니스 로직을 구현하는 영역으로 응용프로그램에서 데이터를 처리하는 부분이다비즈니스 로직이란 업무에 필요한 데이터처리를 수행하는 응용프로그램의 일부라고 할 수 있다. DB에 연결하고 데이터를 추출하거나 저장,삭제,업데이트,변환 등의 작업을 수행한다. 상태의 변화가 있을 때 컨트롤러와 뷰에 통보해 후속 조치 명령을 받을 수 있게 한다.

 

View (뷰)

컨트롤러로부터 받은 모델의 결과값을 가지고 사용자에게 출력할 화면을 만드는 일을 한다. 만들어진 화면을 웹브라우저에 전송하여 웹브라우저가 출력하게 하는 것이다. 화면에 표시되는 부분으로 추출한 데이터나 일반적인 텍스트 데이터를 표시하거나 입력폼 또는 사용자와의 상호작용을 위한 인터페이스를 표시하는 영역이다.

 

 

 

Spring mvc 동작방식

 

 

DispatcherSevlet 은 모든 연결을 담당하며, 웹 브라우저에서 요청이 들어오면

그 요청을 처리하기 위해 HandlerMapping 객체에게 컨트롤러 검색을 요청한다. HandlerMapping은 클라이언트의 요청 경로를 이용해서 이를 처리할 컨트롤러 객체를 찾아서 DispatcherServlet 에 리턴한다.

DispatcherServlet @Controller 어노테이션을 이용해서 구현한 컨트롤러, 스프링 2.5까지 사용됐던 Controller 인터페이스를 구현한 컨트롤러, 특수 목적으로 사용되는 HttpRequestHandler 인터페이스를 구현한 클래스를 동일한 방식으로 실행하고 처리하기 위해 HandlerAdapter 객체에게 요청 처리를 위임한다.

HandlerAdapter 객체는 컨트롤러의 알맞은 메소드를 호출해서 요청을 처리하고,

반환 받은 결과를

ModelAndView 객체에 담아서 DispatcherServlet 에 리턴한다.

ModelAndView 객체를 반환 받은 DispatcherServlet ViewResolver 객체를 이용해서 결과를 보여줄 뷰를 검색한다. ViewResolver 객체는 ModelAndView 객체에 담긴 뷰 이름을 이용해서 View 객체를 찾거나 생성해서 리턴한다. ViewResolver 는 매번 새로운 View 객체를 생성해서 DispatcherServlet에 리턴한다.

DispatcherServlet ViewResolver 가 리턴한 View 객체에게 응답 결과 생성을 요청한다.

JSP를 사용하는 경우, View 객체는 JSP를 실행함으로서 브라우저에게 전송할 응답 결과를 생성한다. ModelAndView Model 객체에 담겨 있는 데이터가 응답 결과에 필요하면 Model 에서 데이터를 꺼내 JSP 에서 사용할 수 있다.

 

클라이언트의 요청을 실제로 처리하는 것은 컨트롤러이고,

DispatcherServlet 은 클라이언트의 요청을 전달 받는 창구 역할을 한다.

DispatcherServlet 에게 어떤 컨트롤러가 요청을 처리하는가는 중요하지 않으며,

처리 결과를 ModelAndView 타입의 객체로 전달 받을 수 있기만 하면 된다.

이 때, 사용할 컨트롤러를 찾고, 처리 결과를 ModelAndView 객체로 변환해 주는 객체가 HandlerAdapter 이다.

 

 

 

 

 

 

 

 

참조 블로그

asfirstalways.tistory.com/180

 

1. MVC 아키텍쳐에 대한 이해

Things 1. MVC 아키텍쳐에 대한 이해 떠도는 여러 이미지들과 책에 나온 구성도를 내 나름대로 재구성해보았다. MVC에 대한 기본 개념은 모두 동일하기 때문에 Servlet과 JSP를 기준으로 설명하여 보

asfirstalways.tistory.com

 

'Spring' 카테고리의 다른 글

@Async 사용법  (0) 2021.09.15
MapStruct 사용법  (0) 2021.09.15
Ioc/DI 제어의 역전/의존성 주입  (0) 2020.11.18