[SpringBoot] ArgumentResolver 설정 / WebConfig
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가 알아서 로그인 된 사용자의 정보를 가져오게 된다.