본문 바로가기
Kotlin Spring/Kotlin Spring 강의 내용

[부록] REST 기반 마이크로 서비스 간 통신 - OpenFeign

by Bill Lab 2026. 1. 20.
728x90

1. 모든 내부 통신을 Kafka 기반 비동기 이벤트로 처리하면?

    1) 주문하기와 같은 로직 처리 시 동기로 장바구니 data를 가지고 와야 하는데 kafka 이용 시 성능 감소 및 복잡성 증대

         (return 받기 까지 처리시, consumer 제어에서 db 로 부터 data 를 가지고 와서 호출자에게 전달 할 때 - 폴링, 웹소켓등을 사용하여 전달 하여야 함!)

    2) 소스레벨의 복잡성 증대로 인해, 개발 비용 증가

    3) Kafka 이슈 발생 시 조회도 막힘(서킷 브레이커 fallback 지점 증가)    

 

 

2. OpenFeign 이란?

     1) netflix 에 의해 개발 됨(선언적 http client 도구)

     2) HTTP API 호출을 인터페이스 선언만으로 추상화 가능

https://spring.io/projects/spring-cloud-openfeign

 

Spring Cloud OpenFeign

 

spring.io

     

 

3. OpenFeign 장점!

      1) 인터페이스를 이용하여 소스 추상화 가능

      2) 어노테이션 기반으로 가독성 향상

      3) 요청/응답에 대한 타입을 컴파일 단계에서 오류 검증 가능

      4) Resilience4j, Hystrix(레거시) 등과 결합하여 타임아웃, 재시도, 서킷 브레이커를 쉽게 적용가능   

      5) 공통 헤더, 인증, 로깅, 인코딩/디코딩을 인터셉터와 설정으로 일관되게 관리 가능

 

 

4. OpenFeign 으로 로직 구현

      1) feign client interface

@FeignClient(
    name = "product-service",                 // Service Discovery 연계
    configuration = ProductFeignConfig.class,
    fallback = ProductClientFallback.class     // 장애 대응
)
public interface ProductClient {

    @GetMapping("/api/products/{productId}")
    ProductResponse getProduct(
        @PathVariable Long productId,
        @RequestHeader("X-USER-ID") Long userId
    );
}

 

      2) DTO

public record ProductResponse(
    Long id,
    String name,
    int price,
    int stockQuantity
) {}

 

      3) 공통 config 설정 

@Configuration
public class ProductFeignConfig {

    @Bean
    public RequestInterceptor authHeaderInterceptor() {
        return requestTemplate ->
            requestTemplate.header("X-INTERNAL-CALL", "true");
    }

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }
}
728x90