[1] OpenFeign

2025. 10. 20. 16:11·MSA/MSA 아키텍처

1. OpenFeign: 마이크로서비스 간 REST API 호출을 간결하게

 마이크로서비스 아키텍처(MSA)에서는 각 서비스가 독립적으로 기능을 수행하며, 필요한 경우 다른 서비스와 통신하여 데이터를 주고받아야 한다. 이때 서비스 간 통신 방식 중 하나로 REST API 호출이 널리 사용된다. Spring Cloud 환경에서 이러한 REST API 호출을 더욱 간편하고 선언적으로 구현할 수 있도록 도와주는 도구가 바로 OpenFeign이다.


2. OpenFeign이란 무엇인가?

 OpenFeign은 Netflix에서 개발한 선언적(Declarative) REST 클라이언트인 Feign을 Spring Cloud 생태계에 통합한 라이브러리이다. 개발자는 호출하려는 원격 서비스의 API 엔드포인트를 Java 인터페이스 형태로 정의하기만 하면 OpenFeign이 런타임에 해당 인터페이스의 구현체를 자동으로 생성하여 마치 로컬 메서드를 호출하듯이 원격 API를 사용할 수 있게 해준다.

 

 기존의 RestTemplate이나 WebClient를 사용하여 직접 HTTP 요청을 구성하고 응답을 처리하는 방식에 비해, OpenFeign은 인터페이스 기반의 접근 방식을 통해 코드의 가독성을 높이고 반복적인 작업을 줄여주는 것이 특징이다.


3. Spring Cloud에서 OpenFeign 사용하기

Spring Cloud 프로젝트에서 OpenFeign을 사용하는 단계는 다음과 같다.

[1] 의존성 추가

 pom.xml 파일에 spring-cloud-starter-openfeign 의존성을 추가한다. Maven이나 Gradle과 같은 빌드 도구가 필요한 라이브러리들을 자동으로 관리해 줄 것이다.

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

 

[2] Feign 클라이언트 활성화

 메인 애플리케이션 클래스에 @EnableFeignClients 어노테이션을 추가하여 Spring Boot가 Feign 클라이언트 인터페이스를 스캔하고 구현체를 생성하도록 활성화한다.

@SpringBootApplication
@EnableFeignClients // Feign 클라이언트 활성화
public class UserServiceApplication {
    // ...
}

 

 

[3] 클라이언트 인터페이스 정의

 호출하려는 원격 서비스의 API 명세를 기반으로 Java 인터페이스를 생성하고 @FeignClient 어노테이션을 붙인다.

  • @FeignClient의 name 속성에는 호출할 대상 서비스의 논리적인 이름(보통 서비스 디스커버리에 등록된 이름)을 지정한다.
  • 인터페이스 내 메서드에는 @GetMapping, @PostMapping 등 Spring MVC 어노테이션을 사용하여 실제 호출할 API의 HTTP 메서드, 경로, 파라미터 등을 명시한다.
// OrderServiceClient.java 예시
@FeignClient(name = "order-service") // 호출할 서비스 이름
public interface OrderServiceClient {

    // order-service의 컨트롤러 엔드포인트와 일치해야 함
    @GetMapping("/{userId}/orders")
    List<OrderResponse> getOrders(@PathVariable("userId") Long userId);

}

 

[4] 클라이언트 인터페이스 주입 및 사용

 생성한 Feign 클라이언트 인터페이스를 필요한 컴포넌트(Service, Controller 등)에 @Autowired 또는 생성자 주입을 통해 주입받고, 인터페이스의 메서드를 호출하여 원격 API를 실행한다. OpenFeign은 내부적으로 실제 HTTP 요청 생성, 전송, 응답 처리 등을 자동으로 수행한다.

// FeignOrderServiceAdapter.java 예시
@Component
@Profile("feign")
@RequiredArgsConstructor
public class FeignOrderServiceAdapter implements OrderServiceAdapter {

    private final OrderServiceClient feignClient; // Feign 클라이언트 인터페이스 주입

    @Override
    public List<OrderResponse> getOrders(Long userId) {
        // 인터페이스 메서드 호출만으로 원격 API 실행
        return feignClient.getOrders(userId);
    }
}

 


4. OpenFeign의 주요 특징 및 장점 ✨

  • 선언적 방식: 인터페이스와 어노테이션만으로 API 호출 로직을 정의하므로 코드가 간결하고 직관적이다.
  • Spring MVC 어노테이션 활용: @GetMapping, @PostMapping, @PathVariable, @RequestBody 등 익숙한 Spring MVC 어노테이션을 그대로 사용할 수 있어 학습 곡선이 낮다.
  • 로드 밸런싱 통합: @FeignClient의 name 속성에 서비스 이름을 지정하면, Spring Cloud LoadBalancer (구 Ribbon)와 자동으로 통합되어 서비스 디스커버리를 통해 찾은 여러 인스턴스 중 하나로 요청을 분산시켜 준다. 쿠버네티스 환경에서는 spring-cloud-starter-kubernetes-client-loadbalancer 의존성을 추가하여 쿠버네티스 서비스 기반의 로드 밸런싱도 가능하다.
  • Resilience4j 통합: Spring Cloud Circuit Breaker와 쉽게 통합되어 Feign 호출에 서킷 브레이커, 재시도, Fallback 등의 Resilience 패턴을 적용할 수 있다. UserService.java 코드에서 주석 처리된 부분은 @CircuitBreaker와 Fallback 메서드를 Feign 호출과 함께 사용하는 예시를 보여준다.
  • 커스터마이징: 인코더, 디코더, 로거, 에러 핸들러 등을 커스텀하게 구현하여 Feign의 동작 방식을 확장하거나 변경할 수 있다. FeignErrorDecoder 구현은 Feign 호출 시 발생하는 HTTP 에러 상태 코드에 따라 특정 예외를 반환하도록 처리하는 예시이다. Logger.Level Bean을 설정하여 Feign 호출의 로깅 수준(None, Basic, Headers, Full)을 조절할 수도 있다.

 


5. Kubernetes 환경에서의 고려사항: RBAC 설정 ⚙️

쿠버네티스(k8s) 환경에서 OpenFeign을 사용하여 서비스 디스커버리 및 로드 밸런싱 기능을 활용하려면 추가적인 설정이 필요하다.

  1. k8s API 서버 통신: OpenFeign(및 Spring Cloud Kubernetes)은 @FeignClient(name = "order-service")에 지정된 서비스 이름에 해당하는 파드(Pod)들의 IP 주소와 포트 목록을 알기 위해 쿠버네티스 API 서버에 Endpoints 또는 EndpointSlices 리소스 정보를 조회해야 한다.
  2. RBAC 권한 필요: 보안상의 이유로 k8s API 서버는 모든 접근을 통제한다. 따라서 OpenFeign 클라이언트를 포함하는 애플리케이션 파드가 API 서버에 필요한 정보를 조회하려면, 해당 파드가 사용하는 **ServiceAccount**에 적절한 RBAC(Role-Based Access Control) 권한이 부여되어야 한다.
  3. 권한 설정 예시: 일반적으로 다음과 같은 쿠버네티스 리소스를 정의하여 권한을 부여한다.
    • (Cluster)Role: API 리소스(endpoints, services, pods 등)에 대한 조회(get, list, watch) 권한을 정의한다.
    • ServiceAccount: 애플리케이션 파드가 사용할 서비스 계정을 생성한다.
    • (Cluster)RoleBinding: 생성된 ServiceAccount에 정의된 (Cluster)Role의 권한을 연결(바인딩)한다.
    • 애플리케이션의 Deployment나 Pod 정의에서 spec.serviceAccountName 필드를 사용하여 해당 ServiceAccount를 지정한다.

따라서, 쿠버네티스 환경에서 OpenFeign의 서비스 디스커버리 기능을 사용하려면 반드시 RBAC 설정을 통해 API 서버 접근 권한을 올바르게 부여해야 한다.

'MSA > MSA 아키텍처' 카테고리의 다른 글

[BASIC #1] 마이크로서비스 아키텍처의 이해: Monolithic에서 MSA까지  (0) 2026.03.02
[5] EDA  (0) 2025.10.20
[4] SAGA 패턴  (0) 2025.10.20
[3] CQRS  (0) 2025.10.20
[2] gRPC  (0) 2025.10.20
'MSA/MSA 아키텍처' 카테고리의 다른 글
  • [5] EDA
  • [4] SAGA 패턴
  • [3] CQRS
  • [2] gRPC
h6bro
h6bro
백엔드 개발자의 기술 블로그
  • h6bro
    Jun's Tech Blog
    h6bro
  • 전체
    오늘
    어제
    • 분류 전체보기 (250) N
      • Java (18)
        • Core (9)
        • Design Pattern (9)
      • Spring (80)
        • Core (24)
        • MVC (6)
        • DB (10)
        • JPA (26)
        • Monitoring (3)
        • Security (11)
        • WebSocket (0)
      • Database (33)
        • Redis (15)
        • MySQL (18)
      • MSA (25) N
        • MSA 기본 (11)
        • MSA 아키텍처 (14) N
      • Kafka (30)
        • Core (18)
        • Connect (12)
      • ElasticSearch (11)
        • Search (11)
        • Logging (0)
      • Test (4)
        • k6 (4)
      • Docker (9)
      • CI&CD (10)
        • GitHub Actions (6)
        • ArgoCD (4)
      • Kubernetes (18)
        • Core (12)
        • Ops (6)
      • Cloud Engineering (4)
        • AWS Infrastructure (3)
        • AWS EKS (1)
        • Terraform (0)
      • Project (8)
        • LinkFolio (1)
        • Secondhand Market (7)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Cloud Engineering 포스팅 정리
  • 인기 글

  • 태그

    ㅈ
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
h6bro
[1] OpenFeign
상단으로

티스토리툴바