작성
·
60
0
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? 예
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예
3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예
[질문 내용]
우리가 직접 만든 LoginMemberArgumentResolver 를 등록하게 되면 스프링에서는 @Login 을 처리할 수 있는 ArgumentResolver 를 찾기 위해 supportsParameter 라는 메서드를 통해 지원 여부를 확인할 것으로 예상이 됩니다.
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);
}
}
그럼 실제 resolve 하기 전에 supportsParameter 가 먼저 호출될 것이므로 로그에 "supportsParameter 실행" 이라는 것이 남아야 할 것 같은데 실제 콘솔창에는 남지 않습니다.
원인이 무엇인가요?
답변 1
1
안녕하세요. wjdwldud0601님, 공식 서포터즈 OMG입니다.
우리가 직접 만든 LoginMemberArgumentResolver 를 등록하게 되면 스프링에서는 @Login 을 처리할 수 있는 ArgumentResolver 를 찾기 위해 supportsParameter 라는 메서드를 통해 지원 여부를 확인할 것으로 예상이 됩니다.
네 맞습니다. 그런데 잘 생각해보면 supportsParameter는 매 요청 시 호출될게 아니라 애플리케이션 로딩 시점에 딱 한번만 등록해놓으면 우리 애플리케이션에서 이 정보를 바탕으로 어느시점에 동작해야하는지 알 수 있습니다.
그래서 supportsParameter 실행
는 애플리케이션이 로딩되고 딱 한번 localhost:8080 호출 시에만 출력됩니다.
아래 이미지에서 빨간선을 기준으로 서버 구동 시점과 /(루트) 요청 호출의 기준이 되는데요,
톰캣 가동이되고, 디스페처서블릿이 초기화가 완료된 후에는 supportsParameter를 출력하는 것을 볼 수 있습니다.
딱 이 시점에만 호출이되고, 동일한 요청(/) 혹은 @Login이 선언된 핸들러메서드가 실행되더라도 호출하지 않습니다.
감사합니다.