2024. 12. 11. 15:17ㆍSpring Microservice
@EnableFeignClients
@EnableFeignClients
는 Spring Cloud OpenFeign을 활성화하기 위해 사용하는 애너테이션입니다.
OpenFeign은 Declarative REST Client로, REST API 호출을 쉽게 구현할 수 있도록 도와주는 Spring Cloud 라이브러리입니다.
이 애너테이션은 Feign 클라이언트를 스캔하고, 해당 인터페이스를 프록시 객체로 생성하여 애플리케이션에서 사용할 수 있게 만듭니다.
Feign이란?
Feign은 RESTful API 호출을 단순화하기 위한 HTTP 클라이언트 라이브러리입니다.
Spring Cloud OpenFeign은 Spring Boot와 통합되어 Feign을 사용하기 쉽게 만들어줍니다.
특징
- 선언적 방식의 API 호출:
- HTTP 요청을 Java 인터페이스로 정의할 수 있습니다.
- 인터페이스의 메서드와 REST API의 매핑이 자동으로 이루어집니다.
- 부가적인 설정 지원:
- 요청 헤더, 쿼리 파라미터, 경로 변수 등을 쉽게 정의할 수 있습니다.
- 로드 밸런싱 및 장애 처리:
- Spring Cloud LoadBalancer, Hystrix, Resilience4j와 통합 가능.
- JSON 직렬화/역직렬화:
- Spring의 Jackson 라이브러리를 사용하여 자동으로 처리.
@EnableFeignClients의 역할
- Feign 클라이언트 스캔:
@FeignClient
애너테이션이 붙은 인터페이스를 찾아 Spring Bean으로 등록합니다.
- 프록시 생성:
- HTTP 요청 처리를 위해 인터페이스 기반의 프록시 객체를 생성합니다.
- 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 {
// ...
}
장점과 단점
장점
- 선언적 REST 클라이언트로 코드 작성이 간결.
- Spring Cloud LoadBalancer, Eureka, Resilience4j와 쉽게 통합 가능.
- JSON 직렬화 및 역직렬화 자동 처리.
- 코드 기반의 요청/응답 처리를 줄이고 유지보수를 용이하게 함.
단점
- 선언적 방식이라 복잡한 HTTP 요청을 구현하기 어려울 수 있음.
- 고성능 API 호출에서는 Netty 기반 HTTP 클라이언트에 비해 약간의 성능 저하.
- 디버깅이 어려울 수 있음 (추가적인 로깅 설정 필요).
@EnableFeignClients의 작동 원리
- Spring Boot가 시작될 때,
@EnableFeignClients
를 통해 Spring의FeignClientsRegistrar
가 활성화됩니다. FeignClientsRegistrar
는@FeignClient
애너테이션이 붙은 모든 인터페이스를 찾아 Spring Bean으로 등록합니다.- 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 |