[Spring] RestTemplate 사용해보기

bi_sz·2023년 12월 19일
0

Spring

목록 보기
2/2
post-thumbnail
post-custom-banner

https://velog.io/@bi-sz/Spring-API
지난 게시글에서 외부API 호출 도구를 살펴 보았습니다.
WebClient 를 적용해보고 싶은데 Spring5 를 적용한 프로젝트가 없어서 우선은 RestTemplate 을 선택하였습니다.


⭐ RestTemplate 사용을 위해 의존성 추가

Maven 프로젝트 이므로 pom.xml 파일에 의존성을 추가해주었습니다.

apache에서 제공하는 httpcore, httpclient 의존성을 추가해주었습니다.

RestTemplate 을 생성할 때 어떠한 HTTP Client 를 사용할 것인지 ClientHttpRequestFactorty 를 전달하여 지정할 수 있습니다.
기본 생성자의 경우 내부적으로는 ClientHttpRequestFactory 의 구현체인 SimpleClientHttpRequestFactory 를 사용하여 초기화 합니다.
jdk가 기본으로 제공하는 HttpURLConnection 을 통해 ClientHttpRequest 객체를 생성합니다.
HttpComponentsClientHttpRequestFactory 를 생성자에 넘겨 사용할 수 있습니다.


⭐ RestTemplate

package egovframework.com.api.RestTemplateUtil;

import java.net.URI;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

@Component
public class RestTemplateUtil {

    public HashMap<String, Object> send(Map<String, String> param, String url, HttpHeaders header) {
    	
    	// 결과값을 담을 객체 생성
        HashMap<String, Object> result = new HashMap<String, Object>();
        if(ObjectUtils.isEmpty(param)) {
            result.put("ERROR", "수신 패킷 전송 오류");
            return result;
        }
        if(StringUtils.isEmpty(url)) {
            result.put("ERROR", "수신 패킷 전송 오류");
            return result;
        }
        if(header == null) {
            result.put("ERROR", "수신 패킷 전송 오류");
            return result;
        }

        try {
        	// 타임아웃 설정 시 HttpComponentsClientHttpRequestFactory 객체 생성
            HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
            factory.setConnectTimeout(5000); //타임아웃 설정 5초
            factory.setReadTimeout(5000);//타임아웃 설정 5초
            
//            //Apache HttpComponents : 각 호스트(IP와 Port의 조합)당 커넥션 풀에 생성가능한 커넥션 수
//            HttpClient httpClient = HttpClientBuilder.create()
//                                                    .setMaxConnTotal(50)//최대 커넥션 수
//                                                    .setMaxConnPerRoute(20).build();
//            factory.setHttpClient(httpClient);
            
            // RestTemplate 객체 생성
            RestTemplate restTemplate = new RestTemplate(factory);

            // 설정한 Header와 Body를 가진 HttpEntity 객체 생성
            HttpEntity<?> entity = new HttpEntity<>(param, header);     // 요청하기 위해 body와 header합치기
            // HTTP POST 요청
            ResponseEntity<String> response = restTemplate.exchange(new URI(url), HttpMethod.POST, entity, String.class);            
            // result로 응답받은 결과를 출력
            JSONObject jsonObj = new JSONObject(response.getBody());

            if(!ObjectUtils.isEmpty(jsonObj)) {
                result.put("result", jsonObj);
            }

        } catch (Exception e) {
            result.put("ERROR", "api 호출 에러");
            e.printStackTrace();
            return result;
        }
        
        return result;
    }
}

⭐ 요청 URL 설정

properties 파일에 url 정보를 추가해주었습니다.


⭐ RestTemplate Butilder Util

Builder 패턴을 이용하여 RestTemplate 으로 HTTP 요청을 할 Util 클래스를 생성해주었습니다.

url을 설정하고, 헤더를 설정하고, 파라미터를 설정하고 API 를 호출해줍니다.

API 호출을 통해 받은 response 값을 Map 으로 변환, 시간 포맷, String, JSON 타입 변환 등의 작업도 아래에 추가해주었습니다.

Util 파일에 메시지를 전송하는 API를 호출하는 sendMessage 함수를 만들어주었고 이제 함수를 호출하여 API를 사용할 수 있습니다.

⭐ API 호출 함수 사용하기

Controller 에서 호출하여 사용해주었습니다.


잘 동작하였고,, 추후에 쓸 일이 많을거 같아서 갖다 쓰려고 정리한 글 ..

profile
https://li-yo.tistory.com/ 티스토리 블로그 이전 하였습니다.
post-custom-banner

0개의 댓글