Posts ArgumentResolver 활용
Post
Cancel

ArgumentResolver 활용

ArgumentResolver 활용

ArgumentResolver는 스프링 MVC 구조의 어댑터 핸들러에서 핸들러에 필요한 파라미터를 만들어주는데 호출하는 부분이다. 이 ArgumentResolver를 직접 구현하여 활용하면 다양한 상황에서 편리하게 적용할 수 있다.

로그인 회원 정보를 편리하게 받아오는 예제

컨트롤러

1
2
@GetMapping("/")
public String homeLoginV3ArgumentResolver(@Login Member loginMember, Model model)

Login 어노테이션

1
2
3
4
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
  • @Target(ElementType.PARAMETER) : 파라미터에만 적용
  • @Retention(RetentionPolicy.RUNTIME) : 리플렉션 등을 활용할 수 있도록 런타임까지 애노테이션 정보가 남아있음.

LoginMemberArgumentResolver

HandlerMethodArgumentResolver를 구현하여 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
  @Override
	public boolean supportsParameter(MethodParameter parameter) {
    boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
    boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());
    return hasLoginAnnotation && hasMemberType;
  }

  @Override
  public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                NativeWebRequest webRequest,
                                WebDataBinderFactory binderFactory) throws Exception {
    HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest();
    HttpSession session = request.getSession(false);
    if (session == null) {
      return null;
    }
    return session.getAttribute(SessionConst.LOGIN_MEMBER);
  }
}
  • supportsParameter : @Login 애노테이션이 있으면서 Member 타입이면 해당 ArgumentResolver가 사용되도록 적용
  • resolveArgument : 컨트롤러 호출 직전에 호출되어 필요한 파라미터 정보를 생성해준다.

WebMvcConfigurer에 설정 추가

1
2
3
4
5
6
7
@Configuration
public class WebConfig implements WebMvcConfigurer {
  @Override
  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
  resolvers.add(new LoginMemberArgumentResolver());
  }
}

출처

This post is licensed under CC BY 4.0 by the author.

Valid vs Validatedated

controller에서 enum을 인자로 받기

Comments powered by Disqus.