[Spring Cloud] OpenFeign 공식 문서 파헤치기: 선언적 HTTP 클라이언트의 모든 것
MSA(Microservices Architecture) 구조에서 서비스 간 통신(Inter-service Communication)은 피할 수 없는 과제입니다. 오늘은 이를 가장 자바답고 우아하게 해결하는 Spring Cloud OpenFeign의 핵심 개념과 실무 적용 팁을 정리해 보겠습니다.
1. OpenFeign이란?
Feign은 선언적 HTTP 클라이언트(Declarative HTTP Client)입니다. 인터페이스를 작성하고 어노테이션을 붙이는 것만으로도 실제 HTTP 요청을 수행하는 구현체를 스프링이 자동으로 만들어줍니다. 개발자는 로직에만 집중할 수 있게 됩니다.
2. 시작하기 및 속성 해상도(Attribute Resolution)
의존성 추가 후 @EnableFeignClients를 선언하면 준비완료
@SpringBootApplication
@EnableFeignClients
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
📌 알아두어야 할 개념: 즉시 해석(Eager Resolution)
최근 버전부터는 @FeignClient의 속성값을 빌드 시점(AOT)에 미리 해석하는 것이 기본값이 되었습니다.
이는 애플리케이션 시작 속도를 높이고 메모리를 절약하기 위함입니다. 만약 과거처럼 런타임에 지연 해석(Lazy)이 필요하다면 별도의 설정이 필요합니다.
3. Named Client: 독립된 설정의 핵심
Feign의 가장 중요한 설계 철학 중 하나는 Named Client입니다. 각 Feign 클라이언트는 자신만의 별도 ApplicationContext를 가집니다.
- 개별 설정: 'A 서비스'는 타임아웃 2초, 'B 서비스'는 타임아웃 5초와 같은 독립적 설정이 가능합니다.
- 컴포넌트 구성: Encoder, Decoder, Logger, Contract 등을 클라이언트마다 다르게 갈아 끼울 수 있습니다.
4. 실무 적용 시 필수 체크 포인트
① 타임아웃(Timeout) 설정
네트워크 지연이나 외부 서비스 장애가 내 서비스로 전파되는 것을 막는 첫 번째 방어선입니다.
- ConnectTimeout: 서버와 연결을 맺는 시간 제한
- ReadTimeout: 연결 후 응답 데이터가 오기까지의 시간 제한
② ErrorDecoder: 예외 처리의 정석
Fallback이 단순히 '에러 발생 시 기본값'을 주는 것이라면, ErrorDecoder는 HTTP 상태 코드(4xx, 5xx)에 따라 비즈니스 예외를 던질 수 있게 해줍니다.
"404가 오면 EntityNotFoundException을 던지고, 401이 오면 로그아웃 처리를 하겠다"는 식의 정교한 제어가 가능합니다.
③ 로깅(Logging) 레벨
Feign 로깅은 오직 DEBUG 레벨에서만 작동합니다. 성능과 보안(헤더의 민감 정보 노출 방지) 때문입니다.
NONE,BASIC,HEADERS,FULL네 가지 단계로 제어할 수 있습니다.
5. 장애 탄력성: Circuit Breaker & Fallback
분산 환경에서는 특정 서비스가 죽었을 때 시스템 전체가 마비되지 않도록 하는 것이 중요합니다.
@FeignClient(name = "product-service", fallback = ProductFallback.class)
public interface ProductClient { ... }
@Component
class ProductFallback implements ProductClient {
@Override
public String getProductInfo() {
return "정보를 일시적으로 불러올 수 없습니다.";
}
}
FallbackFactory를 사용하면 어떤 에러(Throwable) 때문에 폴백이 발생했는지 원인 로그를 남길 수 있어 유지보수에 유리합니다.
6. 한 단계 더 나아가는 성능 최적화 팁
🚀 HTTP 커넥션 풀(Connection Pool) 사용
Feign은 기본적으로 JDK의 HttpURLConnection을 사용합니다. 이는 매 요청마다 새로운 연결을 맺기 때문에 성능이 떨어집니다. 실무에서는 반드시 Apache HttpClient나 OkHttp를 사용하여 커넥션을 재사용하도록 설정하세요.
📦 Gzip 압축
요청/응답 데이터 양이 많다면 spring.cloud.openfeign.compression 설정을 통해 네트워크 비용을 줄일 수 있습니다.
7. 요약: 언제 무엇을 써야 할까?
| 상황 | 추천 도구 |
|---|---|
| 일반적인 Spring MVC 기반의 동기 통신 | OpenFeign |
| 대규모 트래픽 처리를 위한 비동기 통신 | WebClient |
| 단순하고 짧은 일회성 HTTP 호출 | RestTemplate (유지 관리 모드) |
OpenFeign은 설정이 간편하지만, 그 내부 동작 원리(Named Context, ErrorDecoder 등)를 이해하고 써야 예상치 못한 장애에 대응할 수 있습니다.
'MSA' 카테고리의 다른 글
| Terraform 입문클릭으로 만들던 인프라를 코드로 관리하기 (0) | 2026.05.15 |
|---|---|
| 로깅(Observability) 완전 정리장애가 나면 어디부터 봐야 할까? (0) | 2026.05.15 |
| API 게이트웨이 (0) | 2026.04.15 |
| 서킷브레이커 (1) | 2026.04.14 |
| 로드밸런싱 (0) | 2026.04.14 |
