문제상황
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이라는 넷플릭스의 라이브러리도 활용하여 비교해볼 예정이다.
'프로젝트 > 고민' 카테고리의 다른 글
낙관적 락을 이용한 성능 개선 with JMeter (0) | 2023.03.10 |
---|---|
스프링 배치 적용해보기 (0) | 2023.03.06 |
팩토리 메소드 패턴으로 리팩토링 (0) | 2023.03.01 |
낙관적 락을 적용하여 동시성 문제 해결하기 (0) | 2023.02.21 |
프로젝트에 vault 적용하기 (0) | 2023.01.11 |