RestTemplate 이해하기

RestTemplate 란

  • HTTP 통신을 위한 도구로 RestFul API 웹 서비스와의 상호작용을 쉽게 외부 도메인에서 데이터를 가져오거나 전송할 때 사용되는 스프링 프레임워크의 클래스를 의미한다.
  • 다양한 HTTP 메소드 (GET, POST, PUT, DELETE 등)을 사용하며 원격 서버와 ‘동기식 방식'으로 JSON, XML 등의 데이터 형식으로 통신한다.
  • 동기식 방식으로 요청을 보내고 응답을 받을 때까지 블로킹되며, 요청과 응답이 완료되기 전까지 다음 코드로 진행되지 않는다. 원격 서버와 통신할 때는 응답을 기다리는 동안 대기해야 한다.

 

동기 방식 및 비동기 방식

동기 방식은 특정 코드가 끝나고 다음 코드가 실행된다. 그래서 API 방식을 호출하고 응답을 받을때까지 기다렸다가 다음 코드를 실행하는 방식이다.

비동기 방식은 특정 코드가 끝날때까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하는 것을 의미한다.

 

동기방식과 비동기 방식 동작원리

RestTemplate 은 동기방식으로 실행된다. 그래서 다음 코드가 호출이 되려면 코드 1이 실행 완료가 된 후 코드 2가 실행이 된다. RestTemplate 와 동일하게 HTTP 호출을 하는 WebClient 가 있다. WebClient 는 동기 방식이 아닌 비동기 방식을 사용한다.

 

RestTemplate 예제 및 사용법

// RestTemplate 생성
RestTemplate restTemplate = new RestTemplate();

// 요청 매개변수 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentTYpe(MediaType.APPLICATION_JSON);
HttpEntity<ReqeustDto> request = new HttpEntity<>(requestDto, headers);

// HTTP 요청 및 응답 처리
ResponseDto responseDto = restTemplate.exchange(url, HttpMethod.POST, request, ResponseDto.class).getBody();
  1. 먼저 RestTemplate 를 선언합니다.
  2. HTTP 통신시 필요한 헤더 정보를 HttpHeaders 를 통해 추가합니다. 헤더에 어떤 데이터 타입으로 보내줄지 설정해줘야 합니다.
  3. 헤더 정보와 바디 정보를 담을 HttpEntitty 객체를 선언 후 헤더와 바디 정보를 담습니다.
  4. restTemplate.exchange 메소드에 URL 정보, HTTP 통신방식, HttpEntity 정보, 그리고 응답받을 객체를담고 호출합니다.
  5. 위의 메소드를 통해 응답을 받으면 responseDto 객체에 담깁니다.

 

RestTemplate 메소드

메소드 HTTP 방식 Return 타입 설명
getForObject GET Object GET 요청에 대한 결과를 객체로 반환합니다
getForEntity GET ResponseEntity GET 요청에 대한 결과를 ResponseEntity로 반환합니다
postForLocation POST URI POST 요청에 대한 결과로 헤더에 저장된 URI 반환합니다
postForObject POST Object POST 요청에 대한 결과를 객체로 반환합니다
postForEntity POST ResponseEntity POST 요청에 대한 결과를 ResponseEntity로 반환합니다
put PUT void PUT 요청을 실행합니다
patchForObject PATCH Object PATCH 요청을 실행하고 결과를 객체로 반환합니다
delete DELETE void DELETE 요청을 실행합니다
headForHeaders HEADER HttpHeaders 헤더 정보를 추출하고 HTTP HEAD 메서드를 사용합니다
optionsForAllow OPTIONS Set<HttpMethod> 지원되는 HTTP 메서드를 추출합니다
exchange any ResponseEntity 헤더를 생성하고 모든 요청 방법을 허용합니다
execute any T 요청/응답 콜백을 수정합니다

 

헤더 종류

  • 헤더란 지정되거나 전송되는 데이터 블록의 맨 앞에 위치한 데이터를 가리킨다. 특정 프로토콜의 헤더의 내용이나 기능을 제공하기 위한 정보를 담고 있다.
  • 종류 : 종단간 헤더(end-to-end), 홉간 헤더(hop-by-hop), General header, Request header, Response header, Entity header 등이 있다.
  • Content-Type : HTTP 요청 또는 응답에서 ‘전송되는 데이터’ 형식을 지정할 때 사용한다.
  • Accept : 클라이언트가 서버에게 요청한 ‘데이터 유형’을 알려준다. 어떤 타입으로 응답 받을지를 지정한다.

 

HttpHeaders 메소드

메소드 설명
setContentType Content-Type 헤더 설정
setAccept Accept 헤더 설정
add 특정 헤더 추가
addAll 여러 개의 헤더 추가
setBearerAuth Authorization 헤더에 Bearer 토큰 추가
setBasicAuth Authorization 헤더에 Basic 인증 정보 추가
setIfNoneMatch If-None-Match 헤더 추가
setIfModifiedSince If-Modified-Since 헤더 추가
set 특정 헤더 설정

 

ContentType 종류

MediaType Content Type 설명
APPLICATION_JSON application/json JSON 형식
TEXT_PLAIN text/plain 일반 텍스트 형식
APPLICATION_XML application/xml XML 형식
APPLICATION_ATOM_XML application/atom+xml Atom 피드 형식
APPLICATION_FORM_URLENCODED application/x-www-form-urlencoded HTML 폼 형식
APPLICATION_OCTET_STREAM application/octet-stream 임의의 바이너리 데이터
APPLICATION_PDF application/pdf PDF 형식
APPLICATION_RSS_XML application/rss+xml RSS 피드 형식
APPLICATION_XHTML_XML application/xhtml+xml XHTML 형식
IMAGE_GIF image/gif GIF 이미지 형식
IMAGE_JPEG image/jpeg JPEG 이미지 형식
IMAGE_PNG image/png PNG 이미지 형식
MULTIPART_FORM_DATA multipart/form-data 여러 개의 다른 형식의 파트를 하나의 요청에 함께 전송
TEXT_HTML text/html HTML 형식
TEXT_XML text/xml XML 형식