티스토리 뷰

Spring을 사용하면서 ArgumentResolver라는것을 한번은 들어봤을 것이다. 이것은 Servlet 과 Controller 사이에서 전달되어진 값을 가공하거나 추가할 필요가 있을때 사용한다. AOP와 같이 중복 코드를 제거하는데 큰 의미를 가지고 있는것 같다. 일반 개발자라면 많이 다룰일이 없을듯하고 공통을 잡는 사람들이 주로 다루는 내용들이다. 

그럼 간단히 Custom ArgumentResolver를 만드는 방법에 대해서 알아보자. 


샘플을 구현할때 대략적인 시나리오는 여기저기 많이 사용되는 사용자에 대한 정보를 ArgumentResolver를 통해서 생성하는 것이다. 물론 이런 정보는 HttpServletRequest를 통해서 가지고 올 수 있지만 위에서 언급한대로 중복된 소스를 줄인다는것에 의의를 두고 보도록 하자. 

 

DTO

@Data
public class UserDto {

    private String userId;
    private String userLocale;
    private String ipAddress;
}

UserDto는 ArgumentResolver를 통해 담을 내용들이다. 

 

Custom ArgumentResolver

@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.getParameterType().equals(UserDto.class);
    }
    
    public Object resolveArgument(MethodParameter methodParameter,
            ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest,
            WebDataBinderFactory webDataBinderFactory) throws Exception {
        HttpServletRequest httpServletRequest = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
        
        UserDto userDto = new UserDto();
        userDto.setUserId(httpServletRequest.getSession().getId());
        userDto.setUserLocale(httpServletRequest.getLocale().toString());
        userDto.setIpAddress(httpServletRequest.getLocalAddr());
        
        return userDto;
    }
}

Custom ArgumentResolver는 HandlerMethodArgumentResolver를 implements하여 만든다. 그럼 supportsParameter와 resolveArgument를 구현해야 한다. supportsParameter가 먼저 호출이 되는데 MethodParameter 타입이 UserDto 타입인경우에 resolveArgument 호출해준다. 그럼 resolveArgument 에서는 UserDto 에 대해 필요한 정보를 가공할 수 있다. 

HttpServletRequest는 기본 파라미터로 제공을 해주지는 않는데 위와 같이 NativeWebRequest를 통해 만들 수 있다. 

 

WebConfig

@Configuration
public class WebConfig implements WebMvcConfigurer{
    
    @Autowired
    private UserArgumentResolver userArgumentResolver;
    
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(userArgumentResolver);
    }    
}

이렇게 만든 ArgumentResolver를 사용하기 위해 등록해주는 과정이 필요하다. WebMvcConfigure를 implements하여 addArgumentResolvers를 통해 추가해주면 된다. 

 

Controller

@RestController
public class UserController {
    
    @GetMapping("/user")
    public void testRestTemplate(UserDto userDto) {
        Gson gson = new Gson();
        System.out.println(gson.toJson(userDto));
    }
}

위와 같이 구성이 끝났다면 Controller에서 argument로 UserDto라는 것을 넣어보자. /user 라는 것을 호출할때 아무런 파라미터를 전달하지 않는다고 해도 위에서 만든 ArgumentResolver가 동작하여 UserDto를 구성을 해줄것이다. 

 

호출 결과값

{"userId":"DD35175022826DE18808DC0FCE47E9FD","userLocale":"ko_KR","ipAddress":"127.0.0.1"}

/user 를 호출하면 의도한대로 user의 정보가 ArgumentResolver를 통해 잘 전달되어 표현되어진 것을 확인할 수 있다. 

 

이와 더불어 Controller의 리턴 타입으로 판단하여 처리하는 역할을 하는 Custom ReturnValueHandler에 대한 예제는 아래 글을 참조하도록 하자. 

 

Spring Custom ReturnValueHandler 만들기 초간단 예제

지난번에는 Custom ArgumentResolver를 만드는 예제를 해봤다. 이전에 다뤘던 ArgumentResolver가 Controller에 들어오는 파라미터를 가공 및 추가를 하는데 사용되었다면, RetunValueHandler는 리턴 타입으로 판..

oingdaddy.tistory.com

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/12   »
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 31