인프런 커뮤니티 질문&답변

wjdwldud0601님의 프로필 이미지

작성한 질문수

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

ArgumentResolver 활용

ArgumentResolver 구현 시 supportsParameter 메서드 관련 질문

작성

·

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 실행" 이라는 것이 남아야 할 것 같은데 실제 콘솔창에는 남지 않습니다.

image.png

 

원인이 무엇인가요?

답변 1

1

안녕하세요. wjdwldud0601님, 공식 서포터즈 OMG입니다.

우리가 직접 만든 LoginMemberArgumentResolver 를 등록하게 되면 스프링에서는 @Login 을 처리할 수 있는 ArgumentResolver 를 찾기 위해 supportsParameter 라는 메서드를 통해 지원 여부를 확인할 것으로 예상이 됩니다.

네 맞습니다. 그런데 잘 생각해보면 supportsParameter는 매 요청 시 호출될게 아니라 애플리케이션 로딩 시점에 딱 한번만 등록해놓으면 우리 애플리케이션에서 이 정보를 바탕으로 어느시점에 동작해야하는지 알 수 있습니다.

 

그래서 supportsParameter 실행는 애플리케이션이 로딩되고 딱 한번 localhost:8080 호출 시에만 출력됩니다.

아래 이미지에서 빨간선을 기준으로 서버 구동 시점과 /(루트) 요청 호출의 기준이 되는데요,

톰캣 가동이되고, 디스페처서블릿이 초기화가 완료된 후에는 supportsParameter를 출력하는 것을 볼 수 있습니다.

image.png

딱 이 시점에만 호출이되고, 동일한 요청(/) 혹은 @Login이 선언된 핸들러메서드가 실행되더라도 호출하지 않습니다.

감사합니다.