김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
https://www.inflearn.com/courses?s=%EA%B9%80%EC%98%81%ED%95%9C
핸들러 매핑과 핸들러 어댑터
과거에 주로 사용했던 스프링이 제공하는 간단한 컨트롤러로 핸들러 매핑과 어댑터를 이해해보겠습니다.
위의 인터페이스를 구현한 OldController
@Component : 이 컨트롤러는 /springmvc/old-controller 라는 이름의 스프링 빈으로 등록되었습니다.
빈의 이름으로 URL을 매핑합니다.
브라우저에 http://localhost:8080/springmvc/old-controller로 요청하면 출력문이 실행됩니다.
위 컨트롤러가 호출되기 위해서는 다음 2가지가 필요합니다.
1. HandlerMapping(핸들러 매핑)
• 핸들러 매핑에서 이 컨트롤러를 찾을 수 있어야 한다.
예) 스프링 빈의 이름으로 핸들러를 찾을 수 있는 핸들러 매핑이 필요하다.
2. HandlerAdapter(핸들러 어댑터)
• 핸들러 매핑을 통해서 찾은 핸들러를 실행할 수 있는 핸들러 어댑터가 필요하다.
예) Controller 인터페이스를 실행할 수 있는 핸들러 어댑터를 찾고 실행해야 한다.
1. 핸들러 매핑을 찾고,
2. 핸들러 어댑터를 찾습니다.
우리가 구현한 것과 마찬가지로 핸들러 매핑, 핸들러 어댑터는 모두 순서대로 찾고 없으면 다음 순서로 넘어갑니다.
1. 핸들러 매핑으로 핸들러 조회
HandlerMapping 을 순서대로 실행해서, 핸들러를 찾습니다.
이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아주는 BeanNameUrlHandlerMapping이 실행에 성공하고 핸들러인 OldController 를 반환합니다.
2. 핸들러 어댑터 조회
HandlerAdapter 의 supports() 를 순서대로 호출합니다. SimpleControllerHandlerAdapter 가 Controller 인터페이스를 지원하므로 대상이 됩니다.
3. 핸들러 어댑터 실행
디스패처 서블릿이 조회한 SimpleControllerHandlerAdapter 를 실행하면서 핸들러 정보도 함께 넘겨줍니다.
SimpleControllerHandlerAdapter 는 핸들러인 OldController 를 내부에서 실행하고, 그 결과를 반환합니다.
정리
- OldController 핸들러매핑, 어댑터 OldController 를 실행하면서 사용된 객체는 다음과 같습니다.
HandlerMapping = BeanNameUrlHandlerMapping
HandlerAdapter = SimpleControllerHandlerAdapter
HttpRequestHandler
핸들러 매핑과, 어댑터를 더 잘 이해하기 위해 Controller 인터페이스가 아닌 다른 핸들러를 알아보겠습니다. HttpRequestHandler 핸들러(컨트롤러)는 서블릿과 가장 유사한 형태의 핸들러입니다.
MyHttpRequestHandler
http://localhost:8080/springmvc/request-handler 로 요청하면 위의 출력문이 출력될 것입니다.
1. 핸들러 매핑으로 핸들러 조회
1. HandlerMapping 을 순서대로 실행해서, 핸들러를 찾습니다.
2. 이 경우 빈 이름으로 핸들러를 찾아야 하기 때문에 이름 그대로 빈 이름으로 핸들러를 찾아 주는
BeanNameUrlHandlerMapping가 실행에 성공하고 핸들러인 MyHttpRequestHandler 를 반환합니다.
2. 핸들러 어댑터 조회
1. HandlerAdapter 의 supports() 를 순서대로 호출합니다.
2. HttpRequestHandlerAdapter 가 HttpRequestHandler 인터페이스를 지원하므로 대상이 됩니다.
3. 핸들러 어댑터 실행
1. 디스패처 서블릿이 조회한 HttpRequestHandlerAdapter 를 실행하면서 핸들러 정보도 함께 넘겨줍니다.
2. HttpRequestHandlerAdapter 는 핸들러인 MyHttpRequestHandler 를 내부에서 실행하고, 그 결과를 반환한합다.
정리 - MyHttpRequestHandler 핸들러매핑, 어댑터
MyHttpRequestHandler 를 실행하면서 사용된 객체는 다음과 같습니다.
HandlerMapping = BeanNameUrlHandlerMapping
HandlerAdapter = HttpRequestHandlerAdapter
@RequestMapping
조금 뒤에서 설명하겠지만, 가장 우선순위가 높은 핸들러 매핑과 핸들러 어댑터는 RequestMappingHandlerMapping ,
RequestMappingHandlerAdapter 입니다.
@RequestMapping 의 앞글자를 따서 만든 이름인데, 이것이 바로 지금 스프링에서 주로 사용하는 애노테이션 기반의 컨트롤러를 지원하는 매핑과 어댑터입니다. 실무에서는 99.9% 이 방식의 컨트롤러를 사용합니다.
'Spring > spring mvc' 카테고리의 다른 글
스프링 MVC 시작하기 (0) | 2021.06.27 |
---|---|
뷰리졸버(ViewResolver) (0) | 2021.06.27 |
스프링MVC 전체 구조 (0) | 2021.06.27 |
MVC프레임워크 어댑터패턴 적용하기 (0) | 2021.06.27 |
MVC프레임워크 -프론트 컨트롤러 도입 V3 (0) | 2021.06.26 |