HandlerMethodArgumentResolver

HyeonWoo·2020년 12월 23일
0

스프링 & JPA

목록 보기
18/34
post-thumbnail

이번 장에서는 파라미터로 AOP를 구현하는 데에 스프링의 전략 인터페이스 중 하나인 HandlerMethodArgumentResolver에 대해서 알아보고자 한다.


HandlerMethodArgumentResolver 이란?

전략 패턴의 일종으로 컨트롤러 메서드에서 특정 조건에 해당하는 파라미터가 있으면 생성한 로직을 처리한 후 해당 파라미터에 바인딩해주는 전략 인터페이스.

*전략 패턴 : 특정 전략을 인터페이스로 만들고 이를 여러 전략 객체로 구현한다. 그리고 현재 클래스 레벨에서 전략 인터페이스를 의존하도록 한다. 이런 식으로 느슨하게 연결된 전략 클래스를 찾아 의존하도록 하는 방식.


public interface HandlerMethodArgumentResolver {

	boolean supportsParameter(MethodParameter parameter);
    
    	Object resolveArgument(MethodParameter parameter,
    			ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
                  	WebDataBinderFactory binderFactory) throws Exception;
                    
}
  • supportsParameter() : HandlerMethodArgumentResolver가 해당하는 파라미터를 지원할지 여부를 반환. true를 반환하면 resolveArgument 메서드가 수행됨.
  • resolveArgument() : 파라미터의 인잣값에 대한 정보를 바탕으로 실제 객체를 생성하여 해당 파라미터 객체에 바인딩.

HandlerMethodArgument 예제

1. 어노테이션 작성


@Target(ElementType.PARAMETER) //선언한 어노테이션이 적용될 수 있는 위치를 결정( 메서드 인자 )
@Retention(RetentionPolicy.RUNTIME) //어노테이션이 어느레벨까지 유지되는지 결정 ( 런타임에도 어노테이션이 제공되어 자바 reflection으로 선언한 어노테이션에 접근 )
public @interface SocialUser{
}

2. User 객체 생성

@Getter
@Setter
public class User{

	private String name;
    	private Integer age;
    	private String address;
        
}        

3. 컨트롤러 작성

@RestController
public class TestController {
	
    @GetMapping("/")
    public Person test(@SocialUser User user){
    	return user;
    }
}    

4. resolver 작성

@Component
public class CustomHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().equals(User.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {

        User user = new User();
        user.setName("test");
        user.setAge(21);
        user.setAddress("seoul");

        return user;
    }
}

5. resolver 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private CustomHandlerMethodArgumentResolver customHandlerMethodArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(customHandlerMethodArgumentResolver);
    }
}

6. 결과

서버를 키고 해당 localhost:8080에 접속하면

{"name":"test","age":21,"address":"seoul"}

와 같은 결과가 나온다.


HandlerMethodArgumentResolver를 사용하는 경우

  • parameter로 받는 값이 여러개 존재하고(혹은 객체의 필드들이 여러개가 존재), 그것을 처리하는 코드들의 중복이 발생할 때.
  • Controller에 공통으로 입력되는 parameter들을 추가하거나 수정하는 등의 여러 공통적인 작업들을 한 번에 처리하고 싶을 때

참고자료
https://starkying.tistory.com/entry/Spring-MVC-%E2%80%94-HandlerMethodArgumentResolver-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0,

https://jaehun2841.github.io/2018/08/10/2018-08-10-spring-argument-resolver/#controller%EC%97%90-%EC%A0%81%EC%9A%A9,

처음 배우는 스프링 부트 2

profile
학습 정리, 자기 개발을 위한 블로그

0개의 댓글