[Spring] Spring MVC 구조 2

김용현·2023년 9월 26일
0

Spring

목록 보기
3/13

본 글은 김영한 님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 강의를 토대로 작성하였습니다.


이전 글에서 다음과 같은 Spring MVC 구조에 대해 클라이언트 요청이 들어온 상황을 중심으로 알아보았다. 이번에는 실제로 Spring에서 어떤 클래스들이 호출되어 실제로 일을 수행하는지 알아보고자 한다.

핸들러 매핑, 어댑터

먼저 내가 등록한 컨트롤러가 호출되려면 그림과 같이 핸들러 매핑핸들러 어댑터를 찾고 실행해야 한다. 매핑과 어댑터를 호출하여 찾는 순서는 다음과 같다.

HandlerMapping

  1. RequestMappingHandlerMapping
    -> 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
  2. BeanNameUrlHandlerMapping
    -> 스프링 빈의 이름으로 핸들러를 찾는다.

HandlerAdapter

  1. RequestMappingHandlerAdapter
    -> 어노테이션 기반의 컨트롤러인 @RequestMapping에서 사용
  2. HttpRequestHandlerAdapter
    -> HttpRequesthandler 처리
  3. SimpleControllerHandlerAdapter
    -> Controller 인터페이스(어노테이션 X, 과거에 사용)

현재는 우선순위가 가장 높은 RequestMappingHandlerMapping, RequestMappingHandlerAdapter가 사용되는 어노테이션 기반으로 대부분 작성하기 때문에 나머지는 잘 사용하지는 않는다.


위 그림과 같이 @Controller, @RequestMapping이 붙은 클래스를 찾아서 반환하는 것을 볼 수 있다.

❗️어노테이션으로 컨트롤러를 인식하게 하려면 @Controller, 혹은 @RequestMapping 어노테이션을 클래스 레벨에 붙여줬어야 했다. 하지만 스프링 부트3.0(스프링 프레임워크 6.0)이상부터 더 이상 @RequestMapping은 붙여도 해당 클래스를 컨트롤러로 인식하지 않고. 오직 @Controller만 인식하도록 바뀌었다고 한다.

뷰 리졸버(ViewResolver)

스프링 부트에서 자동으로 등록하는 뷰 리졸버의 우선 순위는 다음과 같다.
(실제로는 더 많지만 일부 생략)
1. BeanNameViewResolver
-> 빈 이름으로 뷰를 찾아서 반환한다(예: 엑셀 파일 생성)

  1. InternalResourceViewResolver
    -> JSP를 처리할 수 있는 뷰를 반환한다.

다음과 같이 프로퍼티에 등록해놓은 prefix와 suffix 정보를 가져와 view 파일을 만드는데 사용하는 것을 볼 수 있다.

마지막 줄에 보면 forward 하는 것을 볼 수 있다.
다시 말해 InternalResourceViewResolver는 InternalResourceView를 반환하고 여기서 jsp 파일을 forward한다.

따라서 뷰 리졸버 관련 순서를 정리하면
1. 핸들러 어댑터를 통해 new-form이라는 논리 뷰 이름을 획득한다.
2. new-form이라는 뷰 이름으로 viewResolver를 순서대로 호출한다.
3. BeanNameViewResolver는 new-form이라는 이름의 스프링 빈으로 등록된 뷰를 찾아야 하는데 없다.
4. InternalResourceViewResolver가 호출된다.
5. 이 뷰리졸버가 InternalResourceView를 반환하고 forward를 통해 jsp를 실행한다.

향후에 사용할 타임리프 같은 것들도 전용 뷰 리졸버가 다 등록이 된다. 따라서 타임리프로 뷰 템플릿을 만들면 해당 뷰 리졸버(ThymeleafViewResolver)를 찾아서 적용해준다(라이브러리만 추가하면 스프링 부트가! 알아서!)

profile
평생 여행 다니는게 꿈 💭 👊 😁 🏋️‍♀️ 🦦 🔥

0개의 댓글

관련 채용 정보