본문 바로가기
Framework & Library/Spring Boot

[Spring Boot] : ArgumentResolver 활용

by 오주현 2022. 2. 23.
반응형

@Login 어노테이션을 만들고 이게 있으면 직접 만든 ArgumentResolver가 동작해서 자동으로 세션에 있는 로그인 회원을 찾아주고 없다면 null을 반환하도록 개발하는 실습을 진행했다.

 

@Target(ElementType.PARAMETER) //파라미터에만 사용
@Retention(RetentionPolicy.RUNTIME)  //리플렉션 등 활용할 수 있게 런타임까지 어노테이션 정보가 남는다.
public @interface Login {
}

@Login 어노테이션을 생성해 주었다.

 

주석을 참고하면 된다.

 

@Slf4j
public class LoginMemberArgumentResolver implements HandlerMethodArgumentResolver {

HandlerMethodArgumentResolver을 구현하면 된다.

 

오버라이드를 활용해 아래와 같이 구성한다.

 

@Override
public boolean supportsParameter(MethodParameter parameter) {

    log.info("supportsParameter 실행");

    boolean hasLgoinAnnotation = parameter.hasParameterAnnotation(Login.class);
    boolean hasMemberType = Member.class.isAssignableFrom(parameter.getParameterType());

    return hasLgoinAnnotation && hasMemberType;
}

@Login 어노테이션이 있으면 Member 타입일 경우 해당 ArgumentResolver가 사용된다.

 

@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);
}

컨트롤러 호출 직전에 호출되어 필요한 파라미터 정보를 만들어 주는 역할을 한다.

 

세션에 있는 member 객체를 찾아 반환해 주고 컨트롤러의 메서드를 호출하면 여기에서 반환된 member 객체를 파라미터에 전달해 준다.

 

@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    resolvers.add(new LoginMemberArgumentResolver());
}

LoginMemberArgumentResolver를 등록해 주었다.

 

이제 실행을 통해 확인할 수 있다 좀 더 편리하게 로그인 회원 정보를 조회할 수 있게 되었다.

 

ArgumentResolver는 공통 작업이 필요할 때 컨트롤러를 더 편리하게 사용할 수 있도록 해주는 역할을 한다.


스프링 MVC 2편 - 백엔드 웹 개발 활용 기술을 참고하여 공부하였습니다.

반응형

댓글