Resolver

Stormi·2022년 2월 19일
0

개발

목록 보기
4/20

HandlerMethodArgumentResolver를 커스텀마이징 해보자

우선 HandlerMethodArgumentResolver
컨트롤러 메소드에 여러 인자 값(@PathVariable)을 추가해서 자주 작업을 한다.
이런 인자들이 즉, parameter로 쓰여진 Argument들이 HandlerMethodArgumentHandler에 의해서
처리가 된다.

HandlerMethodArgumentHandler는 컨트롤러 앞단에서 컨트롤러에게 필요한 값들을 넣어주도록 구현되어있다.

내가 하려는일
컨트롤러에서 parameter자리에 Argument로 받는 값이 AuthMember 클래스일때마다 이것을 컨트롤러
앞단에서 미리 검증해주고 처리해주는 로직을 구현하려고한다.

@RequiredArgsConstructor
public class AuthMemberResolver implements HandlerMethodArgumentResolver {

    private final CacheManager cacheManager;

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterType() == AuthMember.class;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        String token = webRequest.getHeader(AuthConstants.X_ACCESS_TOKEN);
        if (token == null || token.isBlank()){
            throw new Exception();
        }
        Cache cache = cacheManager.getCache(RedisCache.MEMBER_TOKEN.CACHE_NAME);
        return cache.get(token).get();
    }
}

이렇게 AuthMemberResolver로 HandlerMethodArgumentResolver 이 인터페이스를 커스텀마이징해주고

컨트롤러에

    public void test(@ApiIgnore AuthMember authMember) {
        System.out.println(authMember.getId());
        System.out.println(authMember.getNickname());
        System.out.println(authMember.getMembership());
    }

이런식으로 쓰면 컨트롤러의 인자값으로 AuthMember를 받고있으니, AuthMemberResolver의 resolverArgumet메소드에 의해 먼저 token이 맞는 지 확인한다. 기본적으로 resolverArgument메소드는 파라미터로 NativeWebRequest를 받고 있는데, 이것은 누가 봐도 HTTP 요청일 것이다. 따라서 여기의 헤더에 내가 따로 지정한 AuthConstants.X_ACCESS_TOKEN을 키값으로 한 값을 읽어와서 token 점검을해서 AuthMember의 정보들을 컨트롤러에의해 보내주게 된다.

0개의 댓글