[Spring] 컨트롤러 공통 작업 자동화 (ArgumentResolver 의 활용)

728x90

 

ArgumentResolver 활용

ArgumentResolver 를 활용하면, 컨트롤러의 파라미터에서 공통적인 작업을 자동으로 처리할 수 있다.

예시로 @Login 애노테이션을 만들어 로그인된 회원 정보를 세션에서 가져오는 작업을 자동화해보겠다.

 

1. 커스텀 애노테이션 @Login 생성

 

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}

@Target(ElementType.PARAMETER) : 파라미터에만 사용

@Retention(RetentionPolicy.RUNTIME) : 리플렉션 등 활용할 수 있도록 런타임에도 애노테이션 유지

 

2. LoginMemberArgumentResolver 구현

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() : 컨트롤러 호출 직전에 호출되어, 세션에서 로그인된 Member 객체를 찾아 컨트롤러의 파라미터로 주입

 

3. 스프링 설정에 ArgumentResolver 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {

  @Override
  public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    resolvers.add(new LoginMemberArgumentResolver());
  }
}

addArgumentResolvers() 를 사용하여 LoginMemberArgumentResolver 를 등록한다.

 

4. 컨트롤러에서 @Login 활용

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

  if (loginMember == null) {
    return "home";
  }

  model.addAttribute("member", loginMember);
  return "loginHome";
}

 

@Login Member loginMember : 파라미터를 선언하면 자동으로 로그인된 Member 객체가 들어온다. 

 

 

동작 흐름

1. 사용자가 / 로 Get 요청

2. 스프링 MVC 가 컨트롤러 호출하기 전 LoginMemberArgumentResolver 실행

3. supportsParameter()true > resolveArgument()` 에서 로그인한 회원 정보를 찾아서 반환

4. 컨트롤러의 @Login Member loginMember 파라미터에 자동으로 로그인 정보 주입

5. 로그인 상태에 따라 home 또는 loginHome 반환

 

 

 

 

 

 

 

 

 

 

 

 

출처 | 스프링 MVC 2(김영한) - 인프런

 
728x90