OpenFeign과 Http Interface
1. WebClient의 불편함과 어려움
과거 외부 API 호출 시 RestTemplate를 사용했었고, 한 기업에서 만나 본 외부 API 호출 코드는 각기 다른 개발자들의 특성이 묻어 있는 다양한 WebClient 코드였습니다. 다양한 반복 코드와 비동기/동기를 넘나드는 복잡함은 코드 분석에 꽤 많은 시간을 소비하게 만들었습니다.

2. 사용하기 쉬운 솔루션 찾기
점점 많아지는 외부 호출을 간편하게 할 수 있는 솔루션을 찾던 중 OpenFeign을 찾을 수 있었고, OpenFeign을 공부하던 중 Http Interface를 알게 되었습니다. 소위 선언적 HTTP Client라고 불리는 이 도구들은 인터페이스 선언만으로 간편하게 외부 호출 기능을 만들 수 있습니다. 전자는 Netflix가 처음 개발하고 Spring Cloud에 포함된 동기식 방식이고, 후자는 스프링 프레임워크 6에서 도입된 HTTP Client 추상화 도구입니다.
| 비교 항목 | OpenFeign | HTTP Interface |
|---|---|---|
| 어노테이션 | @FeignClient | @HttpExchange |
| 의존성 | spring-cloud-starter-openfeign | 기본 |
| 리액티브 지원 | X(찾아보면 가능) | 기본 지원 |
| 서킷 브레이커 | @FeignClient(fallback=…) | 어렵게 어렵게 가능은 함 |
| Bean 스캔 | @EnableFeignClients 자동 스캔 | 수동 등록 |
| 타임아웃 설정 | YAML: connect-timeout: 2000 | WebClient Builder에서 구성 |
| 러닝커브 | 매우 쉬움 | 쉬운 편 → 더 쉬워질 예정 |
3. OpenFeign
OpenFeign은 “기능 완성 상태(Feature Complete)”로, 더 이상의 기능 추가가 중단된 상태입니다. 스프링 공식 지원 기능인 Http Interface와 기능이 중복되기 때문에 더 이상 적극적으로 개발할 이유가 없는 셈이며, 앞으로는 Http Interface를 활용하게 될 가능성이 높습니다. 그럼에도 굳이 OpenFeign을 언급하는 이유는 압도적인 편리함 때문입니다. 뒤늦게 알게 되어 한 기업에서는 사용해보지 못했지만, 현재 프로젝트에서 호출 시 OpenFeign을 사용해보고 있습니다.
Dependency → 의존성 추가

EnableFeignClients → FeignClient를 찾아서 빈 생성

클라이언트 설정 → application.yml로 옮기는 것이 더 좋음

Feign Client 코드 → Endpoint와 Request/Response 객체 정의만 하면 끝

4. 궁극적으로는 Http Interface
궁극적으로는 Http Interface를 사용하는 것이 좋습니다. Http Interface는 RestClient를 사용해 동기식 API를 만들 수도 있고, WebClient와 함께 사용해 비동기식도 가능합니다. 사용법이 현재 OpenFeign보다는 복잡하지만 앞으로 점점 OpenFeign처럼 편리해지기 위한 기능이 추가될 예정이기도 합니다.
개인적으로는 러닝커브가 거의 없는 OpenFeign으로 조금 더 활용하다가, Http Interface의 러닝커브가 더 낮아지면 전환하는 것도 크게 나쁘지 않다고 생각합니다. 하지만 남들보다 좀 더 빠르게 앞으로 대세가 될 기술을 접하고 싶다면, 당연히 Http Interface를 선택하는 것이 좋겠습니다.
zacca