의문
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을 직접 지정할 수도 있습니다.
연관성 및 동작 과정
- 클라이언트 정의:
- @FeignClient 어노테이션이 붙은 인터페이스는 RESTful API 호출을 위한 Feign 클라이언트로 정의됩니다. 이 인터페이스는 메서드 시그니처에 따라 HTTP 요청을 생성하고, 응답을 반환합니다.
- Feign 클라이언트 활성화:
- @EnableFeignClients 어노테이션은 Feign 클라이언트를 활성화합니다. 이 어노테이션을 붙이면 Spring Boot 애플리케이션이 실행될 때 @FeignClient 어노테이션이 붙은 모든 인터페이스를 탐지하고, 이를 Feign 클라이언트로 등록합니다.
- 서버 간 통신:
- Feign 클라이언트는 RESTful API 호출을 간편하게 만들 수 있도록 도와줍니다. Feign 클라이언트가 호출되면, Feign은 내부적으로 HTTP 요청을 생성하고, 응답을 처리하여 메서드 호출 결과를 반환합니다.
요약
- @EnableFeignClients는 Feign 클라이언트 기능을 활성화하여, @FeignClient 어노테이션이 붙은 인터페이스를 Feign 클라이언트로 변환할 수 있게 합니다.
- @FeignClient는 RESTful API를 호출하기 위한 클라이언트를 정의하는 어노테이션입니다.
이 두 어노테이션을 함께 사용하면, 마이크로서비스 간의 RESTful API 호출을 쉽고 명확하게 관리할 수 있습니다.
'Spring' 카테고리의 다른 글
@SpringBootTest, @ContextConfiguration, Servlet Context, Servlet, Dispacher Servlet (0) | 2024.08.21 |
---|---|
Layered Architecture (0) | 2024.08.13 |
git ignore, commit history 삭제 (2) | 2024.07.31 |
cannot find method 'value' (0) | 2024.07.31 |
Naver Developer Search API 연동 (0) | 2024.07.31 |