본문 바로가기
  • 실행력이 모든걸 결정한다
Spring Series/Spring Framework

[Spring] AnnotationMethodHandlerAdapter의 확장

by 김코더 김주역 2022. 9. 29.
반응형

AnnotationMethodHandlerAdapter은 다양한 관례와 규칙을 이용해 컨트롤러 메소드를 호출해주는 핸들러 어댑터다.

 

1. WebBindingInitializer

- 아래 포스팅의 [3)-(4) WebBindingInitializer]를 참고하길 바란다.

https://kimcoder.tistory.com/521

 

[Spring] 프로퍼티 바인딩 방식(1) - PropertyEditor

프로퍼티 바인딩은 텍스트 형식의 값을 적절한 타입으로 변환해서 객체의 프로퍼티에 넣어주는 것으로, 대표적으로 XML 설정이나 HTTP 요청 파라미터 처리에 필요하다. 여러 개의 포스팅에 걸쳐 S

kimcoder.tistory.com

 

 

2. HttpMessageConverter

- 아래 포스팅을 참고하길 바란다.

https://kimcoder.tistory.com/531

 

[Spring] 메시지 컨버터를 이용하는 Ajax 컨트롤러

1. 메시지 컨버터 소개 - 메시지 컨버터는 HTTP 요청/응답 메시지 본문 자체를 메시지로 다룬다. - 메시지 컨버터는 AnnotationMethodHandlerAdapter를 통해 등록할 수 있다. 여러 개의 메시지 컨버터를 등록

kimcoder.tistory.com

 

 

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

 

반응형

댓글