RestTemplate에서 List 다루기
1. 소개
RestTemplate의 클래스는 봄에서 클라이언트 측 HTTP 작업을 수행하는 중앙 도구입니다. HTTP 요청을 작성하고 응답을 처리하기위한 몇 가지 유틸리티 메소드를 제공합니다.
또한 RestTemplate 은 Jackson 과 잘 통합되어 있기 때문에 많은 노력없이 JSON과주고받는 대부분의 객체를 직렬화 / 직렬화 할 수 있습니다. 그러나 객체 컬렉션 작업은 그렇게 간단하지 않습니다 .
이 튜토리얼에서는 RestTemplate 을 사용 하여 객체 목록을 GET 하고 POST 하는 방법을 살펴 봅니다 .
2. 서비스 예
두 개의 HTTP 엔드 포인트가있는 직원 API를 사용합니다. 모두 가져 와서 작성하십시오.
- GET / 직원
- POST / 직원
클라이언트와 서버 간의 통신을 위해 간단한 DTO를 사용하여 기본 직원 데이터를 캡슐화합니다.
public class Employee {
public long id;
public String title;
// standard constructor and setters/getters
}
이제 RestTemplate 을 사용 하여 Employee 객체 목록을 가져와 생성 하는 코드를 작성할 준비가되었습니다 .
3. RestTemplate을 사용 하여 객체 목록 가져 오기
일반적으로 GET을 호출 할 때 RestTemplate 에서 다음과 같은 단순화 된 메소드 중 하나를 사용할 수 있습니다 .
getForObject (URI URL, 클래스
GET 동사를 사용하여 지정된 URI로 요청을 보내고 응답 본문을 요청 된 Java 유형으로 변환합니다. 이것은 대부분의 클래스에서 훌륭하게 작동하지만 한계 가 있습니다. 객체 목록을 보낼 수 없습니다.
문제는 Java 제네릭을 사용한 유형 삭제로 인한 것입니다. 응용 프로그램이 실행 중이면 목록에 어떤 유형의 개체가 있는지 알 수 없습니다. 이는 목록의 데이터를 적절한 유형으로 직렬화 해제 할 수 없음을 의미합니다.
다행히이 문제를 해결할 수있는 두 가지 옵션이 있습니다.
3.1. 배열 사용
먼저 RestTemplate 을 사용할 수 있습니다 . getForObject () 는 responseType 매개 변수 를 통해 객체 배열을 가져 옵니다. 무엇이든 클래스 우리가 지정이 일치 ResponseEntity 의 매개 변수 유형을 :
ResponseEntity<Employee[]> response =
restTemplate.getForEntity(
"http://localhost:8080/employees/",
Employee[].class);
Employee[] employees = response.getBody();
또한 RestTemplate.exchange 를 사용 하여 동일한 결과를 얻을 수있었습니다 .
여기서 무거운 작업을 수행하는 공동 작업자는 ResponseExtractor 이므로 추가 사용자 지정이 필요한 경우 execute 를 호출 하고 자체 인스턴스를 제공 할 수 있습니다 .
3.2. 랩퍼 클래스 사용
일부 API는 목록을 직접 반환하는 대신 직원 목록이 포함 된 최상위 개체를 반환합니다. 이러한 상황을 처리하기 위해 직원 목록이 포함 된 랩퍼 클래스를 사용할 수 있습니다.
public class EmployeeList {
private List<Employee> employees;
public EmployeeList() {
employees = new ArrayList<>();
}
// standard constructor and getter/setter
}
이제 더 간단한 getForObject () 메소드를 사용하여 직원 목록을 얻을 수 있습니다.
EmployeeList response = restTemplate.getForObject(
"http://localhost:8080/employees",
EmployeeList.class);
List<Employee> employees = response.getEmployees();
이 코드는 훨씬 단순하지만 추가 래퍼 객체가 필요합니다.
4. RestTemplate을 사용 하여 객체 목록 게시
이제 클라이언트에서 서버로 객체 목록을 보내는 방법을 살펴 보겠습니다. 위와 마찬가지로 RestTemplate 은 POST 호출을위한 간단한 방법을 제공합니다.
postForObject (URI URL, 객체 요청, 클래스
이는 선택적 요청 본문과 함께 지정된 URI로 HTTP POST를 전송하고 응답을 지정된 유형으로 변환합니다. 위의 GET 시나리오와 달리 유형 삭제에 대해 걱정할 필요가 없습니다 .
Java 객체에서 JSON으로 이동하기 때문입니다. 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<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 메소드 및 단순 오브젝트로 작업하기위한 많은 메소드를 제공합니다. 약간의 추가 코드를 사용하면 쉽게 코드를 사용하여 객체 목록으로 작업 할 수 있습니다.
평소와 같이 완전한 코드는 Github 프로젝트 에서 사용할 수 있습니다 .
참고
'Spring' 카테고리의 다른 글
ErrorHandling 을 통한 RestTemplate 공통 에러처리 (1) | 2020.06.14 |
---|---|
RestTemplateBuilder로 안전하게 restTemplate 생성하기 (1) | 2020.06.14 |
RestTemaplte 사용방법 (0) | 2020.06.13 |
이중화된 시스템 Redis를 통한 Spring security session관리 (0) | 2020.06.13 |
Spring 에서Global Error, Exception handling하는 방법 (0) | 2020.06.12 |