티스토리 뷰
구 프로젝트에서 신규 프로젝트로 데이터를 반영해줘야 하는 경우가 생겨
HTTP API 호출 클래스인 AsyncRestTemplate 을 사용하려한다.
원래는 Spring5 부터 deprecated 되어 Webclient를 사용했지만,
구 프로젝트가 spring4.3.30 인 관계로 쓸때없는 공수를 투입하지 않기 위해
AsyncRestTemplate 클래스를 활용하려고 한다.
AsyncRestTemplate 를 사용하여 비동기 호출을 하려고 한다.
여러 메뉴에서 해당 기능을 활용하기 위해 각 메뉴의 DTO를 받는 제네릭 메소드로 작성해보았다.
public class HttpApiUtil {
private Logger logger = LoggerFactory.getLogger(this.getClass());
private AsyncRestTemplate asyncRestTemplate;
public HttpApiUtil(AsyncRestTemplate asyncRestTemplate) {
this.asyncRestTemplate = asyncRestTemplate;
}
public <T> void callPostApi(String URL, T DTO) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<T> requestEntity = new HttpEntity<T>(DTO, headers);
ParameterizedTypeReference<T> responseType = new ParameterizedTypeReference<T>() {};
ListenableFuture<ResponseEntity<T>> responseFuture = asyncRestTemplate.exchange(URL, HttpMethod.POST,
requestEntity, responseType );
responseFuture.addCallback(new ListenableFutureCallback<ResponseEntity<T>>() {
public void onFailure(Throwable ex) {
logger.error("failMsg={}", ex.getMessage());
}
public void onSuccess(ResponseEntity<T> result) {
logger.info("API Call Success, response status code={}", result.getStatusCode());
T responsebody = result.getBody();
logger.info("response Result={}", responsebody.toString());
}
});
}
}
Json으로 데이터 주고 받기 위해 ContentType 을 Json 으로 설정하고
리퀘스트 파라미터로 보내기 위해 HttpEntity 에 헤더와 바디값으로 객체생성한다.
응답을 제네릭 타입으로 받기 위해 ParameterizedTypeReference 을 사용했습니다.
AsyncRestTemplate 의 exchange를 사용했고,
응답에 대한 콜백처리를 위해 ListenableFuture를 사용해서 실패했을 때와 성공했을 때를 처리해줬습니다.
* 아마 onSuccess에 200 코드가 아닌 코드도 성공으로 간주할 수 있어서 한번 더 확실하게 조건 걸어주는게 좋을 것 같습니다.
AsyncRestTemplate 빈을 생성해주고 필요 서비스에서 해당 메소드를 사용했습니다.
<beans:bean id="asyncRestTemplate" class="org.springframework.web.client.AsyncRestTemplate"/>
HttpApiUtil httpApiUtil = new HttpApiUtil(asyncRestTemplate);
httpApiUtil.callPostApi("http://localhost:8080/api/setAPI", new Dto(dto.get...));
비동기 api call 호출이 잘되면 아래와 같이 성공로그가 잘 찍히게 됩니다.
[INFO] com.test.common.util.HttpApiUtil - API Call Success, response status code=200
[INFO] com.test.common.util.HttpApiUtil - response Result={result=1, message=API SAVE}
'Java > SpringBoot&Spring' 카테고리의 다른 글
[SpringBoot] JavaMailSender 메일 보내기. (0) | 2023.08.03 |
---|---|
[SpringBoot] 파일다운로드 컨트롤러 (feat.a href) (0) | 2023.07.26 |
[Spring] ObjectMapper, java8 LocalDateTime 유형 직렬화/역직렬화 오류 (feat.Jackson) (0) | 2023.06.08 |
[Spring] IBsheet8 데이터처리 공통 제네릭 메소드 작성. (0) | 2023.06.07 |
[SpringBoot] Security Login 적용하기. (0) | 2023.05.03 |