참새의 이야기
[MVC2] ArgumentResolver 본문
로그인 처리를 위해 ArgumentResolver 를 사용하면 세션 정보를 활용하는 과정이 조금 더 편리해진다.
기존 방법에서는 HttpServletRequest 에서 직접 세션 정보를 꺼내서 사용하거나 @SessionAttribute 애노테이션으로 매핑해 사용했다.
@SessionAttribute 애노테이션을 사용하면 그나마 간단해지기는 하지만 매번 name과 required를 설정해 주는 것도 꽤 번거로운 일이다.
@Login 이라는 애노테이션을 직접 만들어 활용해 보자.
@Login
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Login {
}
@Target(ElementType.PARAMETER) 는 이 애노테이션을 파라미터에만 사용할 수 있다는 의미이다.
@Retention(RetentionPolicy.RUNTIME) 은 애노테이션 정보가 runtime까지 남아있도록 한다는 의미다.
LoginMemberArgumentResolver
@Slf4j
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
log.info("supportsParameter 실행");
boolean hasLoginAnnotation = parameter.hasParameterAnnotation(Login.class);
boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());
return hasLoginAnnotation && hasMemberType;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
log.info("resolveArgument 실행");
HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
HttpSession session = request.getSession(false);
if (session == null) {
return null;
}
return session.getAttribute(SessionConst.LOGIN_MEMBER);
}
}
supportsParameter() 메서드를 보면, @Login 애노테이션이 붙어있는지를 확인하고 Member 타입인지 확인한 후 ArgumentResolver가 사용됨을 알 수 있다.
이렇게 만들어진 ArgumentResolver는 WebConfig에서 등록하여 활용한다.
WebConfig에 아래의 코드를 추가하여 ArgumentResolver를 등록한다.
reference
이 글은 김영한님의 '스프링 MVC 2편'을 듣고 작성했습니다.
'Spring' 카테고리의 다른 글
[MVC2] API 예외 처리 (2) | 2023.08.15 |
---|---|
[MVC2] MVC 예외 처리 (0) | 2023.08.12 |
[MVC2] 로그인 처리 - Filter, Interceptor (0) | 2023.08.10 |
[MVC2] 로그인 처리 - Cookie, Session (0) | 2023.08.10 |
[MVC2] Bean Validation (0) | 2023.08.08 |