728x90
반응형
Spring MVC 전체 구조를 알아보자
- 해당글은 좀 길다 이유는 따로따로 정리하려고 했지만
- 보는 사람들이 한번에 쭉 보는게 편할것 같다고 생각을 했다.
- 앞서 봤던 그림이다.
- 지금까지 개선해 오면서 아래와 같이 구현을 하였다.
직접만든 프레임워크와 스프링의 차이
직접만든 컨테이너 | 스프링 MVC |
FrontCOntroller | DIspatcherServlet |
handlerMappingMap | HandlerMapping |
MyHandlerAdapter | HandlerAdapter |
ModelVIew | ModelAndView |
viewResolver | VIewResolver |
MyView | View |
인터페이스 살펴보기
- 스프링 MVC 강점은 DispatcherServelt 코드의 변경 없이
원하는 기능을 변경하거나 확장할수 있다는 점이다.
주요 인터페이스 목록
- 핸들러 매핑
- 핸들러 어댑터
- 뷰리졸버
- 뷰
핸들러 매핑 과 핸들러 어댑터
- 주요인터페이스 목록중 두가지를 알아본다.
- 컨트롤러가 실행되기 위해선 두가지가 필요하다.
- 핸들러 매핑: 스프링빈의 이름으로 핸들러를 찾을수 있는 매핑
- 핸들러 어댑터: 핸들러 매핑을 통해서 찾은 핸들러를 실행할수 있는 핸들러 어댑터가 필요하다. - 스프링부트가 자동으로 등록하는 핸들러 매핑과 핸들러 어댑터
핸들러 매핑과 핸들러 어댑터 종류
- 아래 핸들러 매핑과 어댑터는 스프링부트가 자동으로 등록해준다.
HandlerMapping
0 = RequestMappingHandlerMapping : 애노테이션 기반의 컨트롤러인 @RrequestMapping 에서 사용
1 = BeanNameUrlHandlerMapping : 스프링 빈의 이름으로 핸들러를 찾는다.
HandlerAdapter
0 = RequestMappingHandlerAdapter : 애노테이션 기반의 컨트롤러인 @RequestMapping 에서 사용
1 = HttpRequestHandlerAdapter : HttpRequestHandler 처리
2 = SimpleControllerHandlerAdapter : Controller 인터페이스(애노테이션X, 과거에 사용)
Controller 예제
- 해당 컨틀로러는 @Component로 지정을 주었다.
// 빈이름 등록
@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController handleRequest");
return null;
}
}
Controller 가 실행되는 과정
1. 핸들러 매핑으로 핸들러를 조회한다.
- 1.1 HandlerMapping 을 순서대로 실행후 핸들러를 찾는다.
- 1.2 지금의 컨트롤러는 SimpleControllerHandlerAdapter가 Controller 인터페이스를 지원하므로 대상이된다.
2. 핸들러 어댑터 조회
- 2.1 HandlerAdapter의 supports 를 순서대로 호출한다.
- 2.2 SimpleContrellerHandlerAdapter가 Controller 인터페이스를 지원하므로 대상이 된다.
3. 핸들러 어댑터 실행
- 3.1 디스패처 서블릿이 조회한 SimpleControllerHandlerAdapter 를 실행하면서 핸들러 정보도 함께 넘겨준다.
- 3.2 SimpleControllerHandlerAdpater는 핸들러인 OdlController를 내부에서 실행하고, 그 결과를 반환한다.
요약
- 해당 컨트롤러에 필요한 객체는 다음과 같다.
- HandlerMapping = BeanNameUrlHandlerMapping
- HandlerAdapter = SimpleControllerHandlerAdapter
뷰 리졸버
뷰 리졸버를 분석해보자.
Controller 예제
- 아까와 다른 점은 ModelAndView 를 리턴해준다.
- view 를 사용하게 해준다. - 하지만 페이지를 찾지 못하는 에러가 발생한다.
@Component("/springmvc/old-controller")
public class OldController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("OldController handleRequest");
return new ModelAndView("new-form");
}
}
application.properties 에 다음코드를 적어준다.
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
뷰리졸버 InternerResourceViewResolver
- 스프링 부트는 InternerResourceViewResolver 라는 뷰 리졸버를 자동으로 등록한다.
- 등록시 applications.properties에 등록한 spring.mvc.prefix, spring.mvc.suffix 설정정보를 사용한다
@Bean
InternalResourceViewResolver internalResourceViewResolver() {
return new InternalResourceViewResolver("/WEB-INF/views", ".jsp");
}
뷰 리졸버 가 수행되는 과정
1. 핸들러 어댑터 호출
- 핸들러 어댑터를 통해 new-form이라는 논리뷰 이름을 획득한다.
2. ViewResolver 호출
- new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
- BeanNameViewResolver 는 new-form 이라는 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.
- InternalResourceView가 호출된다.
3. InternalResourceViewResolver
- 이뷰리졸버는 InternalResourceView를 반환한다.
4. 뷰 InternalResourceView
- InternalResourceView는 JSP 처럼 포워드 foward()를 호출해서 처리할 수 있는 경우에 사용한다.
5. view.render()
- view.render() 가 호출되고 InternalResourceView는 forward()를 사용해서 JSP를 실행한다.
알아둬야 할것
- 다른 뷰는 실제 뷰를 렌더링 하지만 JSP 경우 foward() 를 통해서 JSP 이동해야 렌더링이 된다.
- JSP를 제외한 나머지 뷰 템플릿들은 foward()과정 없이 바로 렌더링 된다.
- Thymelead 뷰 템플릿을 사용하면 ThymleafViewResolver를 등록해야 한다.
참고
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/lecture/71203?tab=note
728x90
반응형
'Spring > spring framework 구현 스터디' 카테고리의 다른 글
[Spring] 프론트 컨트롤러 7 : 정리 (0) | 2021.10.30 |
---|---|
[Spring] 프론트 컨트롤러 6 : 어댑터 추가 (0) | 2021.10.30 |
[Spring] 프론트 컨트롤러 5 : 어댑터 적용 (0) | 2021.10.30 |
[Spring] 프론트 컨트롤러 4 : 개선편 (0) | 2021.10.26 |
[Spring] 프론트 컨트롤러 3 : 종속성제거, 뷰리졸버 구현 (0) | 2021.10.23 |
댓글