♪ 학습 내용
스프링 MVC의 전체 구조 이해
* 스프링 MVC 구조
스프링 MVC의 전체 구조는 다음과 같다
앞서 개발해온 MVC 프레임워크와 구조가 매우 유사한 것을 확인했다.
요청이 들어오면 핸들러 매핑에서 돌면서 핸들러를 찾고,
핸들러 어댑터 목록에서 돌면서 핸들러를 처리가능한 어댑터를 찾는다.
어댑터를 통해 핸들러 실행되고, ModelAndView 반환되고
논리 이름으로 뷰 리졸버 --> 실제 뷰 반환
렌더 호출해서 뷰 렌더링 된다.
스프링 MVC의 프론트 컨트롤러이자 핵심이 바로 DispacherServlet.
DispacherServlet은 부모 클래스에서 HttpServlet을 상속 받는다.
스프링 부트는 내장 톰켓을 띄우면서 이 DispacherServlet을 바로 서블릿으로 등록한다.
urlPatterns = "/" , 즉 모든 경로에 대해 매핑된다 ( = 우선순위는 꼴찌)
스프링 MVC는 ViewResolver나 View 등을 전부 인터페이스화 시켜
프론트 컨트롤러인 DispacherServlet의 코드를 변경하지 않고 확장 가능!
* 핸들러 매핑과 핸들러 어댑터
컨트롤러가 호출되려면 다음 두가지가 필요하다
1. 컨트롤러를 찾을 핸들러 매핑
2. 컨트롤러를 실행할 핸들러 어댑터
스프링은 필요한 핸들러 매핑과 핸들러 어댑터를 다음과 같이 대부분 구현해두었다.
스프링에서 현재 많이 사용하는 방식인 @RequestMapping 을 지원하는
RequestMappingHandlerMapping 과 RequestMappingHandlerAdapter가 우선순위 1등인 것을 확인 가능
일단 과거에 주로 사용한 방식으로 컨트롤러를 구현해보았다.
ex)
우선 HandlerMapping을 순서대로 실행하여 핸들러를 찾는다.
여기서는 @RequestMapping을 사용하지 않고 url경로를 직접 빈 이름으로 등록하였기 때무에RequestMappingHandlerMapping 이 아닌, BeanNameUrlHandlerMapping에서 실행 성공하게 된다.
url 경로와 같은 스프링 빈 이름을 가진 핸들러(OldController)를 찾아 반환.
그리고 이 핸드러를 실행하기 위해 HandlerAdapter에서 차례대로 supports()를 호출한다.
( 앞에 MVC 프레임 워크 만들면서 개발한 그런 supports() )
SimpleControllerHandlerAdapter가 Controller 인터페이스와 호환하므로
SimpleControllerHandlerAdapter를 통해 컨트롤러 실행, 결과(ModelAndView 로) 반환
여기서 사용된 객체는 다음과 같다.
HandlerMapping = BeanNameUrlHandlerMapping
HandlerAdapter = SimpleControllerHandlerAdapter
만약 다른 방식으로 컨트롤러를 구현했다면 ? 그에 맞는 다른 객체가 사용됐을 것이다.
* ViewResolver
스프링 부트는 application.properties에 등록된 다음 설정 정보를 사용해서 뷰 리졸버를 자동으로 등록한다 !!
딱 봐도 뷰 리졸버에 논리 이름을 넣어주면 위 정보를 통해
" /WEB-INF/views/논리이름.jsp " 물리 경로를 만든다는 것을 알 수 있었다.
스프링 부트가 자동으로 등록하는 뷰 리졸버들도 HandlerMapping 과 마찬가지로 다음과 같이 있다.
ex)
핸들러 어댑터가 이 컨트롤러를 실행해 new-form이라는 논리 이름을 획득하고,
new-form 으로 viewResolver를 차례대로 호출 !
new-form 이라는 스프링 빈 이름으로 등록된 뷰가 없기 때문에 InternalResourceViewResolver 호출.
호출하면 또 다른 view객체가 반환되며 render() 호출, forward()를 사용해 JSP 실행..!
♪ 다음 학습 내용
스프링 MVC 시작
'Dev > Spring' 카테고리의 다른 글
[Spring MVC 1] 스프링 MVC-기능 (1) (0) | 2023.02.01 |
---|---|
[Spring MVC 1] 스프링 MVC-구조 (2) (0) | 2023.01.31 |
[Spring MVC 1] MVC 프레임워크 만들기 (3) (0) | 2023.01.28 |
[Spring MVC 1] MVC 프레임워크 만들기 (2) (0) | 2023.01.27 |
[Spring MVC 1] MVC 프레임워크 만들기 (1) (0) | 2023.01.25 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!