[Spring In Action5] REST 서비스 사용하기

강동준·2022년 3월 28일
0

SpringInAction5

목록 보기
3/5
post-thumbnail

Spring에서 REST API 요청하는 방법

RestTemplate

스프링 프레임워크에서 제공하는 간단하고 동기화된 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)

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();
}

리로스 수정하기(PUT)

특정 식자재 리소스를 새로운 Ingredient 객체의 데이터로 변경을 할 경우

public void updateIngredient(Ingredient ingredient){
	rest.put("http://localhost:8080/ingredients/{id}",
    		ingredient,
            ingredient.getId());
}

리소스 데이터 추가하기(POST)

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();
}

리소스 삭제하기(DELETE)

public void deleteIngredient(Ingredient ingredient){
	rest.delete("http://localhost:8080/ingredients/{id}",
    			ingredient.getId());
}

Traverson

스프링 데이터 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);
}

자료 출처

profile
성장을 멈추지 않는 백엔드개발자입니다.

0개의 댓글