Free Lines Arrow
본문 바로가기
Spring/spring framework 구현 스터디

[Spring] Spring MVC 전체 구조

by skahn1215 2021. 11. 1.
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 

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

댓글