AnnotationMethodHandlerAdapter은 다양한 관례와 규칙을 이용해 컨트롤러 메소드를 호출해주는 핸들러 어댑터다.
1. WebBindingInitializer
- 아래 포스팅의 [3)-(4) WebBindingInitializer]를 참고하길 바란다.
https://kimcoder.tistory.com/521
2. HttpMessageConverter
- 아래 포스팅을 참고하길 바란다.
https://kimcoder.tistory.com/531
3. SessionAttributeStore
- @SessionAttribute에 의해 지정된 모델 오브젝트가 저장되는 곳으로, 정확히는 이 인터페이스의 구현체에 저장된다. 디폴트 구현체는 HTTP 세션을 이용하는 DefaultSessionAttributeStore이다.
- 더 효율적이고 빠른 방식으로 세션정보를 저장하도록 만들고 싶다면 SessionAttributeStore의 구현체를 따로 만들어서 AnnotationMethodHandlerAdapter의 sessionAttributeStore 속성으로 등록해주면 디폴트 구현체를 대체할 수 있다.
4. WebArgumentResolver
- HTTP 요청 정보를 컨트롤러 메소드의 파라미터 선언을 통해 원하는 형태로 전달받을 수 있게 해주는 인터페이스다.
// org.springframework.web.bind.support.WebArgumentResolver
public interface WebArgumentResolver {
Object UNRESOLVED = new Object();
Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception;
}
- WebArgumentResolver의 구현체를 따로 만들어서 AnnotationMethodHandlerAdapter의 customArgumentResolver 또는 customArgumentResolvers 속성에 적용해주면 HTTP 요청 정보를 애플리케이션에 특화된 타입으로 전달받도록 할 수 있다. 오브젝트를 생성할 수 있으면 이를 반환하고, 아니라면 UNRESOLVED를 반환하면 된다. 다음 소스코드는 WebArgumentResolver의 공식 문서에 나와있는 구현체 예시코드다.
public class MySpecialArgumentResolver implements WebArgumentResolver {
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) {
if (methodParameter.getParameterType().equals(MySpecialArg.class)) {
return new MySpecialArg("myValue");
}
return UNRESOLVED;
}
}
아니면, 다음과 같이 컨트롤러 메소드의 파라미터에 특정 어노테이션이 붙은 경우에만 동작하게 할 수도 있다.
public void method(@CurrentUser User user) {...}
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}
public class MyWebArgumentResolver implements WebArgumentResolver {
public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) {
if (methodParameter.hasParameterAnnotation(CurrentUser.class)) {
...
}
return UNRESOLVED;
}
}
5. ModelAndViewResolver
- 컨트롤러 메소드의 리턴 타입, 메소드 정보, 어노테이션 정보 등을 참고해서 ModelAndView를 생성해준다.
- 특별한 타입의 리턴 값 또는 메소드 레벨 어노테이션 등을 이용해서 ModelAndView를 생성하고 싶다면 ModelAndViewResolver의 구현체를 따로 만들어서 AnnotationMethodHandlerAdapter의 customModelAndViewResolver나 customModelAndViewResolvers 속성에 적용해주면 된다.
// org.springframework.web.servlet.mvc.annotation.ModelAndViewResolver
public interface ModelAndViewResolver {
ModelAndView UNRESOLVED = new ModelAndView();
ModelAndView resolveModelAndView(Method handlerMethod, Class handlerType, Object returnValue,
ExtendedModelMap implicitModel, NativeWebRequest webRequest);
}
※ ExtendedModelMap implicitModel에는 스프링이 자동으로 추가해주는 모델 오브젝트가 맵으로 담겨있다.
● 참고 자료 : 토비의 스프링 3.1 Vol.2
'Spring Series > Spring Framework' 카테고리의 다른 글
[Spring] 자바 코드를 이용한 MVC 전략 설정 (0) | 2022.10.06 |
---|---|
[Spring] @RequestMapping 심화(2) - Spring 3.1의 RequestMapping 전략 (0) | 2022.10.03 |
[Spring] MVC 전용 태그 (0) | 2022.09.29 |
[Spring] 메시지 컨버터를 이용하는 Ajax 컨트롤러 (0) | 2022.09.28 |
[Spring] 프로퍼티 파일에서 BindingResult 메시지 관리하기 (0) | 2022.09.25 |
댓글