Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

참새의 이야기

[MVC2] ArgumentResolver 본문

Spring

[MVC2] ArgumentResolver

참새짹짹! 2023. 8. 10. 13:09

로그인 처리를 위해 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