Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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 31
Tags more
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240806 RestTemplate 본문

개발Article

[TIL]20240806 RestTemplate

최밤빵 2024. 8. 6. 21:43

레스트템플릿에 관한 강의를 주특기주차때도 그냥 인텔리제이 나눠사용하니까 서버가 두개? 이렇게만 이해하고 있었다. 7조에 합류하고 해야할게 너무 많은데 갈피는 안잡히고... 여기 프로젝트는 레포지토리가 두개로 나뉘어져있길래 레스트템플릿이 생각나서 오늘 개발일지 소재로 정했다. ( 깔끔한 방이 레스트템플릿인지는 모른다.)

RestTemplate은 스프링에서 제공하는 HTTP 클라이언트로, RESTful 웹 서비스와의 상호작용을 쉽게 할 수 있도록 도와주는 도구이다. RestTemplate을 사용하면 외부 API와의 통신, JSON 데이터를 파싱하여 객체로 변환, 다양한 HTTP 메서드(GET, POST, PUT, DELETE 등) 지원 등을 쉽게 처리할 수 있다.

🤓RestTemplate이란?

RestTemplate은 스프링 프레임워크에서 제공하는 REST 클라이언트로, RESTful 웹 서비스와의 HTTP 통신을 간편하게 해주는 클래스이다. 주로 서버 간의 통신이나 외부 API와의 연동에서 사용되며, RESTful 웹 서비스를 호출할 때 코드의 복잡도를 줄여준다. RestTemplate을 사용하면 HTTP 요청을 만들고, 서버로부터 받은 응답을 자바 객체로 변환하는 과정을 매우 간단하게 구현할 수 있다.

 

▶ RestTemplate의 주요 개념과 기능

RestTemplate의 주요 기능은 다음과 같다:

 

→ 간편한 HTTP 요청/응답 처리:

RestTemplate은 HTTP 요청과 응답을 매우 간단하게 처리할 수 있다. GET, POST, PUT, DELETE와 같은 다양한 HTTP 메서드를 지원하며, 메서드 호출만으로 외부 API와 쉽게 통신할 수 있다.

→ 객체 변환(Object Mapping):

서버에서 받은 JSON, XML 등의 데이터를 자바 객체로 자동 변환해주는 기능을 제공한다. 이를 통해 데이터를 직접 파싱하지 않고도 쉽게 사용할 수 있다.

→ 에러 처리:

RestTemplate은 HTTP 응답 코드에 따른 기본적인 에러 처리를 제공한다. 예외(Exception) 발생 시 적절한 예외를 던져주며, 개발자가 원하는 대로 커스터마이징할 수도 있다.

→ 동기화 처리:

RestTemplate은 기본적으로 동기 방식으로 동작하며, 요청을 보낸 후 응답이 올 때까지 대기한다. 비동기 처리가 필요한 경우, WebClient와 같은 대안도 고려할 수 있다.

 

▶RestTemplate 사용 예시

RestTemplate을 사용하여 외부 API와 통신하는 간단한 예시이다. 여기서는 JSONPlaceholder라는 무료 온라인 REST API의 데이터를 가져오는 예시를 작성하였다.

 

▽ GET 요청을 사용한 데이터 조회 예시

import org.springframework.web.client.RestTemplate;
import org.springframework.http.ResponseEntity;

public class RestTemplateExample {

    private final RestTemplate restTemplate = new RestTemplate();

    public void getPostById(int id) {
        String url = "https://jsonplaceholder.typicode.com/posts/" + id;

        // GET 요청을 통해 데이터를 조회하고, 응답을 ResponseEntity로 받는다.
        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

        if (response.getStatusCode().is2xxSuccessful()) {
            System.out.println("Response: " + response.getBody());  // 성공적으로 응답을 받았을 때 출력
        } else {
            System.out.println("Request failed with status code: " + response.getStatusCode());
        }
    }

    public static void main(String[] args) {
        RestTemplateExample example = new RestTemplateExample();
        example.getPostById(1);  // ID가 1인 게시글 조회
    }
}
 

→ RestTemplate 객체를 생성하고, getForEntity() 메서드를 사용하여 GET 요청을 보낸다.

→ 응답은 ResponseEntity 객체로 받아, 상태 코드와 응답 본문을 확인할 수 있다.

→ 성공적으로 데이터를 조회하면, response.getBody()를 통해 응답 본문을 출력한다.

 

▽ POST 요청을 사용한 데이터 전송 예시

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;

public class RestTemplatePostExample {

    private final RestTemplate restTemplate = new RestTemplate();

    public void createPost() {
        String url = "https://jsonplaceholder.typicode.com/posts";

        // HTTP 요청 헤더 설정
        HttpHeaders headers = new HttpHeaders();
        headers.set("Content-Type", "application/json");

        // 전송할 데이터 생성
        String requestBody = "{\"title\":\"foo\", \"body\":\"bar\", \"userId\":1}";

        // HttpEntity 객체에 데이터와 헤더를 담아 전송
        HttpEntity<String> request = new HttpEntity<>(requestBody, headers);

        // POST 요청 전송
        ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

        if (response.getStatusCode().is2xxSuccessful()) {
            System.out.println("Post created: " + response.getBody());
        } else {
            System.out.println("Failed to create post with status code: " + response.getStatusCode());
        }
    }

    public static void main(String[] args) {
        RestTemplatePostExample example = new RestTemplatePostExample();
        example.createPost();  // 새로운 게시글 생성
    }
}
 

→ POST 요청을 보낼 때는 HttpEntity 객체를 사용하여 요청 본문과 헤더를 설정한다.

→ postForEntity() 메서드를 사용하여 요청을 보내고, 응답을 확인한다.

→ 성공적으로 게시글이 생성되면 응답 본문에 생성된 게시글의 정보를 출력한다.

 

▶RestTemplate 사용 시 주의사항

RestTemplate을 사용할 때 고려해야 할 중요한 사항들은 다음과 같다:

 

→ 에러 처리의 중요성:

RestTemplate은 기본적으로 예외를 던져 에러를 처리하므로, 필요한 경우 ResponseErrorHandler를 구현하여 커스텀 에러 처리를 설정하는 것이 좋다.

→ 비동기 처리의 대안:

RestTemplate은 동기 방식이므로, 비동기 처리와 높은 성능을 요구하는 상황에서는 WebClient를 사용하는 것이 더 적합할 수 있다.

→ 객체 매핑의 유연성:

JSON 데이터가 복잡한 구조를 가지고 있거나, 커스텀 매핑이 필요할 때 ObjectMapper와 함께 사용하여 더 세밀한 매핑을 구현할 수 있다.

→ 보안 및 성능:

외부 API와 통신할 때 보안 설정(SSL, 인증 토큰 등)을 철저히 해야 하며, 타임아웃 설정 등을 통해 성능 이슈를 최소화해야 한다.

 

▶정리

RestTemplate은 스프링 애플리케이션에서 외부 API와의 통신을 쉽게 할 수 있게 해주는 매우 유용한 도구이다. 하지만 RestTemplate을 공부하면서 몇 가지 고민과 어려움을 느꼈다. 비동기 처리와 높은 성능을 요구하는 경우 레스트템플릿이 적합하지 않을 수 있고, JSON 데이터를 다룰 때 종종 복잡한 객체 매핑 문제가 발생할 수 있다.