Spring/Spring MVC

Spring MVC - ArgumentResolver을 활용한 애노테이션 만들기

jddng 2022. 2. 9. 17:04
728x90
반응형

 

 

ArgumentResolver을 활용한 애노테이션 만들기

 

 

 다음과 같은 핸들러가 있다

 

    @GetMapping("/")
    public String homeLoginV3Spring(
            @SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false) Member loginMember, Model model) {

       ....
       
    }

 핸들러의 파라미터중 Member loginMember는 key 값으로 @SessionAttribute 어노테이션을 이용해 Session 영역에 저장되어있는 해당 Member타입의 객체를 가져온다. 잘못된 방법은 아니지만 위 방법보다 더 보기 간편하고 편리하게 사용할 수 있도록 @SessionAttribute의 모든 파라미터 설정값을 갖는 애노테이션을 만들어 사용할 수 있다.

 

 

 

애노테이션 생성

 

  • @Target(ElementType.PARAMETER)
           - 파라미터에만 사용
  • @Retention(RetentionPolicy.RUNTIME) 
           - 리플렉션 등을 활용할 수 있도록 런타임까지 애노테이션 정보가 남아있음

 

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

 

HandlerMethodArgumentResolver 구현

 

@Slf4j
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        log.info("supportsParameter 실행");

        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 {

        log.info("resolveArgument 실행");

        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 객체를 찾아서 반환

 

 

 

 

 

728x90
반응형