본문 바로가기

프로젝트/고민

RestTemplate -> WebClient 로 리팩토링

문제상황

RestTemplate을 이용하여 카카오 페이 API와 통신하여 결제를 구현하였다.

하지만 RestTemplate이 곧 deprecated 된다는 소식과  WebClient 비동기 및 리액티브 방식을 제공해 성능적으로 뛰어나다는 사실을 알고 이를 사용하게 되었다.

 

간단하게 각각의 특징을 살펴보자

 

RestTemplate 특징

  • 통신을 단순화하고 RESTful 원칙을 지킨다
  • 멀티쓰레드 방식을 사용
  • Blocking 방식을 사용

WebClient 특징

  • 싱글 스레드 방식을 사용
  • Non-Blocking 방식을 사용
  • JSON, XML을 쉽게 응답받는다.
  • 리액티브 프로그래밍
  • 유연한 API

다음은 내가 적용했던 restTemplate을 사용하는 예시이다.

    public HttpEntity<KaKaoSubscriptionResponseDto> requestKaKaoToSubscription(KaKaoSubscriptionRequestDto subscriptionRequestDto) {
        MultiValueMap multiValueMap = setSubscriptionParameter(subscriptionRequestDto);
        HttpEntity<MultiValueMap> httpEntity = requestEntity(multiValueMap, initializePaymentsHeaders());
        return restTemplate.postForEntity(SUBSCRIPTION_URL, httpEntity, KaKaoSubscriptionResponseDto.class);
    }

요청할 url에 헤더, 바디를 담은 httpEntity 객체를 넣어, response 타입을 지정하여 응답을 받는다.

 

다음은 WebClient를 이용해 HTTP 통신을 한 예시이다.

1. 다음의 의존성을 추가해준다.

2. webClient 객체를 생성한다. 생성시 baseUrl이나 defaultHeader등 통신에 필요한 다양한 값을 초기에 설정할 수 있다.

3. 다음은 restTemplate을 이용한 코드가 변화한 실제 모습이다.

경로, 헤더, 바디를 설정하여 요청을 보내준다. retrieve 메소드가 호출될 때 요청이 들어간다.

 

그 후 응답에 따라 유연하게 대처할 수 있다. 이런식으로 stream 형식으로 http 통신을 할 수 있는데 가장 큰 장점은 적은 비용으로 비동기 통신이 가능하다는 점이다.

 

webClient와 resTemplate을 비교하는 이미지다. 1000개가 넘는 호출일 때 webClient의 성능이 훨씬 좋은 것을 알 수 있다. 

 

이를 이용해 기존의 복잡해 보이는 코드에 가독성과 성능을 챙기며 리팩토링 했다. 

 

마치며

처음으로 HTTP 통신을 하는데에 webClient를 이용해 보았다. 모든 기능을 완전히 활용한 것 같진 않아서 아쉬운 마음이 남지만, 추가적으로 학습하여 성능 검증도 직접 해보고 싶다. 또한, openFeign이라는 넷플릭스의 라이브러리도 활용하여 비교해볼 예정이다.