TIL

20230118 TIL 서버에서 외부 API에 요청하기

jiwoosmile 2023. 1. 18. 17:54

http://t1.daumcdn.net/kakaopay/brand_site/img/og/kakaopay_og_20201217.png

카카오 API처럼 외부 API를 사용하는 경우에 서버에서 http 요청을 보내야 하는 경우가 있다.

클라이언트에서 외부 API를 사용하는 것은 내가 만든 서버에 요청하는 것과 큰 차이가 없지만,

서버에서는 API응답만 해보았지 요청을 해본 적이 없어서 어떻게 해야하나 고민이 많았는데,

스프링에서는 RestTemplate이라는 스프링에서 제공하는 HTTP 클라이언트 라이브러리가 있다고 한다!

 

RestTemplate을 이용하면 URL로 요청을 보내거나 응답을 받을 수 있다.

 

아래와 같이 카카오페이 결제를 하는 과정에서 RestTemplate을 활용하였고,

postForObject 메서드를 이용해서 POST요청을 보냈고,

받아온 값에서 getter를 통해 필요한 redirect url을 얻을 수 있었다.

        RestTemplate restTemplate = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();
        headers.add("Authorization", "KakaoAK " + adminKey);
        headers.add("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");

        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();

        params.add("cid", "TC0ONETIME");
        params.add("partner_order_id", orderId);
        params.add("partner_user_id", String.valueOf(userId));
        params.add("item_name", productName);
        params.add("quantity", String.valueOf(quantity));
        params.add("total_amount", String.valueOf(orderPayment));
        params.add("tax_free_amount", "0");
        // TODO: 배포 후 url 수정
        params.add("approval_url", "http://localhost:8080/order/success");
        params.add("cancel_url", "http://localhost:8080/order/cancel");
        params.add("fail_url", "http://localhost:8080/order/fail");

        HttpEntity<MultiValueMap<String, String>> body = new HttpEntity<>(params, headers);

        try {
            kakaoPayReady = restTemplate.postForObject(new URI(HOST + "/v1/payment/ready"), body, KakaoPayReady.class);

            return kakaoPayReady.getNext_redirect_pc_url();

 

이때 리디렉션 url을 어떻게 반환을 해야하나 고민이 되었는데,

상태 코드를 둘러보다가 303 (See Other)이 적합해보였다.

303은 다른 URL로 리디렉션을 지시할 때 사용한다고 한다.

300번 대 다른 코드들은 보통 해당 리소스 주소가 이동했을 때에 대한 코드인데,

클라이언트가 새로운 URL에 접근하게 해야하는 상황이기 때문에 303이 가장 적합해보였다.

 

외부 API를 많이 적용해보지 않아서 진행하는 속도가 매우 더뎠는데,

그래도 한 번 하고 나니 리디렉션을 해야할 때는 어떤식으로 작업을 하면 될지 감이 잡혔다.

조급해 하지 말고 하나씩 차근차근 익혀보자!