Recent Posts
Recent Comments
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
관리 메뉴

ㅇ.ㅇ

[Spring] RestTemplate 본문

Today I Learned

[Spring] RestTemplate

yun_ 2025. 4. 9. 12:54
반응형

 

 

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