Spring MVC구조와 동작과정을 살펴보도록 하겠습니다.
애플리케이션의 정보(데이터)
모든 데이터 정보를 가공하여 가지고 있는 컴포넌트
(View에 출력할 데이터를 담아둔다.)
Model은 사용자가 편집하고자 하는 모든 데이터를 가지고 있어야 하지만 *View나 Controller에 대해서는 어떤 정보도 알 수 없어야한다..
의존하지 않아야한다 라는 말을 자주 들었는데 이는
Model 내부에 Controller와 View에 관련한 코드가 있으면 안된다.
라는 의미로 보면 된다.
시작적 UI 요소
View는 Model에 담긴 데이터를 사용해 화면을 그리는 데만 집중한다.
그래서 Model이 가지고 있는 데이터를 따로 저장하면 안된다.
View는 Model에만 의존해야하고, Controller에는 의존하면 안된다.
View가 Model로부터 데이터를 받을 때에는 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다.
Model과 View를 연결해주는 역할로 요청을 받아 파라미터를 검증하고 비즈니스 로직을 실행한다.
또한, View에 전달할 결과 데이터를 조회해서 Model에 담는다.
구현 시 Controller 자체에 비즈니스 로직을 두기보단 Service 계층을 별도로 만들어 처리한다. (컨트롤러는 이 서비스를 호출해 비즈니스 로직을 실행)
Model 또는 View에 대한 정보를 알아야한다.
View가 Model로부터 데이터를 받을 때, 반드시 Controller에서 받아야 한다.
Request : 클라이언트가 URL을 통해 서버에 어떤 요청을 하게되면
Dispatcher Servlet
이라는 front Controller가 그 요청을 받는다.
Dispatcher Servlet
은 요청된 URL을 Handler Mapping
객체에 넘긴다.
[choose Handler] : Handler Mapping
은 해당 요청을 매핑한 Controller가 있는지 검색하고 있으면 호출해야하는 Controller의 메소드(Handler) 정보를 다시 Dispatcher Servlet에게 반환한다.
Dispatcher Servlet
은 Handler Adapter
객체를 호출한다.
Handler Adapter
객체는 Handler(Controller의 메소드)를 직접 실행한다.
자세히는 HandlerMapping은 DispatcherServlet로부터 전달받은 URL을 바탕으로 HandlerAdapter 객체를 포함하는 HandlerExecutionChain 객체를 생성하고, 이후 DispatcherServlet이 HandlerExecutionChain 객체로부터 HandlerAdapter 객체를 가져와서 해당 메소드를 실행하게 되는 것
[Execute Business Logic] : Controller
의 메소드는 Service, DAO, DB를 거쳐 해당 비즈니스 로직을 수행하고
[Set Processing Result Models] : 그 결과를 바탕으로 View에 전달할 객체를 Model에 저장
Handler Adapter
에게는 이동해야할 View의 논리적인 이름만 돌려준다.(역할 끝) Handler Adapter
는 View Name을 받고 Dispatcher Servlet
에게 전달한다.
Dispatcheer Servlet
은 View Resolver
에게 View Name을 전달하고, 해당 View 객체를 얻는다.
DispatcherServlet
은 View
객체에 화면 표시를 의뢰한다.
View
객체는 해당하는 뷰(ex. JSP, Thymeleaf)를 호출하며, Model 객체에서 화면 표시에 필요한 객체를 가져와 화면 표시를 처리한다.출처
https://velog.io/@matcha_/Spring-Spring-MVC-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC
https://velog.io/@matcha_/Spring-Spring-MVC-동작-원리
https://starkying.tistory.com/entry/Spring-MVC-동작원리-구성요소