본문 바로가기
Spring/10. rest-api

FeignClient

by 989898 2025. 3. 17.

📌 FeignClient를 사용하는 이유

FeignClient를 사용하는 이유가 프런트쪽에서 api를 호출하면 FeignClient를 사용해서 프런트에 설정한 api만으로 서버내부에 존재하는 api를 자동으로 호출할 수 있으니까 사용하는거지??

 

네, 맞습니다! 🎯

FeignClient를 사용하는 이유는 정확히 말씀하신 대로, 프런트엔드 또는 외부에서 설정된 API만 호출하면, FeignClient가 내부적으로 서버 내에 존재하는 다른 API를 자동으로 호출하고 데이터를 처리할 수 있기 때문입니다.

📌 다시 정리하면:

  1. FeignClient의 역할:
    • 프런트엔드(또는 클라이언트)가 호출한 API 요청을 받아, 내부적으로 다른 서버(API)로 요청을 전달.
    • 개발자가 직접 HTTP 요청 코드를 작성하지 않아도, FeignClient가 자동으로 서버 간 통신을 처리.
  2. 사용 이유:
    • 코드 간결화: HTTP 요청을 직접 작성하지 않고, 인터페이스와 어노테이션만으로 구현 가능.
    • 자동화: FeignClient가 서버 내부의 API 호출을 자동으로 처리.
    • Eureka 연동 가능: 서비스 이름만으로 동적 서비스 검색 및 호출 가능.
  3. 프런트엔드 관점:
    • 프런트엔드는 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 최종적으로 사용자에게 응답 반환
 

📌 자동 처리가 가능한 이유

  1. FeignClient:
    • FeignClient가 HTTP 요청을 자동으로 생성하여 API Gateway에 전달.
    • 개발자는 단순히 인터페이스 메서드를 호출하면 됨.
  2. Spring Cloud Gateway:
    • 게이트웨이가 Spring Cloud Gateway 설정에 따라 경로(/first-service/**)를 확인하고, 적절한 백엔드 서비스로 라우팅.
  3. 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 개념과 설정

FeignClientSpring 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는 다음과 같은 방식으로 동작합니다:

  1. 🛠️ 인터페이스 정의: 개발자가 FeignClient 인터페이스를 정의하고 @FeignClient 어노테이션으로 설정합니다.
  2. 🔄 프록시 생성: Spring이 애플리케이션 실행 시 런타임에 해당 인터페이스의 구현체(프록시 객체)를 자동으로 생성합니다.
  3. 🚀 메서드 호출 → 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의 메서드를 호출하면:

  1. 🌐 기본 URL (http://localhost:8000)과 메서드에 정의된 경로(/first-service/welcome)가 결합됩니다.
  2. 🚀 결합된 최종 URL로 HTTP GET 요청이 전송됩니다.
  3. 📥 해당 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