스프링 프레임워크에서 제공하는 간단하고 동기화된 REST 클라이언트로 JDBC를 효율적이게 사용하기 위해서 JDBCTemplate를 사용하는 것처럼 REST 리소스와 조금 더 효율적으로 상호작용하기 위해서 사용합니다.
이 RestTemplate 객체의 여러 메소드를 활용하여 REST API의 URL에 접근하여 데이터에 대한 접근, 수정, 추가, 삭제가 가능합니다.
대표적인 메소드로는 다음과 같습니다.
- delete() : 지정된 URL의 리소스에 HTTP DELETE 요청을 수행
- exchange() : 지정된 HTTP 메서드를 URL에 대해 실행하며, 응답 몸체와 연결되는 객체를 포함하는 ResponseEntity를 반환
- excute() : 지정된 HTTP 메서드를 URL에 대해 실행하며, 응답 몸체와 연결되는 객체를 반환
- getForEntity() : HTTP GET 요청을 전송하며, 응답 몸체와 연결되는 객체를 포함하는 ResponseEntitiy를 반환
- getForObject() : HTTP GET 요청을 전송하며, 응답 몸체와 연결되는 객체를 반환
- headForHeaders() : HTTP HEAD 요청을 전송하며, 지정된 리소스의 URL의 Allow 헤더를 반환
- optionsForAllow() : HEAD OPTIONS 요청을 전송하며, 응답 몸체와 연결되는 결과 객체를 반환
- patchForObject() : HTTP PATCH 요청을 전송하며, 응답 몸체와 연결되는 결과 객체를 반환
- postForEntity() : URL에 데이터를 POST하며, 응답 몸체와 연결되는 객체를 포함하는 ResponseEntity를 반환
- postForLocation() : URL에 데이터를 POST하며, 새로 생성된 리소스의 URL을 반환
- postForObject() : URL에 데이터를 POST하며, 응답 몸체와 연결되는 객체를 반환
- put() : 리소스 데이터를 지정된 URL에 PUT한다.
GET 요청을 하는 메소드의 경우 반환값으로 도메인 객체를 받는지 ResponseEntity객체를 받는지에 따라 사용할 수 있습니다.
// 도메인 객체를 반환 받는 경우
public Ingredients getIngredientsById(String ingredientId){
return rest.getForObject("http://localhost:8080/ingredients/{id}",
Ingredient.class, ingredientId);
}
// ResponseEntity 객체를 반환 받는 경우
public Ingredient getIngredientById(String IngredientId){
ResponseEntity<Ingredient> responseEntity =
rest.getForEntity("http://localhost:8080/ingredients/{id}",
Ingredient.class, ingredientId);
return responseEntity.getBody();
}
특정 식자재 리소스를 새로운 Ingredient 객체의 데이터로 변경을 할 경우
public void updateIngredient(Ingredient ingredient){
rest.put("http://localhost:8080/ingredients/{id}",
ingredient,
ingredient.getId());
}
POST 요청의 경우 데이터를 추가한 후 추가된 리소스를 반환을 받거나 해당 리소스의 URI를 반환받을 수 있다.
// 추가된 리소스(도메인 객체)를 반환받는 경우
public Ingredient createIngredient(Ingredient ingredient){
return rest.postForObject("http://localshot:8080/ingredients",
ingredient,
ingredient.class);
}
// 추가된 리소스의 URI를 반환 받는 경우
public URI createIngredient(Ingredient ingredient){
return rest.postForLocation("http://localhost:8080/ingredients",
ingredient);
}
// 둘 다 필요한 경우
public Ingredient createIngredient(Ingredient ingredient){
ResponseEntity<Ingredient> responseEntity =
rest.postForEntity("http://localhost:8080/ingredients",
ingredient,
ingredient.class);
// 리소스 URI
log.info(responseEntity.getHeaders().getLocation());
// 추가된 리소스(도메인 객체)
return responseEntity.getBody();
}
public void deleteIngredient(Ingredient ingredient){
rest.delete("http://localhost:8080/ingredients/{id}",
ingredient.getId());
}
스프링 데이터 HATEOAS에 같이 제공되며, 스프링 애플리케이션에서 하이퍼 미디어 API를 사용할 수 있는 솔루션
Traverson을 사용하기 위해서는 먼저 해당 API의 기본 URI를 가지는 객체를 생성합니다.
Traverson traverson = new Traverson(
URI.create("http://localhost:8080/api"),
MediaTypes.HAL_JSON);
// 데이터를 읽어드리는 타입을 지정
PrameterrizedTypeReference<Resources<Taco>> tacoType =
new ParameterizedTypeReference<Resources<Taco>>() {};
// 가장 최근에 생성된 타코들을 가지고 오는 코드
// http://localhost:8080/api/tacos/recents
Resources<Taco> tacoRes = traverson
.follow("tacos")
.follow("recents")
.toObject(tacoType);
// 불러온 최신 타코 리스트를 Ingredient를 제네릭으로 가지는 Collection 프레임워크의 객체에 저장
Collection<Ingredient> ingredients = tacoRes.getContent();
Traverson을 사용하면 각 리소스마다 하이퍼링크를 가지고 올 수 있지만 GET요청을 통해서 데이터를 가져오기만 할 수 있다. 그렇기 때문에 Traverson과 RestTemplate를 같이 사용하면 특정 리소스의 데이터에 접근한 후 그 데이터에 대해서 REST 요청이 가능합니다.
private Ingredient addIngredient(Ingredient ingredient){ // http://localhost:8080/api/ingredients String ingredientsUrl = traverson .follow(ingredients) .asLink() .getHref(); return rest.postForObject(ingredientsUrl, ingredient, ingredient.class); }
자료 출처