ㅇ.ㅇ
[Spring] RestTemplate 본문
반응형

RestTemplate이란?
- Spring Framework에서 제공하는 동기 방식 HTTP 클라이언트 도구
- 서버 사이의 RESTful API 통신을 간편하게 처리할 수 있다.
- JSON/XML 응답을 Java 객체로 매핑할 수 있다.
- 다양한 HTTP 메서드(GET, POST, PUT, DELETE 등) 지원한다
- Spring Boot 2.4 이후로는 RestTemplate에는 더이상 기능이 추가되지 않는다고 하며, WebClient(비동기) 사용을 권장한다고 한다.
⇒ 주로 외부 REST API와 통신할 때 사용되며, 서버 간의 데이터 송수신(요청/응답)을 Java로 쉽게 구현할 수 있습니다.
기본구조
RestTemplate restTemplate = new RestTemplate();
String url = "https://api.test.com/users/1";
User user = restTemplate.getForObject(url, User.class);
// getForObject(): 응답 본문만 객체로
// User.class: 응답을 매핑할 DTO
주요 메서드
메서드 | 설명 |
getForObject() | GET 요청을 보내고 객체 형태로 응답 받기 |
getForEntity() | GET 요청 후 응답 본문 + 상태코드 등 전체 응답 받기 |
postForObject() | POST 요청을 보내고 객체 형태로 응답 받기 |
postForEntity() | POST 요청 후 전체 응답 받기 |
exchange() | HTTP 메서드, 헤더, 바디 등을 자유롭게 설정 가능 |
delete() | DELETE 요청 보내기 |
HttpEntity와 HttpHeaders
- HttpHeaders : 요청 헤더 설정 (Content-Type, Authorization 등)
- HttpEntity : 요청 본문(바디) + 헤더를 하나로 묶는 객체
- ResponseEntity : 응답 전체 (본문, 상태 코드, 헤더 포함)
메서드 | HttpEntity 사용 가능 여부 | 설명 |
exchange() | ✅ | 요청의 모든 요소를 커스터마이징할 수 있음 |
postForEntity() | ✅ | HttpEntity를 바디로 넘길 수 있음 |
postForObject() | ✅ | HttpEntity를 넘길 수 있음 |
getForEntity() | ❌ | GET 요청이므로 보통 HttpEntity를 넘기지 않음 |
getForObject() | ❌ | GET 요청, 헤더 설정은 exchange()로 대체 |
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer xxx");
ReqDto body = new ReqDto(...);
HttpEntity<ResDto> entity = new HttpEntity<>(body, headers);
ResponseEntity<ResDto> response = restTemplate.exchange(url, HttpMethod.POST, entity, ResDto.class);
간단한 예시
1. GET 요청
RestTemplate restTemplate = new RestTemplate();
String url = "https://api.test.com/users/1";
// JSON → User 클래스로 자동 변환
User user = restTemplate.getForObject(url, User.class);
2. POST 요청
User newUser = new User("kim", "kim@test.com");
User createdUser = restTemplate.postForObject("https://api.test.com/users", newUser, User.class);
3. 커스텀 헤더 + exchange 방식
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", "Bearer access_token");
HttpEntity request = new HttpEntity<>(newUser, headers);
ResponseEntity response = restTemplate.exchange(
"https://api.test.com/users",
HttpMethod.POST,
request,
User.class
);
타임 아웃 설정
타임아웃 설정 : 기본적으로 타임아웃이 없으므로, 반드시 RequestFactory를 사용해 설정하는 것이 좋다.
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setConnectTimeout(3000); // 연결 타임아웃
factory.setReadTimeout(5000); // 읽기 타임아웃
RestTemplate restTemplate = new RestTemplate(factory);
응답 형태별 처리
응답 형태 처리 방식
JSON 객체 {} | @JsonProperty 붙은 DTO 클래스 사용 |
JSON 배열 [] | List<T> 또는 T[]로 처리 |
단순 텍스트 | String.class |
빈 응답 (204 No Content 등) | Void.class |
List<MyDto> result = restTemplate.exchange(
url,
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<MyDto>>() {}
).getBody();
// ParameterizedTypeReference : 제네릭 타입(List<T> 등)을 정확하게 명시할 수 있는 방법
// new ParameterizedTypeReference<List<MyDto>>() {} 이렇게 써야 List 내부 타입까지 정확히 매핑된다
반응형
'Today I Learned' 카테고리의 다른 글
[Spring] React 라우팅을 위한 SPA 서버 세팅 (0) | 2025.04.20 |
---|---|
[Git] Rebase (0) | 2025.03.31 |
[DEV] curl (0) | 2025.03.30 |
[Tomcat] Tomcat의 war-tracker 파일 (0) | 2025.03.28 |
[Git] Stash (0) | 2025.03.23 |