annotation 설정

세션에서 늘 getAttribute로 사용자를 가져오는 게 번거로워서 annotation과 argumentResolver를 설정해 줬는데, 계속해서 오류가 발생했다. annotation과 argumentResolver의 코드는 아래와 같다.

annotation

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

ArgumentResolver

    public class LoginedUserArgumentResolver implements HandlerMethodArgumentResolver {

        @Override
        public boolean supportsParameter(MethodParameter parameter) {
            return parameter.hasParameterAnnotation(LoginedUser.class);
        }

        @Override
        public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
            return SessionUtils.getAttribute("LOGIN_USER");
        }

    }

제대로 설정을 해 준 것 같은데 엄한 데서 계속 삽질하다가, 기존 스프링에서 argumentResolver를 사용할 때 web.xml에서 설정해 줬던 것이 생각났다. xml 설정은 링크에서 확인할 수 있다. 스프링과 동일하게, 생성한 커스텀 ArgumentResolver를 사용하기 위해 등록하는 과정이 필요하다.

WebConfig

    @Configuration
    public class WebConfig implements WebMvcConfigurer {

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

Controller

    public ResponseDto<Map<String, Object>> save(@LoginedUser Customer customer, ReviewInsertForm form) {
        
        if (customer == null) {
            throw new LoginErrorException("로그인이 필요한 서비스입니다.");
        }
        
        // 이후 구현 생략
    }

이렇게 생성한 커스텀 어노테이션을 사용하면, argumentResolver가 알아서 로그인 된 사용자의 정보를 가져오게 된다.