@EnableFeignClients

2024. 12. 11. 15:17Spring Microservice

@EnableFeignClients

@EnableFeignClientsSpring Cloud OpenFeign을 활성화하기 위해 사용하는 애너테이션입니다.
OpenFeign은 Declarative REST Client로, REST API 호출을 쉽게 구현할 수 있도록 도와주는 Spring Cloud 라이브러리입니다.
이 애너테이션은 Feign 클라이언트를 스캔하고, 해당 인터페이스를 프록시 객체로 생성하여 애플리케이션에서 사용할 수 있게 만듭니다.


Feign이란?

Feign은 RESTful API 호출을 단순화하기 위한 HTTP 클라이언트 라이브러리입니다.
Spring Cloud OpenFeign은 Spring Boot와 통합되어 Feign을 사용하기 쉽게 만들어줍니다.

특징

  1. 선언적 방식의 API 호출:
    • HTTP 요청을 Java 인터페이스로 정의할 수 있습니다.
    • 인터페이스의 메서드와 REST API의 매핑이 자동으로 이루어집니다.
  2. 부가적인 설정 지원:
    • 요청 헤더, 쿼리 파라미터, 경로 변수 등을 쉽게 정의할 수 있습니다.
  3. 로드 밸런싱 및 장애 처리:
    • Spring Cloud LoadBalancer, Hystrix, Resilience4j와 통합 가능.
  4. JSON 직렬화/역직렬화:
    • Spring의 Jackson 라이브러리를 사용하여 자동으로 처리.

@EnableFeignClients의 역할

  1. Feign 클라이언트 스캔:
    • @FeignClient 애너테이션이 붙은 인터페이스를 찾아 Spring Bean으로 등록합니다.
  2. 프록시 생성:
    • HTTP 요청 처리를 위해 인터페이스 기반의 프록시 객체를 생성합니다.
  3. Feign 환경 설정:
    • Feign 클라이언트를 위한 기본 설정 및 커스터마이징이 가능합니다.

사용법

1. Maven/Gradle 의존성 추가

Maven:

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

Gradle:

implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'

2. @EnableFeignClients 활성화

Feign 클라이언트를 사용하려면 @EnableFeignClients를 애플리케이션의 설정 클래스(주로 @SpringBootApplication 클래스)에 추가해야 합니다.

@SpringBootApplication
@EnableFeignClients
public class FeignExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(FeignExampleApplication.class, args);
    }
}
  • 기본 동작: @EnableFeignClients는 기본적으로 @FeignClient 애너테이션이 붙은 인터페이스를 @ComponentScan 범위 내에서 스캔합니다.

3. Feign 클라이언트 정의

@FeignClient 애너테이션을 사용해 REST API 호출을 정의합니다.

@FeignClient(name = "user-service", url = "http://localhost:8080")
public interface UserServiceClient {

    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);

    @PostMapping("/users")
    User createUser(@RequestBody User user);
}
  • name:
    • Feign 클라이언트의 이름을 정의합니다. (서비스 디스커버리를 사용하는 경우 서비스 이름으로 설정)
  • url:
    • REST API의 기본 URL을 정의합니다.
    • Spring Cloud LoadBalancer와 함께 사용할 때는 URL 대신 서비스 이름만 지정하고, @LoadBalanced를 통해 로드 밸런싱을 처리합니다.

4. Feign 클라이언트 사용

정의된 Feign 클라이언트를 Spring Bean으로 주입받아 사용할 수 있습니다.

@RestController
@RequestMapping("/api")
public class UserController {

    private final UserServiceClient userServiceClient;

    public UserController(UserServiceClient userServiceClient) {
        this.userServiceClient = userServiceClient;
    }

    @GetMapping("/users/{id}")
    public User getUserById(@PathVariable Long id) {
        return userServiceClient.getUserById(id);
    }

    @PostMapping("/users")
    public User createUser(@RequestBody User user) {
        return userServiceClient.createUser(user);
    }
}

추가 기능 및 설정

1. 로드 밸런싱

Spring Cloud LoadBalancer와 함께 사용하면 서비스 이름으로 클라이언트를 호출할 수 있습니다.

@FeignClient(name = "user-service")
public interface UserServiceClient {
    @GetMapping("/users/{id}")
    User getUserById(@PathVariable("id") Long id);
}

이 경우, application.yml에 서비스 디스커버리(Eureka 등)를 사용하도록 설정하면 됩니다.

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

2. Feign 설정 커스터마이징

Feign 클라이언트의 기본 설정을 커스터마이징할 수 있습니다.

@Configuration
public class FeignConfig {
    @Bean
    public RequestInterceptor requestInterceptor() {
        return requestTemplate -> {
            requestTemplate.header("Authorization", "Bearer my-token");
        };
    }
}

@FeignClient에서 설정 적용:

@FeignClient(name = "user-service", configuration = FeignConfig.class)
public interface UserServiceClient {
    // ...
}

장점과 단점

장점

  1. 선언적 REST 클라이언트로 코드 작성이 간결.
  2. Spring Cloud LoadBalancer, Eureka, Resilience4j와 쉽게 통합 가능.
  3. JSON 직렬화 및 역직렬화 자동 처리.
  4. 코드 기반의 요청/응답 처리를 줄이고 유지보수를 용이하게 함.

단점

  1. 선언적 방식이라 복잡한 HTTP 요청을 구현하기 어려울 수 있음.
  2. 고성능 API 호출에서는 Netty 기반 HTTP 클라이언트에 비해 약간의 성능 저하.
  3. 디버깅이 어려울 수 있음 (추가적인 로깅 설정 필요).

@EnableFeignClients의 작동 원리

  1. Spring Boot가 시작될 때, @EnableFeignClients를 통해 Spring의 FeignClientsRegistrar가 활성화됩니다.
  2. FeignClientsRegistrar@FeignClient 애너테이션이 붙은 모든 인터페이스를 찾아 Spring Bean으로 등록합니다.
  3. Feign 라이브러리는 인터페이스를 구현한 프록시 객체를 생성하여 HTTP 요청을 처리하도록 만듭니다.

결론

@EnableFeignClients는 Spring Cloud OpenFeign을 활성화하는 핵심 애너테이션으로, RESTful API 호출을 선언적으로 구현할 수 있게 해줍니다. Feign은 마이크로서비스 환경에서 서비스 간 통신을 단순화하고, 로드 밸런싱, 장애 처리, 직렬화 등과의 통합을 통해 생산성을 크게 높여줍니다.

'Spring Microservice' 카테고리의 다른 글

@LoadBalanced  (0) 2024.12.11
eureka server configuration  (0) 2024.12.11
Spring Cloud Bus  (0) 2024.12.11
서비스 디스커버리 클라이언트 Push/Pull  (0) 2024.12.11
Gossip Protocol  (0) 2024.12.11