본문 바로가기

Spring

@EnableFeignClients, @FeignClient 연관성

 


의문

Order project와 Product project는 별개의 project이다

서로 다른 서버에서 호출하는 것과 같다.

ProductResponseDto getProductById(@PathVariable("id") Long productId); 

 

Order project에서 선언만 하고, 구현은 하고 있지 않다.
어떻게 작동한거지?
Product project에 있는 함수를 어떻게 호출한거지??


@EnableFeignClients, @FeignClient

달아주면 Order Server 1개 ------> Product Servers 여러 대

"로드밸런싱하는 것 알겠는데" 작동하는 방법을 그림으로 설명하겠다.

 

전체 흐름도

이 그림 보면 바로 이해한다

 

 


@EnableFeignClients

Application에 작성

Order Server 1개 ------> Product Servers 여러 대
호출하는 쪽에 달아준다

 

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {

	public static void main(String[] args) {
		SpringApplication.run(OrderApplication.class, args);
	}

}

 


@FeignClient

Interface에 작성

Order Server 1개 ------> Product Servers 여러 대
호출하는 쪽에 달아준다

호출받는 controller의 함수와 일치해야한다

 

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = "product-service")
public interface ProductClient {
    // 응용 계층 DIP 적용을
    // Order 프로젝트에서 Product 프로젝트에 있는 함수를 사용
    @GetMapping("/products/{id}")
    ProductResponseDto getProductById(@PathVariable("id") Long productId);

    @GetMapping("/products/{id}/reduceQuantity")
    void reduceProductQuantity(@PathVariable("id") Long productId, @RequestParam("quantity") int quantity);
}

 


@EnableFeignClients @FeignClient

Spring Cloud Feign을 사용하여 서비스 간의 RESTful API 호출을 간편하게 만드는 데 사용되는 두 가지 주요 어노테이션입니다.

이 어노테이션들은 마이크로서비스 아키텍처에서 서비스 간 통신을 쉽게 구현할 수 있도록 도와줍니다.

 

@EnableFeignClients

  • 목적: @EnableFeignClients는 Spring Boot 애플리케이션에서 Feign 클라이언트를 활성화하기 위해 사용됩니다.
  • 사용 위치: 보통 애플리케이션의 메인 클래스나 설정 클래스에 붙입니다.
  • 설명: 이 어노테이션은 Feign 클라이언트를 자동으로 탐지하고 등록하도록 Spring에게 지시합니다. Feign 클라이언트는 @FeignClient 어노테이션이 붙은 인터페이스를 기반으로 생성됩니다.

@FeignClient

  • 목적: @FeignClient는 Feign 클라이언트를 정의하기 위한 어노테이션으로, RESTful API 호출을 쉽게 만들 수 있도록 인터페이스를 정의합니다.
  • 사용 위치: Feign 클라이언트를 정의할 인터페이스에 붙입니다.
  • 설명: 이 어노테이션은 인터페이스를 Feign 클라이언트로 변환하며, REST API 호출을 위한 메서드를 정의할 수 있습니다. @FeignClient의 name 속성은 서비스의 이름을 지정하며, url 속성을 통해 호출할 서비스의 URL을 직접 지정할 수도 있습니다.

연관성 및 동작 과정

  1. 클라이언트 정의:
    • @FeignClient 어노테이션이 붙은 인터페이스는 RESTful API 호출을 위한 Feign 클라이언트로 정의됩니다. 이 인터페이스는 메서드 시그니처에 따라 HTTP 요청을 생성하고, 응답을 반환합니다.
  2. Feign 클라이언트 활성화:
    • @EnableFeignClients 어노테이션은 Feign 클라이언트를 활성화합니다. 이 어노테이션을 붙이면 Spring Boot 애플리케이션이 실행될 때 @FeignClient 어노테이션이 붙은 모든 인터페이스를 탐지하고, 이를 Feign 클라이언트로 등록합니다.
  3. 서버 간 통신:
    • Feign 클라이언트는 RESTful API 호출을 간편하게 만들 수 있도록 도와줍니다. Feign 클라이언트가 호출되면, Feign은 내부적으로 HTTP 요청을 생성하고, 응답을 처리하여 메서드 호출 결과를 반환합니다.

요약

  • @EnableFeignClients는 Feign 클라이언트 기능을 활성화하여, @FeignClient 어노테이션이 붙은 인터페이스를 Feign 클라이언트로 변환할 수 있게 합니다.
  • @FeignClient는 RESTful API를 호출하기 위한 클라이언트를 정의하는 어노테이션입니다.

이 두 어노테이션을 함께 사용하면, 마이크로서비스 간의 RESTful API 호출을 쉽고 명확하게 관리할 수 있습니다.