20230706 [Spring] RestTemplate이란?

Daisy🌷·2023년 7월 6일
0

RestTemplate란?

RestTemplate은 HTTP 요청을 만들고 응답을 처리하기 위한 Spring Framework의 클래스다.

RESTful 웹 서비스와 통신하고 API와 상호 작용하는 편리한 방법을 제공한다.

RestTemplate을 사용하면 GET, POST, PUT, DELETE 등과 같은 다양한 HTTP 메서드를 수행하고 JSON, XML 또는 양식 인코딩 데이터와 같은 다양한 형식의 데이터를 보내고 받을 수 있다. 기본 HTTP 클라이언트의 복잡성을 추상화하고 웹 서비스 사용 프로세스를 단순화한다.

RestTemplate의 특징

  • Spring 3.0부터 지원하는 Spring의 HTTP 통신 템플릿
  • HTTP 요청 후 JSON, XML, String과 같은 응답을 받을 수 있는 템플릿
  • Blocking I/O 기반의 동기 방식을 사용하는 템플릿
  • RESTful 형식에 맞추어진 템플릿
  • Header, Content-Type 등을 설정하여 외부 API 호출
  • Server to Server 통신에 사용

동작 원리


1. 애플리케이션이 RestTemplate을 생성하고, URI, HTTP메소드 등의 헤더를 담아 요청한다.
2. RestTemplate은 HttpMessageConverter를 사용하여 requestEntity를 요청메세지로 변환한다. 메시지 형태는 상황에 따라 다르다.
3. RestTemplate은 ClientHttpRequestFactory로부터 ClientHttpRequest를 가져와서 요청을 보낸다.
4. ClientHttpRequest는 요청메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신한다.
5. RestTemplate이 에러 핸들링을 한다.
6. ResponseErrorHandler는 오류가 있다면 ClientHttpResponse에서 응답데이터를 가져와서 처리한다.
7. RestTemplate은 HttpMessageConverter를 이용해서 response body의 응답메세지를 java object(Class responseType)로 변환한다.
8. 결과를 애플리케이션에 돌려준다.

예시 코드

아래 코드에서 RestTemplate은 https://kauth.kakao.com/oauth/token 엔드포인트로 POST 요청을 보내고, 인증 코드를 전달하여 엑세스 토큰을 얻는다.

public OauthToken getAccessToken(String code) {

		// RestTemplate 생성
        RestTemplate restTemplate = new RestTemplate();
        
		// 요청 헤더를 설정
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
        
        // 전달할 요청 파라미터를 설정
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("grant_type", "authorization_code");
        params.add("client_id", client_id);
        params.add("redirect_uri", FRONT_URL + "/redirect");
        params.add("code", code);

		// 요청 파라미터와 헤더를 포함한 'HttpEntity' 생성
        HttpEntity<MultiValueMap<String, String>> kakaoTokenRequest =
                new HttpEntity<>(params, headers);
                
		// RestTemplate의 exchange() 메서드를 사용하여 POST 요청을 보냄. 
        ResponseEntity<String> accessTokenResponse = restTemplate.exchange(
                "https://kauth.kakao.com/oauth/token",
                HttpMethod.POST,
                kakaoTokenRequest,
                String.class
        );

		// JSON 응답을 객체로 변환하기 위해 ObjectMapper를 사용함.
        ObjectMapper objectMapper = new ObjectMapper();
        OauthToken oauthToken = null;

        try {
            oauthToken = objectMapper.readValue(accessTokenResponse.getBody(), OauthToken.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return oauthToken;
    }

<참고 자료>
https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
https://dejavuhyo.github.io/posts/spring-resttemplate/
https://sjh836.tistory.com/141

profile
티스토리로 블로그를 이전했습니다. 😂 구경 오세요! 👉🏻 https://u-ryu-logs.tistory.com

0개의 댓글