RestTemplate vs WebClient vs RestClient vs HttpInterface vs FeignClient 비교
RestTemplate
- 장점: 커스터마이징이 자유롭고, 오래된 Spring 버전(3.0) 에서도 사용가능하다.
- 단점:
- 오래된 API이며 현재는 유지 보수 모드로 들어가 더 이상의 발전은 없다.
- 다른 클라이언트에 비해 구현이 복잡하다. (템플릿 방식이고 많은 오버라이딩 필요)
- 체이닝 방식의 API를 제공하지 않아 메서드를 일일이 기억하고 확인해야 한다.
WebClient
- 특징: Reactive 방식으로 동작하며, Spring Reactive 스택인 WebFlux 패키지에 포함되어 있다. 사용을 위해 별도의 Spring WebFlux 의존성을 추가해야 한다.
- 장점:
- RestTemplate처럼 Custom하게 HttpClient를 바꿀 수 있고 체이닝 방식의 API를 제공한다.
- 직관적이며 동기와 비동기 모두 제공.
- 단점:
- 비동기 호출이 필요 없을 경우, 매번
block()을 호출해 동기식으로 개발하는 것이 불필요하게 느껴질 수 있다.
- Mono, Flux와 같은 개념에 대한 러닝 커브가 있다.
RestClient
- 특징: WebClient의 모던하고 유연한 API 특징 + RestTemplate와 같은 동기식 요청.
- 장점:
- RestTemplate과 같은 인프라를 제공하고, 자유롭게 커스터마이징할 수 있다.
- Spring에서 제공하는 가장 최신(기준 Spring 6.1)의 동기식 REST 클라이언트.
- 마이그레이션:
- RestTemplate을 사용 중이라면, 더 모던하고 편리한 API 구성을 원할 때 RestClient로 마이그레이션하는 것도 좋은 선택이다. (메서드별 비교 문서 제공)
HttpInterface
- 특징: OpenFeign처럼 인터페이스만으로 API를 호출하는 구현체를 동적으로 생성.
- 장점:
- 어떤 클라이언트(RestClient, RestTemplate, WebClient)를 사용할지 커스텀하게 정할 수 있다.
- 기존 클라이언트를 더욱 편하게 사용할 수 있도록 하는 기능.
- 어노테이션이 붙은 인터페이스를
HttpServiceProxyFactory 클래스에 전달하여 RestClient 또는 WebClient와 같은 HTTP 클라이언트를 통해 요청을 수행하는 프록시를 생성.
- 단점:
FeignClient
- 특징: Spring MVC 스택에 포함되지 않고 Spring Cloud OpenFeign 프로젝트에 있다. (따라서 별도의 의존성 추가 필요)
- 장점:
- 인터페이스 선언만으로 클라이언트 기능 구현 가능.
- Spring에서 Retry를 별도로 제공하지만, FeignClient는 Retry 설정을 추가로 제공한다.
- Fallback 처리가 유연하다.
- 다양한 설정(encoder, decoder, fallback 클래스 선정 등)을 설정파일(application.properties)에서 정의할 수 있다.
- 단점:
결론
- OpenFeign 또는 RestClient + HttpInterface 조합이 가장 좋아 보인다.
- 단, Retry나 Fallback 같은 로직은 HttpInterface에서 정의하지 않으며, RestClient에서 정의해야 한다. RestClient는 OpenFeign처럼 별도의 Retry 기능을 제공하지 않기 때문에 직접 구현해야 하는 단점이 있다.