https://velog.io/@bi-sz/Spring-API
지난 게시글에서 외부API 호출 도구를 살펴 보았습니다.
WebClient 를 적용해보고 싶은데 Spring5 를 적용한 프로젝트가 없어서 우선은 RestTemplate 을 선택하였습니다.
Maven 프로젝트 이므로 pom.xml 파일에 의존성을 추가해주었습니다.
apache에서 제공하는 httpcore
, httpclient
의존성을 추가해주었습니다.
RestTemplate 을 생성할 때 어떠한 HTTP Client
를 사용할 것인지 ClientHttpRequestFactorty 를 전달하여 지정할 수 있습니다.
기본 생성자의 경우 내부적으로는 ClientHttpRequestFactory 의 구현체인 SimpleClientHttpRequestFactory 를 사용하여 초기화 합니다.
jdk가 기본으로 제공하는 HttpURLConnection 을 통해 ClientHttpRequest 객체를 생성합니다.
HttpComponentsClientHttpRequestFactory 를 생성자에 넘겨 사용할 수 있습니다.
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;
}
}
properties 파일에 url 정보를 추가해주었습니다.
Builder 패턴을 이용하여 RestTemplate 으로 HTTP 요청을 할 Util 클래스를 생성해주었습니다.
url
을 설정하고, 헤더
를 설정하고, 파라미터
를 설정하고 API 를 호출해줍니다.
API 호출을 통해 받은 response 값을 Map 으로 변환, 시간 포맷, String, JSON 타입 변환 등의 작업도 아래에 추가해주었습니다.
Util 파일에 메시지를 전송하는 API를 호출하는 sendMessage 함수를 만들어주었고 이제 함수를 호출하여 API를 사용할 수 있습니다.
Controller 에서 호출하여 사용해주었습니다.
잘 동작하였고,, 추후에 쓸 일이 많을거 같아서 갖다 쓰려고 정리한 글 ..