ArgumentResolver 활용

wangjh789·2022년 8월 10일
0

[Spring] 스프링-mvc-2

목록 보기
8/11

세션의 정보로 member 객체로 만드는 커스텀 ArgumentResolver 를 빈으로 등록해 컨트롤러에서 @Login Member member 를 사용할 수 있게끔 구현

HandlerMethodArgumentResolver

ArgumentResolver들 중 어노테이션을 사용하는 HandlerMethodArgumentResolver를 상속받아 구현해야한다.

public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        log.info("supportsParameter 수행");
        boolean hasParameterAnnotation = parameter.hasParameterAnnotation(Login.class);
        boolean assignableFrom = Member.class.isAssignableFrom(parameter.getParameterType());
        return hasParameterAnnotation && assignableFrom;
    }

    @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인 파라미터일 경우 LoginMemberArgumentResolver를 사용할 수 있다.
  • resolveArgument()
    NativeWebRequest에서 HttpServletRequest로 다운캐스팅 후 세션에서 멤버정보를 가져온다.

ArgumentResolver 등록

    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new LoginMemberArgumentResolver());
    }
profile
기록

0개의 댓글