[스프링 인 액션] 7장 RestTemplate : REST 서비스 사용하기

    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 요청을 할 수 있다

    참고

    반응형

    댓글

    Designed by JB FACTORY