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 |