Spring MVC
Spring MVC란 웹 애플리케이션 개발을 위한 MVC 패턴 기반의 웹 프레임워크이다.
애플리케이션의 구성 요소를 Model, View, Controller로 분리한다.
Model
데이터 관리 및 비지니스 로직을 처리하는 부분이다.
요청에 의한 로직만 처리하고 이 결과를 어디에, 어떻게 사용하는지는 상관하지 않는다.
뷰나 컨트롤러에 대한 어떠한 정보도 알면 안된다. 데이터의 변경이 일어났을때 뷰를 참조하는 내부속성값을 가지면 안된다는 것이다.
ex) DAO, DTO, Service
@Service를 통해 스프링 컨테이너에 등록된 객체는 Model에 해당된다.
View
비지니스 로직의 처리 결과를 통해 사용자 인터페이스가 표현되는 구간이다.
Model을 통해 전달받은 데이터가 어떤 데이터인지 상관하지 않는다.
뷰 또한 컨트롤러의 구성요소를 알면 안된다. 데이터를 받으면 화면에 표시해주는 역할만 가진다고 생각하면 된다.
html, jsp 등 화면을 구성하기도 하고, Rest API로 서버가 구현된다면 json 응답으로 구성되기도 한다.
Controller
클라이언트의 요청을 처리하여 모델과 뷰를 업데이트 한다.
Model과 View를 연결해주는 통신 매체 역할을 한다.
즉 데이터와 사용자 인터페이스 요소들을 잇는 다리역할을 한다.
모델이나 뷰는 서로의 존재를 모르며, 변경을 외부로 알리고 수신하는 방법만 가지고 있지만 이를 컨트롤러가 중재하기 위해 모델과 그에 관련된 뷰에 대해서 알아야 한다.
[사용자 요청 -> Controller -> Model -> View]
@Controller를 통해 스프링 컨테이너에 등록된 객체는 Controller에 해당된다.
MVC 동작 과정
- 클라이언트가 url을 요청하면, 웹 브라우저에서 스프링으로 request가 보내진다.
- Dispatcher Servlet이 request를 받으면, Handler Mapping을 통해 해당 url을 담당하는 Controller을 탐색한다.
- 찾아낸 Controller로 request를 보내주고, 보내주기 위한 Model을 구성한다.
- Model 에서는 페이지 처리에 필요한 정보들을 Database에 접근하여 쿼리문을 통해 가져온다.
- 데이터를 통해 얻은 Model 정보를 Controller에게 response해주면, Controller는 view name을 Dispatcher Servlet에게 전달한다.
- Dispatcher Servlet은 Controller에게 받은 view name을 viewResolver에게 넘긴다.
- ViewResolver는 view 객체를 찾아서 DispatcherServlet에게 응답한다.
- DispatcherServlet은 view 객체에 화면 표시를 의뢰한다.
- view 객체는 해당하는 view를 호출하며, view는 Model 객체에서 화면 표시에 필요한 객체를 가져와 화면 표시를 처리한다.
- 완성된 view 파일을 클라이언트에게 response해서 화면에 출력한다.
MVC의 구성 요소
Dispatcher Servlet
모든 request를 처리하는 중심 컨트롤러다. 서블릿 컨테이너에서 모든 HTTP 요청을 받아들여서 제일 앞단에서 다른 객체들 사이의 흐름을 제어한다.
Handler Mapping
클라이언트의 request url을 어떤 컨트롤러가 처리해야 할 지 찾아서 Dispatcher Servlet에게 전달해준다.
컨트롤러 상에서 url을 매핑시키기 위해 @RequestMapping을 사용하는데, 이를 찾아주는 역할을 한다.
Controller
실질적인 요청을 처리하는 곳이다. 모델의 처리 결과를 담아 Dispatcher Servlet에게 반환해준다.
View Resolver
view name을 바탕으로 컨트롤러의 처리 결과를 만들 view를 결정해주는 역할을 담당한다.
참고
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Web/Spring/Spring%20MVC.md
'BACK > SPRING' 카테고리의 다른 글
[Spring] DI / IoC, 컨테이너, 의존성 주입 방법 (0) | 2023.01.09 |
---|---|
[Spring] Spring AOP란 (1) | 2023.01.02 |
[Spring Boot] Cannot resolve symbol 'EnableWebSecurity' 에러 해결 방법 (0) | 2022.12.23 |
[Spring Boot] Gradle 환경에 Swagger 적용하기 (0) | 2022.12.18 |
Spring Boot Project(1) - 프로젝트 개요 (0) | 2022.12.15 |