Spring MVC란?
어플리케이션의 확장을 위해 Model, View, Controller 세가지 영역으로 분리한 것으로, 컴포넌트의 변경이 다른 영역 컴포넌트에 영향을 미치치 않아 유지보수에 용이하다. 또한, 컴포넌트간의 결합성이 낮아 프로그램 수정이 용이하다.
Model
: 로직(Business & DB)을 처리하기 위한 모든 것으로 Cotroller로 부터 넘어온 data를 이용하여 이를 수행후 그에 대한 결과를 다시 controller에 리턴한다. (Dao, Service)View
: 모든 화면 처리를 담당한다. Client의 요청에 대한 결과뿐 아니라 controller에 요청을 보내는 화면단도 jsp에서 처리한다. 결과 출력을 위한 코드만 존재한다. (JSP)Controller
: Client의 요청을 분석하여 로직처리를 위한 Model을 호출한다. 리턴 받은 결과 data를 필요에 따라 request, session에 저장하고 redirect 또는 forward 방식으로 jsp page(view)를 이용하여 출력한다. (Servlet)
Spring MVC의 구성요소
구성요소 | 설명 |
DispatcherServlet (Front Controller) |
모든 클라이언트의 요청을 전달받는다. Controller에게 클라이언트의 요청을 전달하고 Controller가 리턴한 결과값을 View에게 전달하여 응답을 생성 |
HandlerMapping | 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정 DispatcherServlet은 하나 이상의 핸들러 매칭을 가질 수 있음 |
Controller | 클라이언트의 요청을 처리 후 Model을 호출, 결과를 DispatcherServlet에 리턴 |
ModelAndView | Controller가 처리한 데이터 및 화면에 대한 정보를 보유한 객체 |
ViewResolver | Controller가 리턴한 뷰 이름을 기반으로 Controller의 처리 결과를 보여줄 View를 결정 |
View | Controller의 처리 결과를 보여줄 응답화면을 생성 |
Spring MVC에서 HTTP 요청의 흐름
Spring MVC에서는 Front Controller(=DispatcherServlet)
패턴을 적용한다. DispatcherServlet이 어떻게 요청을 매핑하고 MVC 패턴을 적용할까?
- 요청이 들어온다.
Handler Mapping
을 통해 매핑할 핸들러를 찾는다. (실행할 컨트롤러)- 찾아낸 핸들러를 실행시킬 수 있는
Handler Adapter
를 찾는다. - Handler Adapter를 실행시킨다. (여기서 컨트롤러가 실행되어 서비스 로직이 돌아간다)
- 결과값으로 나온
Model
이 생성되고, 선택한View
의 이름을 반환한다. - 반환값의 View 이름을 가지고
View Resolver
에서 해당 View 오브젝트를 찾아 Model과 데이터 바인딩 시킨다. - 최종적으로 완성된 View를
DispatcherServlet
이 반환한다.
ViewResolver에 따라 JSP나 Thymeleaf와 같은 템플릿 엔진을 선택할 수 있다.
default 뷰 리졸버는 InternalResourceViewResolver
로 JSP
를 뷰로 사용한다. Thymeleaf를 사용하고 싶다면 뷰 리졸버에 ThymeleaftViewResolver를 추가해주면 된다.
Rest API에서 반환되는 json은 어떻게 만들어지는 것일까?
CSR이 등장하며 요즘 스프링은 Rest API 형태로 많이 사용된다. Rest API에서 반환되는 json은 HandlerAdapter에서 뷰 리졸버가 아닌 MessageConverter
가 동작한다.
https://velog.io/@jihun333/SpringSpring-MVC-요청-흐름
https://java-is-happy-things.tistory.com/40
https://hanjo8813.github.io/spring/4/
'Backend > Spring' 카테고리의 다른 글
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #7 AOP (0) | 2024.06.16 |
---|---|
[Spring] 스프링 입문 - 코드로 배우는 스프링 부트 #6 스프링 DB 접근 기술 (0) | 2024.06.16 |
[Spring] Spring AOP란? Spring AOP는 CTW, PCW, LTW, RTW 중에 무엇일까? (1) | 2024.01.03 |
[Spring] 리플렉션(Reflaction)이란? 생성자 주입은 빈 생성때의 리플렉션 외에 추가적인 리플렉션을 진행하는가? (0) | 2024.01.02 |
[Spring] 의존성 주입(Dependency Injection) 4가지 방법 (0) | 2023.12.29 |