RESTful 웹 서비스와 통신하고 API와 상호 작용하는 편리한 방법을 제공한다.
RestTemplate을 사용하면 GET, POST, PUT, DELETE 등과 같은 다양한 HTTP 메서드를 수행하고 JSON, XML 또는 양식 인코딩 데이터와 같은 다양한 형식의 데이터를 보내고 받을 수 있다. 기본 HTTP 클라이언트의 복잡성을 추상화하고 웹 서비스 사용 프로세스를 단순화한다.
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. 결과를 애플리케이션에 돌려준다.
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