📌 FeignClient를 사용하는 이유
FeignClient를 사용하는 이유가 프런트쪽에서 api를 호출하면 FeignClient를 사용해서 프런트에 설정한 api만으로 서버내부에 존재하는 api를 자동으로 호출할 수 있으니까 사용하는거지??
네, 맞습니다! 🎯
FeignClient를 사용하는 이유는 정확히 말씀하신 대로, 프런트엔드 또는 외부에서 설정된 API만 호출하면, FeignClient가 내부적으로 서버 내에 존재하는 다른 API를 자동으로 호출하고 데이터를 처리할 수 있기 때문입니다.
📌 다시 정리하면:
- FeignClient의 역할:
- 프런트엔드(또는 클라이언트)가 호출한 API 요청을 받아, 내부적으로 다른 서버(API)로 요청을 전달.
- 개발자가 직접 HTTP 요청 코드를 작성하지 않아도, FeignClient가 자동으로 서버 간 통신을 처리.
- 사용 이유:
- 코드 간결화: HTTP 요청을 직접 작성하지 않고, 인터페이스와 어노테이션만으로 구현 가능.
- 자동화: FeignClient가 서버 내부의 API 호출을 자동으로 처리.
- Eureka 연동 가능: 서비스 이름만으로 동적 서비스 검색 및 호출 가능.
- 프런트엔드 관점:
- 프런트엔드는 FeignClient가 설정된 API만 호출하면 되고, 내부적으로 어떤 서버(API)가 호출되는지는 몰라도 됨.
- 예를 들어:이 요청이 FeignClient를 통해:로 자동으로 전달되고 처리됨.
프런트엔드 → http://localhost:8085/frontend/first-service
이 요청이 FeignClient를 통해
게이트웨이 → http://localhost:8000/first-service/data
백엔드 → http://localhost:8081/data 로 자동으로 처리됨.
그니까 http://localhost:8085/frontend/first-service (프런트엔드) -> http://localhost:8000/first-service/data (게이트웨이) -> http://localhost:8081/data (백엔드) 로 자동으로 처리된다는 의미지?
네, 정확히 맞습니다! 🎯
말씀하신 대로, 프런트엔드 → 게이트웨이 → 백엔드로 요청이 자동으로 처리되는 구조를 의미합니다. 이를 단계별로 다시 정리하면:
📌 요청 흐름
1️⃣ 프런트엔드 → 프런트 컨트롤러
- 사용자가 프런트엔드 애플리케이션(프런트 컨트롤러)에 요청을 보냅니다.
- 예 : POST http://localhost:8085/frontend/first-service
- 프런트 컨트롤러는 이 요청을 처리하고, FeignClient를 사용하여 게이트웨이에 요청을 전달합니다.
2️⃣ 게이트웨이 → 백엔드 서비스
- FeignClient가 게이트웨이(http://localhost:8000)에 요청을 보냅니다.
- 게이트웨이는 Spring Cloud Gateway 설정에 따라 경로(/first-service/data)를 확인하고, 적절한 백엔드 서비스로 요청을 라우팅합니다.
- 예 : POST http://localhost:8000/first-service/data
- 게이트웨이는 Eureka 서버를 통해 my-first-service의 위치(IP 주소와 포트)를 동적으로 조회합니다.
3️⃣ 백엔드 서비스 처리
- 게이트웨이가 백엔드 서비스(http://localhost:8081)로 요청을 전달합니다.
- 예 : POST http://localhost:8081/data
- 백엔드 서비스는 요청 데이터를 처리하고 응답 데이터를 반환합니다.
4️⃣ 응답 흐름
- 백엔드 서비스가 반환한 응답은 게이트웨이를 통해 다시 프런트 컨트롤러로 전달됩니다.
- 최종적으로 프런트 컨트롤러가 사용자에게 응답 데이터를 반환합니다.
📌 전체 흐름 요약
| 단계 | URL | 설명 |
| 사용자 → 프런트 컨트롤러 | http://localhost:8085/frontend/first-service | 사용자가 프런트엔드에 요청 |
| 프런트 → API Gateway | http://localhost:8000/first-service/data | FeignClient가 게이트웨이에 요청 전달 |
| Gateway → MY-FIRST-SERVICE | http://localhost:8081/data | 게이트웨이가 백엔드 서비스로 요청 전달 |
| MY-FIRST-SERVICE → Gateway | http://localhost:8081/data | 백엔드 서비스가 처리 후 응답 반환 |
| Gateway → 프런트 컨트롤러 | http://localhost:8000/first-service/data | 게이트웨이가 응답을 다시 프런트로 전달 |
| 프런트 컨트롤러 → 사용자 | http://localhost:8085/frontend/first-service | 최종적으로 사용자에게 응답 반환 |
📌 자동 처리가 가능한 이유
- FeignClient:
- FeignClient가 HTTP 요청을 자동으로 생성하여 API Gateway에 전달.
- 개발자는 단순히 인터페이스 메서드를 호출하면 됨.
- Spring Cloud Gateway:
- 게이트웨이가 Spring Cloud Gateway 설정에 따라 경로(/first-service/**)를 확인하고, 적절한 백엔드 서비스로 라우팅.
- Eureka Service Discovery:
- 게이트웨이는 Eureka 서버를 통해 my-first-service의 위치(IP와 포트)를 동적으로 조회.
📌 결론
말씀하신 대로:
http://localhost:8085/frontend/first-service (프런트엔드) → http://localhost:8000/first-service/data (게이트웨이) → http://localhost:8081/data (백엔드)
이 흐름이 FeignClient, Spring Cloud Gateway, Eureka의 조합으로 자동으로 처리됩니다.
이를 통해 개발자는 복잡한 HTTP 통신 코드를 작성할 필요 없이, 간단한 인터페이스와 설정만으로 마이크로서비스 간 통신을 구현할 수 있습니다! 🚀
📌 FeignClient 개념과 설정
FeignClient는 Spring Cloud에서 제공하는 HTTP 클라이언트로, REST API 호출을 간편하게 처리하기 위해 사용됩니다.
FeignClient를 사용하면 HTTP 요청을 직접 작성하지 않고, 인터페이스와 어노테이션만으로 외부 API를 호출하거나 마이크로서비스 간 통신을 구현할 수 있습니다.
📌 FeignClient의 주요 파라미터
FeignClient를 정의할 때 사용하는 주요 파라미터는 다음과 같습니다:
1️⃣ name
- 필수: Eureka 또는 FeignClient의 이름을 지정합니다.
- 이 이름은 서비스 간 통신에서 식별자로 사용됩니다.
- 예:
- blogAdaptor는 이 FeignClient의 이름입니다.
@FeignClient(name = "blogAdaptor")
2️⃣ url
- 선택적: 호출할 API의 기본 URL을 지정합니다.
- 이 URL은 고정된 외부 API를 호출할 때 사용됩니다.
- 예:
- 모든 요청은 http://localhost:8080을 기본 URL로 사용합니다.
@FeignClient(name = "blogAdaptor", url = "http://localhost:8080")
3️⃣ path
- 선택적: 기본 URL 뒤에 붙는 공통 경로를 지정합니다.
- 여러 엔드포인트가 동일한 경로를 공유할 경우 사용하면 편리합니다.
- 예:
- 모든 요청은 http://localhost:8080/api/v1/blogs를 기본 경로로 사용합니다.
@FeignClient(name = "blogAdaptor", url = "http://localhost:8080", path = "/api/v1/blogs")
📌 FeignClient의 주요 개념
1️⃣ 역할
FeignClient는 다음과 같은 역할을 수행합니다:
- 🌐 HTTP 요청 자동 생성: 외부 API 또는 다른 마이크로서비스와 통신을 간단히 처리합니다.
- 🖋️ 인터페이스 기반 설계: 선언적 방식으로 코드를 작성하여 가독성을 높입니다.
- 🔍 Eureka 연동 가능: 서비스 이름만으로 동적 서비스 검색 및 호출이 가능합니다(필요 시).
2️⃣ 동작 방식
FeignClient는 다음과 같은 방식으로 동작합니다:
- 🛠️ 인터페이스 정의: 개발자가 FeignClient 인터페이스를 정의하고 @FeignClient 어노테이션으로 설정합니다.
- 🔄 프록시 생성: Spring이 애플리케이션 실행 시 런타임에 해당 인터페이스의 구현체(프록시 객체)를 자동으로 생성합니다.
- 🚀 메서드 호출 → HTTP 요청 실행: 개발자가 인터페이스 메서드를 호출하면, HTTP 요청이 자동으로 실행됩니다.
📌 코드 예제
@FeignClient(name = "apigateway-service", url = "http://localhost:8000")
public interface GatewayFeignClient {
@GetMapping("/first-service/welcome")
String getFirstServiceData();
}
📌 FeignClient 동작 흐름
1️⃣ @FeignClient에서 설정한 URL
@FeignClient(name = "apigateway-service", url = "http://localhost:8000")
- 🏠 url 속성에 지정된 값(http://localhost:8000)이 기본 URL로 설정됩니다.
- 이 URL은 FeignClient가 요청을 보낼 때 사용할 기본 주소입니다.
2️⃣ 메서드의 @GetMapping
@GetMapping("/first-service/welcome")
String getFirstServiceData();
- 🛤️ 메서드에 붙은 @GetMapping 경로(/first-service/welcome)는 기본 URL 뒤에 추가됩니다.
- 최종적으로 요청이 전송되는 URL은: http://localhost:8000/first-service/welcome
3️⃣ 동작 방식
FeignClient의 메서드를 호출하면:
- 🌐 기본 URL (http://localhost:8000)과 메서드에 정의된 경로(/first-service/welcome)가 결합됩니다.
- 🚀 결합된 최종 URL로 HTTP GET 요청이 전송됩니다.
- 📥 해당 URL을 처리하는 서버(API Gateway 또는 백엔드 서비스)가 요청을 받아 응답을 반환합니다.
📌 예제 흐름
코드:
@FeignClient(name = "apigateway-service", url = "http://localhost:8000")
public interface GatewayFeignClient {
@GetMapping("/first-service/welcome")
String getFirstServiceData();
}
호출:
String response = gatewayFeignClient.getFirstServiceData();
결과:
- FeignClient는 http://localhost:8000/first-service/welcome으로 GET 요청을 보냅니다.
📌 추가 설명
- ⚙️ 만약 @FeignClient의 url 속성이 설정되지 않았다면, Spring Cloud는 서비스 레지스트리(e.g., Eureka)를 통해 서비스 이름(name)으로 URL을 찾습니다.
- 💡 @GetMapping 외에도 @PostMapping, @PutMapping, @DeleteMapping 등 다른 HTTP 메서드도 동일한 방식으로 동작합니다.
📌 결론
네! 😊 FeignClient의 메서드는 @FeignClient에서 설정한 기본 URL과 메서드에 정의된 경로를 결합하여 최종적으로 요청을 보낼 URL을 결정합니다.
예를 들어:
- 🏠 기본 URL: http://localhost:8000
- 🛤️ 메서드 경로: /first-service/welcome
- 🚀 최종 요청 URL: http://localhost:8000/first-service/welcome
'Spring > 10. rest-api' 카테고리의 다른 글
| MSA 환경에서 프런트 엔드를 위한 서버구조 (0) | 2025.03.18 |
|---|---|
| Controller 와 FeignClient에서의 @PathVariable 역할 (0) | 2025.03.17 |
| RestControllerAdvice란? (0) | 2025.03.17 |
| ResponseEntity 작성 규칙 + build()가 붙는 경우 (0) | 2025.03.17 |
| ResponseEntity의 메서드들 (0) | 2025.03.16 |