[Spring] ArgumentResolvers

유존돌돌이·2022년 4월 7일
0

Spring

목록 보기
23/26
post-thumbnail

아래의 예는 간단한 로그인 후 홈화면으로 넘어갈때 회원정보 객체 Model을 Session에 담아 로그인 후처리 하는 부분을 ArgumentResolver @Login을 등록하여 객체를 반환하는 예제이다.

AS-IS

public String home(@SessionAttribute(name=SessionConst.LOGIN_MEMEBER, required = false) Member member)

TO-BE

public String homeArgumentResolver(@Login Member member)

1. Annotaion 등록

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

}

2. HandlerMethodArgumentResolver 등록

  1. supportsParameter : 해당 호출이 지원하는 상태인지 확인
  2. 지원한다면 Custom Logic 및 해당 객체 리턴
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        log.info("supportsParamter 실행");

        // Custom annotation이 있는지 확인 (내가 등록한 Customer anntation : Login.class)
        boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
        // Customer annotaion에 해당하는 파라미터가 Member 클래스와 같나?
        boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());

        // 두개가 모두 만족하면 resolveArgument 실행
        return hasMemberType && hasMemberType;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        log.info("resolverArgument 실행");

        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
        HttpSession session = request.getSession(false);

        if(session==null) {
            return null;
        }

        return session.getAttribute(SessionConst.LOGIN_MEMEBER);

    }
}

3. Config 등록

resolvers.add(내가 등록한 ArgumentResolver 클래스);

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

0개의 댓글