RestTemplate vs WebClient vs HttpClient

이주현·2024년 12월 26일

toss

목록 보기
2/2

Toss에게 결제 승인 요청을 보내는 코드를 구현하던 중,

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://api.tosspayments.com/v1/payments/confirm"))
    .header("Authorization", "Basic dGVzdF9za196WExrS0V5cE5BcldtbzUwblgzbG1lYXhZRzVSOg==")
    .header("Content-Type", "application/json")
    .method("POST", HttpRequest.BodyPublishers.ofString("{\"paymentKey\":\"{PAYMENT_KEY}\",\"amount\":100,\"orderId\":\"Y55C1pNjH81_CPUt5BYOs\"}"))
    .build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

Toss는 이렇게 구현이 되어있는걸 보고 HttpClient와 RestTemplate 중 어떤것을 사용해야하나... 고민이 많았다.
왜냐하면 이 부분은 결제니까 보안에 좀 더 민감해야한다고 생각했고, RestTemplate을 사용하면 Spring Boot에게 의존하게 되니 HttpClient를 사용하는것이 더 좋은 방법 아닐까..? 생각하게 되었다.
그런데 더 찾아보니 최근엔 RestTemplate 대신 WebClient를 Spring에서 권장한다는 내용을 보고 세개의 차이가 궁금해져서 찾아보았다.

HttpClient

RestTemplate

WebClient

결제 구현의 특징

  1. 결제에 실패하면 그 즉시 중단되어야하기 때문에 동기적으로 동작하는게 중요하다고 생각했다.
    -> WebClient를 동기처럼 사용 vs 동기적으로 동작하는 RestTemplate
  2. TossPaymentsAPI와 통신할 때, 사이에 어떤 동작이 필요할까?
    WebClient는 보내고 받는 사이에 어떤 동작을 추가할 수 있고,
    RestTemplate은 추가할 수 없다.
    -> 필요없다고 생각해서 RestTemplate이 적합하다고 생각

    RestTemplate을 사용하기로 결정했다.

profile
쫄면?! 만두

0개의 댓글