7장 REST 서비스 사용하기
💻 실습 : https://github.com/cusbert/spring-in-action-5th
🎯 이 장에서 배우는 내용
- RestTemplate 을 사용해서 REST API 사용하기
스프링에서 사용하는 REST API
- RestTemplate: 스프링 프레임워크에서 제공하는 동기화된 REST client
- Traverson: 스프링 HATEOAS에서 제공하는 하이퍼링크를 인식하는 동기화 REST client
- WebClient: 스프링 5에서 소개된 반응형 비동기 REST client
RestTemplate 는 다음 버전에서 deprecated 될 예정이다. WebClient 를 사용하자
7.1 RestTemplate으로 REST endpoint 사용하기
- RestTamplate 이 정의하는 12개의 메서드
메서드 | 용도 | 기능 설명 |
---|---|---|
exchange(..) | any | 지정된 HTTP 메서드를 URL에 대해 실행하며, Response body와 연결되는 객체를 포함하는 responseEntity를 반환한다. |
execute(..) | any | 지정된 HTTP 메서드를 URL에 대해 실행하며, Response body와 연결되는 객체를 반환한다. |
getForEntity(..) | GET | HTTP GET 요청을 전송하며, Response body와 연결되는 객체를 포함하는 ResponseEntity를 반환한다. |
getForObject(..) | GET | HTTP GET 요청을 전송하며, Response body와 연결되는 객체를 반환한다. |
headForHeaders(..) | HEAD | HTTP HEAD 요청을 전송하며, 지정된 리소스 URL의 HTTP 헤더를 반환한다. |
optionsForAllow(..) | OPTIONS | HTTP OPTIONS 요청을 전송하며, 지정된 URL의 Allow 헤더를 반환한다. |
patchForObject(..) | PATCH | HTTP PATCH 요청을 전송하며, Response body와 연결되는 결과 객체를 반환한다. |
postForEntity(..) | POST | URL에 데이터를 POST하며, Response body와 연결되는 객체를 포함하는 ResponseEntity를 반환한다. |
postForLocation(..) | POST | URL에 데이터를 POST하며, 새로 생성된 리소스의 URL를 반환한다. |
postForObject(..) | POST | URL에 데이터를 POST하며, Response body와 연결되는 객체를 반환한다. |
put(..) | PUT | 리소스 데이터를 지정된 URL에 PUT한다. |
delete(..) | HTTP | 지정된 URL의 리소스에 HTTP DELETE 요청을 수행한다. |
RestTemplate 은 TRACE를 제외한 표준 HTTP 메서드 각각에 대해 최소한 하나의 메소드를 갖고 있다.
또한 execute() 와 exchange()는 모든 HTTP 메서드 요청을 전송하기 위한 저수준의 범용 메서드를 제공한다.
RestTemplate 을 사용하려면 필요한 시점에 RestTemplate 인스턴스를 생성해야한다.
RestTemplate restTemplate = new RestTemplate();
또는 Bean 으로 선언하고 필요할 때 주입할 수도 있다
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
7.1.1 GET 리소스 가져오기
getForEntity
getForObject 와 동일하게 작동하지만 응답 결과 ResponseEntity 객체를 반환한다. 즉 응답 헤더와 같은 더 상세한 응답 콘텐츠를 포함한다.
public Ingredient getIngredientByIdWithEntity(String id) {
ResponseEntity<Ingredient> responseEntity =
restTemplate.getForEntity("http://localhost:8080/ingredients/{id}",
Ingredient.class,
id);
log.info("Fetched time: " +
responseEntity.getHeaders().getDate());
return responseEntity.getBody();
}
getForObject
getForObject()의 두번째 매개변수는 응답이 바인딩되는 타입니다. 여기서는 JSON 형식인 응답데이터가 객체로 deserialized 되어 반환된다.
public Ingredient getIngredientById(String id) {
return restTemplate.getForObject("http://localhost:8080/ingredients/{id}",
Ingredient.class,
id);
}
getForObject : Map을 사용해서 URL 변수들을 저장
public Ingredient getIngredientByIdWithMap(String id) {
Map<String, String> urlVariables = new HashMap<>();
urlVariables.put("id", id);
return restTemplate.getForObject("http://localhost:8080/ingredients/{id}",
Ingredient.class,
urlVariables);
}
getForObject : URI 매개변수를 사용하기
URI 매개변수를 사용할 때는 URL 객체를 구성하여 getForObject() 를 호출해야 한다.
public Ingredient getIngredientByIdWithURI(String id) {
Map<String, String> urlVariables = new HashMap<>();
urlVariables.put("id", id);
URI url = UriComponentsBuilder
.fromHttpUrl("http://localhost:8080/ingredients/{id}")
.build(urlVariables);
return restTemplate.getForObject(url, Ingredient.class);
}
exchange
public List<Ingredient> getAllIngredients() {
return restTemplate.exchange("http://localhost:8080/ingredients",
HttpMethod.GET, null, new ParameterizedTypeReference<List<Ingredient>>() {
})
.getBody();
}
7.1.2 POST 리소스 데이터 추가하기
postForEntity
public Ingredient createIngredientWithEntity(Ingredient ingredient) {
ResponseEntity<Ingredient> responseEntity =
restTemplate.postForEntity("http://localhost:8080/ingredients",
ingredient,
Ingredient.class);
log.info("New resource created at " +
responseEntity.getHeaders().getLocation());
return responseEntity.getBody();
}
postForObject
public Ingredient createIngredient(Ingredient ingredient) {
return restTemplate.postForObject("http://localhost:8080/ingredients",
ingredient,
Ingredient.class);
}
postForLocation
getForObject와 동일하게 동작하지만 리소스 객체대신 새로 생성된 리소스의 URL 를 반환한다
public URI createIngredientWithURI(Ingredient ingredient) {
return restTemplate.postForLocation("http://localhost:8080/ingredients",
ingredient,
Ingredient.class);
}
7.1.3 PUT 리소스 쓰기
put
public void updateIngredient(Ingredient ingredient) {
restTemplate.put("http://localhost:8080/ingredients/{id}",
ingredient,
ingredient.getId());
}
7.1.4 DELETE 리소스 삭제하기
delete
public void deleteIngredient(Ingredient ingredient) {
restTemplate.delete("http://localhost:8080/ingredients/{id}",
ingredient.getId());
}
📌 요약
- 클라이언트는 RestTemplate을 사용해서 REST API 에 대한 HTTP 요청을 할 수 있다
참고
반응형