본문 바로가기

Server Development/Client API

RestTemplete

 

Client는 HTTP 등 다양한 형태로 Server와 통신을 하고 만약 HTTP를 사용한다는 가정하에 서버는 Restful API를 통해 Client가 필요한 데이터를 전달한다. 가끔, 서버 또한 이런식으로 다른 서버에 데이터가 필요한 경우 사용을 하곤한다.

이 때, 한 서버가 클라이언트가 되어 다른 서버에 데이터를 요청하는 방식이 필요하다.

하지만 다르지 않다. 서버또한 HTTP 통신으로 다른 서버와 통신을 한다.

 

어떻게 서버에서 HTTP통신을 할 수 있을까?

자바에서 기본으로 제공해주는 방법을 사용할수도 있지만 RestTemplete으로 통신이 가능하다.

이번엔 RestTemplete을 사용하는 방법에 대해서 정리해보려고 한다.

 

 

RestTemplete

- 스프링에서 제공하는 템플릿으로 HTTP 통신을 가능하게 함.

- Restful 원칙을 지킨다.

- 동기방식으로 처리되며 비동기 방식은 AsyncRestTemplete을 사용한다.

- 여러 메소드를 제공한다.

 

 

동기 방식(Synchronous)

- 요청을 보내고 응답을 받아야만 다음 동작 처리

- 오래 걸리면 시스템 전체에 효율 저하

 

비동기 방식(Asynchronous)

- 요청을 보내고 응답을 기다리지않고 다음 동작 처리

- 다른 작업을 할 수 있으므로 자원을 효율적으로 사용하고 시스템이 효율적

- 하지만 대부분의 상황에서 사용하기 어려운 듯 하다.

 

 

메소드

  • getForObject : Get형식으로 요청하여 객체로 결과를 반환 받음.
  • getForEntity : Get형식으로 요청하여 ResponseEntity로 결과를 반환받음.
  • postForObject : Post형식으로 요청하여 객체로 결과를 반환 받음.
  • postForEntity : Post형식으로 요청하여 ResponseEntity로 결과를 반환받음.
  • delete : Delete형식으로 요청
  • put : Put형식으로 요청
  • pathForObject : Patch형식으로 요청
  • exchage : HTTP헤더를 생성하여 추가할 수 있고 어떤 형식에서도 사용 가능.

 

 

사용 방법

아래 방법은 Naver Open API 중 Short-url 받기를 참고했다.

또한 요청을 보낼때, RequestEntity or HttpEntity를 이용하는데 이는 각자의 취향 차이인 것 같다.

uri를 담아서 객체를 생성하거나 안담고 마지막에 RestTemplete 객체 생성때 담거나 하는 차이가 있다.

응답을 받을 때, 클래스의 객체로 받고싶으면 클래스명.class로 하고 프로퍼티의 이름을 맞춰줘야 제대로 매핑이 된다.

 

// 통신할 서버의 URI 생성
URI uri = UriComponentsBuilder
            .fromUriString("https://openapi.naver.com")
            .path("/v1/util/shorturl")
            .encode()
            .build()
            .toUri();
            
            
// HTTP header 생성
HttpHeaders headers = new HttpHeaders();
headers.setAccept(Arrays.asList(new MediaType[]{MediaType.APPLICATION_JSON}));
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("X-Naver-Client-Id", clientId);
headers.set("X-Naver-Client-Secret", clientSecret);


// Body 생성
바디는 내가 지정한 다양한 클래스로 만들 수 있음.


// HTTP header + Body
// 1. RequestEntity 사용
RequestEntity<바디에 담을 Class이름> requestEntity = RequestEntity
    .post(uri)
    .header("header", headers)
    .body(Class);
    
    
// 2. HttpEntity 사용
HttpEntity<바디에 담을 Class이름> entity = new HttpEntity<>(Class, headers);
ex) String.class


// RestTemplete 객체 생성
RestTemplate restTemplate = new RestTemplate();


// 요청 후 결과 담기
ResponseEntity<응답 Class이름> responseEntity = restTemplate.exchange(requestEntity, 응답받을 클래스 이름);
ResponseEntity<응답 Class이름> responseEntity = restTemplate.exchange(uri, HttpMethod.GET, entity, 응답받을 클래스이름);


// 결과 확인
responseEntity.getStatusCode();
responseEntity.getBody();

 

 

 

 

 

 

 

 

 

 

'Server Development > Client API' 카테고리의 다른 글

Object to Network and vise versa  (0) 2023.04.27
Class Validation  (0) 2023.04.01
Restful API  (0) 2023.03.27
API  (0) 2023.03.27