티스토리 뷰

반응형

 

 

 

JavaSpring

 

구 프로젝트에서 신규 프로젝트로 데이터를 반영해줘야 하는 경우가 생겨

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}

 

 

 

반응형
댓글
반응형
최근에 올라온 글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday