1. 소개

RestTemplate의 클래스는 Spring에서 클라이언트 측 HTTP 작업을 수행하는 중앙 도구입니다. HTTP 요청을 작성하고 응답을 처리하기위한 여러 유틸리티 메소드를 제공합니다.

또한 RestTemplateJackson 과 잘 통합 되기 때문에   많은 노력없이 대부분의 객체를 JSON으로 /에서 직렬화 / 역 직렬화 할 수 있습니다. 그러나 개체 컬렉션 작업은 그렇게 간단하지 않습니다 .

이 예제에서는 RestTemplate사용 하여 객체 List을 GETPOST 하는 방법을 살펴 봅니다  .

2. 예제 서비스

두 개의 HTTP 엔드 포인트가있는 직원 API를 사용합니다. 모두 가져 와서 다음을 생성합니다.

  • GET / 직원
  • POST / 직원

클라이언트와 서버 간의 통신을 위해 간단한 DTO를 사용하여 기본 직원 데이터를 캡슐화합니다.

public class Employee {
    public long id;
    public String title;

    // standard constructor and setters/getters
}

이제 RestTemplate사용 하여 Employee 개체 List을 가져오고 만드는 코드를 작성할 준비가되었습니다 .

3. RestTemplate 으로 개체 List 가져 오기

일반적으로 GET을 호출 할 때 다음 과 같이 RestTemplate 의 단순화 된 메서드 중 하나를 사용할 수 있습니다 .

getForObject (URI URL, Class <T> responseType)

그러면 GET 동사를 사용하여 지정된 URI로 요청을 보내고 Response body을 요청 된 Java 유형으로 변환합니다. 이것은 대부분의 클래스에서 잘 작동하지만 한계 가 있습니다. 객체 List을 보낼 수 없습니다.

문제는 Java 제네릭을 사용한 유형 삭제 때문입니다. 응용 프로그램이 실행 중일 때는 List에 어떤 유형의 개체가 있는지 알 수 없습니다. 이는 List의 데이터를 적절한 유형으로 역 직렬화 할 수 없음을 의미합니다.

다행히도이 문제를 해결할 수있는 두 가지 옵션이 있습니다.

3.1. 배열 사용

먼저 RestTemplate 을 사용할 수 있습니다 . getForEntity ()responseType 매개 변수 를 통해 객체 배열을 가져 옵니다. 어떤 클래스 를 지정 하든 ResponseEntity 의 매개 변수 유형 과 일치 합니다.

ResponseEntity<Employee[]> response =
  restTemplate.getForEntity(
  "http://localhost:8080/employees/",
  Employee[].class);
Employee[] employees = response.getBody();

또한 RestTemplate.exchange사용 하여 동일한 결과를 얻을 수 있습니다.

여기서 무거운 작업을 수행하는 공동 작업자는 ResponseExtractor  이므로 추가 사용자 지정이 필요한 경우 execute 를 호출 하고 자체 인스턴스를 제공 할 수 있습니다 .

3.2. 래퍼 클래스 사용

일부 API는 List을 직접 반환하는 대신 직원 List이 포함 된 최상위 개체를 반환합니다. 이 상황을 처리하기 위해 직원 List이 포함 된 래퍼 클래스를 사용할 수 있습니다.

public class EmployeeList {
    private List<Employee> employees;

    public EmployeeList() {
        employees = new ArrayList<>();
    }

    // standard constructor and getter/setter
}

이제 더 간단한 getForObject () 메서드를 사용하여  직원 List을 가져올 수 있습니다.

EmployeeList response = restTemplate.getForObject(
  "http://localhost:8080/employees",
  EmployeeList.class);
List<Employee> employees = response.getEmployees();

이 코드는 훨씬 간단하지만 추가 래퍼 개체가 필요합니다.

4. RestTemplate 으로 개체 List 게시

이제 클라이언트에서 서버로 개체 List을 보내는 방법을 살펴 보겠습니다. 위와 마찬가지로 RestTemplate 은 POST를 호출하는 간단한 방법을 제공합니다.

postForObject (URI URL, 객체 요청, Class <T> responseType)

이것은 선택적 요청 본문과 함께 지정된 URI에 HTTP POST를 보내고 응답을 지정된 유형으로 변환합니다. 위의 GET 시나리오와 달리 유형 삭제에 대해 걱정할 필요가 없습니다 .

이는 이제 Java 객체에서 JSON으로 이동하기 때문입니다. 객체 List과 해당 유형은 JVM에서 알고 있으므로 올바르게 직렬화됩니다.

List<Employee> newEmployees = new ArrayList<>();
newEmployees.add(new Employee(3, "Intern"));
newEmployees.add(new Employee(4, "CEO"));

restTemplate.postForObject(
  "http://localhost:8080/employees/",
  newEmployees,
  ResponseEntity.class);

4.1. 래퍼 클래스 사용

위의 GET 시나리오와 일치하도록 래퍼 클래스를 사용해야하는 경우에도 간단합니다. RestTemplate을 사용하여 새 List을 보낼 수 있습니다 .

List<Employee> newEmployees = new ArrayList<>();
newEmployees.add(new Employee(3, "Intern"));
newEmployees.add(new Employee(4, "CEO"));

restTemplate.postForObject(
  "http://localhost:8080/employees",
  new EmployeeList(newEmployees),
  ResponseEntity.class);

5. 결론

RestTemplate을 사용하는 것은 서비스와 통신하기 위해 HTTP 클라이언트를 구축하는 간단한 방법입니다.

모든 HTTP 메서드 및 단순 개체 작업을위한 여러 메서드를 제공합니다. 약간의 추가 코드 만 있으면 객체 List 작업에 쉽게 사용할 수 있습니다.

평소와 같이 전체 코드는 Github 프로젝트 에서 사용할 수 있습니다  .