HandlerMethodArgumentResolver

특정 조건에 맞는 파라미터가 있을 때 원하는 값을 바인딩해주는 인터페이스

public interface HandlerMethodArgumentResolver {
    boolean supportsParameter(MethodParameter parameter);

    @Nullable
    Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer, NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;
}

supportsParameter

supportsParameter 는 컨트롤러의 메서드에 어노테이션이 포함되어 있는지 확인하는 역할을 한다.

만약 포함되어 있다면 아래 메서드인 resolveArgument를 실행하고 포함되어 있지 않다면 실행하지 않는다.

resolveArgument

resolveArgument메서드는 어노테이션이 포함되어 있을 때 처리하고 싶은 로직을 작성하면 이를 처리하고 결과값을 반환하는 메서드이다.

resolver를 만들면 끝이 아니다. resolver를 만든 후 스프링에게 알려주어야 한다.

WebMvcConfigurer인터페이스를 implements하고 addArgumentResolvers를 구현하면 된다.

@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
	
		private final AuthArgumentResolver authArgumentResolver;
		
		@Override
	  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
	      resolvers.add(authArgumentResolver);
	      resolvers.add(ipAddressArgumentResolver);
	  }
}

🌀 Auth 어노테이션

사용 방법

@Auth(permit = {...}) Long userId

구조

@Hidden // Swagger 문서에 표시하지 않음
@Target(PARAMETER)
@Retention(RUNTIME)
public @interface Auth {

    UserType[] permit() default {};

    boolean anonymous() default false;
}

동작 원리