- HTTP 통신을 위한 도구로 RESTful API 웹 서비스와의 상호작용을 쉽게 외부 도메인에서 데이터를 가져오거나 전송할 때 사용되는 스프링 프레임워크의 클래스를 의미합니다.
- 다양한 HTTP 메서드(GET, POST, PUT, DELETE 등)를 사용하며 원격 서버와 ‘동기식 방식’으로 JSON, XML 등의 다양한 데이터 형식으로 통신합니다. - 동기식 방식으로 요청을 보내고 응답을 받을 때까지 블로킹되며, 요청과 응답이 완료되기 전까지 다음 코드로 진행되지 않습니다. 원격 서버와 통신할 때는 응답을 기다리는 동안 대기해야 합니다.
- 자바 객체를 외부 저장소에 저장하거나 네트워크를 통해 전송하기 위해 객체를 데이터 스트림으로 변환하는 과정입니다. 이 과정에서 객체의 필드 값들이 데이터 스트림에 쓰여집니다.
💡 역직렬화(Deserialization)
- 데이터 스트림으로부터 객체를 재구성하는 과정입니다. 이 과정에서 데이터 스트림에서 읽은 값들이 객체의 필드 값으로 설정됩니다. 이 과정에서는 데이터 스트림이 어떤 객체인지 알아야 하므로 객체의 클래스 정보가 함께 전달되어야 합니다.
4. HTTP 요청 및 응답을 다양한 형식으로 처리할 수 있습니다.
💡 RestTemplate을 이용하여 HTTP 요청 및 응답 처리를 수행하는데 여러 가지 형식으로 요청 및 응답 처리를 할 수 있습니다. JSON, XML 및 바이너리 데이터 형식과 같은 데이터 형식으로 응답 처리를 할 수 있고 또한 HTTP 요청 및 응답의 부분을 추출하거나 수정할 수 있습니다.
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
headers.add("Authorization", "Bearer <access_token>");
헤더
이름 값
설명
Accept
-
클라이언트가 서버에서 받기 원하는 미디어 타입을 지정합니다.
Accept
text/plain
일반적인 텍스트 형식을 지정합니다.
Accept
application/json
JSON 형식을 지정합니다.
Accept
application/xml
XML 형식을 지정합니다.
Content-Type
-
서버에서 클라이언트로 보내는 미디어 타입을 지정합니다.
Content-Type
text/plain
일반적인 텍스트 형식을 지정합니다.
Content-Type
application/json
JSON 형식을 지정합니다.
Content-Type
application/xml
XML 형식을 지정합니다.
5. HTTP 요청에 대한 요청 헤더 및 쿼리 매개변수를 설정할 수 있습니다.
💡 HTTP 요청에 대한 요청 헤더 및 쿼리 매개변수를 설정할 수 있습니다.
- 요청 헤더는 RestTemplate의 HttpHeaders 클래스를 사용하여 설정할 수 있습니다. HttpHeaders 클래스의 add() 메서드를 사용하여 요청 헤더에 새 항목을 추가할 수 있습니다.
- 쿼리 매개변수는 RestTemplate의 exchange() 메서드를 호출할 때 UriComponentsBuilder를 사용하여 설정할 수 있습니다. UriComponentsBuilder의 queryParam() 메서드를 사용하여 쿼리 매개변수를 추가할 수 있습니다.
💡 Request Header를 설정합니다. 이 코드에서는 JSON 형식의 Request Body를 사용하므로, Content-Type을 APPLICATION_JSON으로 설정합니다.
// Request Header 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
💡 [참고] HttpHeaders의 메서드 종류
메서드
설명
setContentType(MediaType mediaType)
Content-Type 헤더 설정
setAccept(List<MediaType> acceptableMediaTypes)
Accept 헤더 설정
add(String headerName, String headerValue)
특정 헤더 추가
addAll(Map<String, String> headers)
여러 개의 헤더 추가
setBearerAuth(String token)
Authorization 헤더에 Bearer 토큰 추가
setBasicAuth(String username, String password)
Authorization 헤더에 Basic 인증 정보 추가
setIfNoneMatch(String etag)
If-None-Match 헤더 추가
setIfModifiedSince(ZonedDateTime ifModifiedSince)
If-Modified-Since 헤더 추가
set(String headerName, String headerValue)
특정 헤더 설정
[ 더 알아보기 ] 💡 Content-Type 헤더
- HTTP 요청 또는 응답에서 ‘전송되는 데이터의 형식’을 지정합니다. 이 헤더는 브라우저나 서버가 어떻게 처리해야 할지를 결정합니다. - 예를 들어, text/plain은 일반적인 텍스트 데이터를 나타내고, application/json은 JSON 형식의 데이터를 나타냅니다.
💡 Accept 헤더
- 클라이언트가 서버에게 요청한 ‘데이터 유형’을 알려줍니다. 이 헤더는 클라이언트가 서버로부터 어떤 유형의 데이터를 받기를 원하는지 지정합니다. - 예를 들어, text/html은 HTML 문서를 나타내고, application/json은 JSON 형식의 데이터를 나타냅니다.
💡 If-None-Match 헤더
- ‘캐시 된 리소스를 다시 가져오는 것을 방지’ 하기 위해 사용됩니다. 이 헤더는 이전에 클라이언트에서 가져온 리소스의 ETag 값을 서버에 전송하여, 새로운 ETag 값이 없는 경우, 서버는 304 Not Modified 응답을 반환하여 클라이언트에게 새로운 리소스를 다시 가져올 필요가 없음을 알려줍니다.
💡 If-Modified-Since 헤더
- 클라이언트가 마지막으로 리소스를 가져온 시간’을 지정합니다. 이 헤더는 클라이언트가 리소스가 수정되었는지 여부를 확인하기 위해 사용됩니다. 서버가 클라이언트가 지정한 시간 이후에 리소스를 수정한 경우, 서버는 새로운 리소스를 반환하고, 그렇지 않은 경우 304 Not Modified 응답을 반환하여 클라이언트에게 새로운 리소스를 다시 가져올 필요가 없음을 알려줍니다.
💡 [참고] MediaType 별 종류 설명
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 형식
4. RestTemplate Body & Request Entity 구성
💡 HTTP 요청을 보내기 위한 Request Body 설정과 Request Entity 생성하는 코드입니다.
1. JSON 형태로 객체를 생성하고 전달하려는 값을 넣습니다. 2. 생성된 객체를 toString() 과정을 통해 직렬화(Serialization) 과정을 수행합니다. 3. 직렬화된 문자열과 Header를 포함하여 HttpEntity 객체를 생성합니다.
// Request Body 설정
JSONObject requestBody = new JSONObject();
requestBody.put("key", "value");
// Request Entity 생성
HttpEntity<String> entity = new HttpEntity<String>(requestBody.toString(), headers);
5. API 호출
💡 RestTemplate을 사용하여 HTTP POST 요청을 보내는 예시입니다
1. url 변수에 API Endpoint 주소를 할당합니다.
2. restTemplate.exchange 메서드를 호출하여 HTTP POST 요청을 보냅니다.
💡 해당 부분에서는 RestTemplate에서 통신을 수행한 결과값으로 Response Body 값을 반환받습니다. 동기적인 수행이기에 통신이 완료될 때까지 대기한 상태 이후 결과값을 받습니다.
// Response Body 출력
System.out.println(response.getBody());
7. 모든 과정 요약
💡 해당 RestTemplate의 경우 Spring MVC 기준으로 ‘서비스 레이어’에 등록하여 사용하는 것을 권장합니다.
💡 과정 : 객체 생성 → Header 구성 → Body 구성 → Header, Body를 하여 객체에 넣어둡니다 → API내에 데이터를 포함하여 전송합니다. → 결과값을 반환받습니다.
// RestTemplate 생성
RestTemplate restTemplate = new RestTemplate();
// Request Header 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
// Request Body 설정
JSONObject requestBody = new JSONObject();
requestBody.put("key", "value");
// Request Entity 생성
HttpEntity entity = new HttpEntity(requestBody.toString(), headers);
// API 호출
String url = "<https://example.com/api>";
ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
// Response Body 출력
System.out.println(response.getBody());