ArgumentResolver 적용

jylee·2024년 1월 23일
0

그냥생각나는거

목록 보기
38/48

Annotation 생성

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginAnnotation { }

ArgumentResolver 구현

@Slf4j
@Component
public class LoginUserArgumentResolver implements HandlerMethodArgumentResolver {
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        log.info("supportsParameter 실행");

        boolean hasLoginAnnotation = parameter.hasParameterAnnotation(LoginAnnotation.class);
        boolean hasUserType = User.class.isAssignableFrom(parameter.getParameterType());

        return hasLoginAnnotation && hasUserType;
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
                                  NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
        log.info("resolverArgument 실행");

        HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();
        HttpSession session = request.getSession(false);

        if(session == null) {
            return null;
        }

        return session.getAttribute("loginUser");
    }
}

@LogAnnotation가 파라미터에 붙어 있고 ClassType이 User 이면 있으면 구현한 ArgumentResolver 가 동작

supportsParameter()true인 경우 컨트롤러 호출 직전에 호출 되어서 필요한 파라미터 정보를 생성해준다.

여기서는 세션에 있는 로그인 회원 정보인 User 객체를 찾아서 반환해준다. 이후 스프링 MVC는 컨트롤러의 메서드를 호출하면서 여기에서 반환된 User 객체를 파라미터에 전달해준다.
세션에 있는 로그인 회원을 찾아주고, 만약 세션에 없다면 null 을 반환한다.

ArgumentResolver 등록

@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
    private final LoginUserArgumentResolver loginUserArgumentResolver;

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

ArgumentResolverWebMvcConfigurer를 구현한 설정 파일에 addArgumentResolvers() 메소드를 오버라이딩하여 등록한다.

profile
ㅎㅇ

0개의 댓글