2016년 8월 10일 수요일

restTemplate에서 get 요청시 필요한 query parameter 를 domain Object에서 추출하기

restTemplate 사용시 post나 put은 request body에 object를 json으로 전달하여 중간에 변수 설정하는 단계를 생략하고 사용하기가 편하다.

하지만 get이나 delete는 body가 아닌 query parameter로 값을 전송하는데 일일이 명시해야 하는 번거로움이 있다.
restTemplate.getForObject("호출도메인/user/{id}", User.class, id)

간단하게 id를 기준으로 호출하는 형태면 별 문제가 없지만 검색 처리와 같이 많은 query parameter를 사용하는 형태의 경우 일일이 명기해서 쓰면 추후 parameter가 변경될 때마다 변경해야할 번거로움이 크다.

그렇다고 post나 put처럼 request body로 전송하는 것도 올바른 처리는 아닌 것 같고 단순히 object를 query parameter로 쉽게 바꿀 수 있는 방법이 없을까 싶어 처리를 해보았다.

우선 검색을 위한 파라메터를 모아둔 object를 만든다.

@Data
public class Search {
 
 @Min(value = 1, groups = Search.class)
 private int page;
 
 @Range(min = 1, max = 200, groups = Search.class)
 private int pageSize;
 
 @NotNull(groups = Search.class)
 private String searchKeyword;
 
 @NotNull(groups = Search.class)
 private String sortColumn;
 
 @NotNull(groups = Search.class)
 private String sortOrder;
 
 public interface Search {};
}


해당 object를 이용해 검색을 위한 query parameter를 만들고 restTemplate을 호출한다.
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("호출도메인/board/search/findBySearch");
MultiValueMap params = new LinkedMultiValueMap<>();
params.setAll(objectMapper.convertValue(search, Map.class));
builder.queryParams(params);
Article[] articles = restTemplate.getForObject(builder.build().toUri(), Article[].class);

구현은 다음과 같다.

  • UriCompomentsBuilder를 통해 queryParameter까지 생성을 한다.
  • Object mapper를 통해 object를 map으로 변환한 후 해당 map의 내용을 MultiValueMap에 담은 후 uriCompomentBuilder에 전달한다.

이렇게 사용하면 get요청에 parameter가 많은 경우 쉽게 사용할 수 있다.
하지만 단일 domain object만 정상적으로 사용이 가능하고 sub domain을 가지고 있는 경우는 query parameter가 의도된 대로 생성되지 않는다.

간단히 사용할 케이스에만 사용하면 좋지 않을까 싶다.

댓글 없음:

댓글 쓰기