본문 바로가기

Spring

Argument Resolver

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

Argument Resolver란?


컨트롤러의 메서드에 특정 조건에 맞는 파라미터가 있을 때, 값을 바인딩해주는 역할을 하는 것입니다.

쉽게 말해서 컨트롤러가 호출될 때, 메서드의 인자들을 검사하여 알맞은 처리를 해줍니다.

사실 우리는 Spring을 사용하면서 자연스럽게 Argument Resolver을 사용하고 있었습니다.

Controller의 파라미터로 ModelMap이나 HttpServletRequest 등을 사용해보신 적이 있으실 것인데요,

우리가 직접 값을 넣어주지도 않았는데 파라미터로 선언만 하면 쉽게 사용할 수 있었습니다.

Spring에서 내부적으로 Argument Resolver가 동작하고 있었기 때문입니다.



Argument Resolver 사용 이유


간단한 예를 들어 생각해보겠습니다.

어느 날 회사에서 모든 요청(모든 Controller)에 대해서 클라이언트가 요청한 브라우저의 정보를 함께 return 해달라는 요청을 받았다고 가정하겠습니다.

이것을 단순히 Controller에서 해결하려고 한다면, 이미 Spring에 등록된 Argument Resolver를 활용해 값을 얻어내는 로직을 매 컨트롤러마다 구현해야 할 것입니다.
당연히 프로그램이 클수록 끔찍한 일이 될 것입니다.

그런데 Argument Resolver에 해당 로직을 처리하는 것을 등록해놓고, 필요한 컨트롤러에서 인자로 받아서 사용만 한다면?
당연히 개발 및 유지보수 측면에서 유리할 것입니다.



사용 방법


  1. HandlerMethodArgumentResolver를 구현한 클래스를 만든다.
  2. WebMvcConfigurer를 구현한 클래스(혹은 web.xml)에 등록한다.

자세한 과정은 사용 예시에서 확인해보겠습니다.



사용 예


우리 예시에서는

  • 요청한 클라이언트의 브라우저 정보를 바인딩해주는 변수
  • @UserAgent 어노테이션이 붙은 변수에 바인딩

을 만들어보겠습니다. (어노테이션 작성은 생략하겠습니다)

 

1. HandlerMethodArgumentResolver를 구현한 클래스를 만든다.

public class HandlerMapArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(UserAgent.class);
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter,
        ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest,
        WebDataBinderFactory webDataBinderFactory) throws Exception {

        return nativeWebRequest.getHeader("user-agent");
    }

2. WebMvcConfigurer를 구현한 클래스(혹은 web.xml)에 등록한다.

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

3. 사용하기

@RestController
public class ArgumentController {

    @GetMapping("/auth/useragent")
    public String argumentResolverTest(@UserAgent String userAgent) {
        return userAgent;
    }
}

4. 결과



결론


프로젝트 내에서 요청한 클라이언트의 브라우저 정보가 필요하다면,

어느 곳에서나 편하게 변수를 사용할 수 있을 것입니다.
이것이 Argument Resolver의 힘입니다.


 

'Spring' 카테고리의 다른 글

Interceptor  (0) 2021.03.02
Controller  (0) 2021.03.02