@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginAnnotation { }
@Slf4j
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
log.info("supportsParameter 실행");
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(LoginAnnotation.class);
boolean hasUserType = User.class.isAssignableFrom(parameter.getParameterType());
return hasLoginAnnotation && hasUserType;
}
@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("loginUser");
}
}
@LogAnnotation
가 파라미터에 붙어 있고 ClassType이 User
이면 있으면 구현한 ArgumentResolver 가 동작
supportsParameter()
가 true
인 경우 컨트롤러 호출 직전에 호출 되어서 필요한 파라미터 정보를 생성해준다.
여기서는 세션에 있는 로그인 회원 정보인 User
객체를 찾아서 반환해준다. 이후 스프링 MVC는 컨트롤러의 메서드를 호출하면서 여기에서 반환된 User
객체를 파라미터에 전달해준다.
세션에 있는 로그인 회원을 찾아주고, 만약 세션에 없다면 null
을 반환한다.
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
private final LoginUserArgumentResolver loginUserArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(loginUserArgumentResolver);
}
}
ArgumentResolver
는 WebMvcConfigurer
를 구현한 설정 파일에 addArgumentResolvers()
메소드를 오버라이딩하여 등록한다.