2026. 1. 4. 22:01ㆍSpring Microservice/Service Discovery
🚀 Invoking Services with Netflix Feign Client
선언형 REST 클라이언트로 마이크로서비스 호출하기
마이크로서비스 환경에서 다른 서비스를 호출하는 방법은 여러 가지가 있습니다.
앞선 방식에서는 Spring Cloud Load Balancer가 적용된 RestTemplate을 사용했지만, 이번에는 Netflix Feign Client를 활용한 완전히 다른 접근 방식을 살펴보겠습니다. 🔍
Feign은 “REST 호출 코드를 작성하지 않아도 되는” 선언형(Declarative) HTTP 클라이언트입니다.
즉, 인터페이스만 정의하면, Spring Cloud가 실제 호출 로직을 대신 생성해줍니다. 💡
🧠 Feign Client의 핵심 아이디어
Feign은 RESTFul API 서비스를 호출하기 위해 직접 코드로 HTTP 요청을 작성하지 않습니다.
대신 다음과 같은 방식을 사용합니다.
✅ Java 인터페이스 정의
✅ Spring Cloud 어노테이션으로 서비스 매핑
✅ Spring Cloud가 동적으로 프록시 클래스 생성
✅ Eureka + Spring Cloud Load Balancer 연동
결과적으로, 개발자는 REST 호출 로직을 한 줄도 작성하지 않아도 됩니다.
오직 “어떤 서비스의 어떤 엔드포인트를 호출할 것인지” 만 정의하면 됩니다. 🎯


🔧 Feign Client 활성화하기
Feign Client를 사용하려면 라이선싱 서비스(Licensing Service) 에서 Feign 기능을 활성화해야 합니다.
이를 위해 @EnableFeignClients 어노테이션을 애플리케이션 클래스에 추가합니다.
📂 경로
src/main/java/com/optimagrowth/license/LicenseServiceApplication.java
📌 코드
@SpringBootApplication
@EnableFeignClients
public class LicenseServiceApplication {
public static void main(String[] args) {
SpringApplication.run(LicenseServiceApplication.class, args);
}
}
✨ 이 한 줄의 어노테이션으로 Spring Cloud는 다음을 자동으로 수행합니다.
- Feign Client 인터페이스 스캔
- 프록시 객체 자동 생성
- Eureka 기반 서비스 탐색 연동
- Spring Cloud Load Balancer 연결
🧩 Organization Service를 호출하는 Feign Client 정의
이제 실제로 Organization Service를 호출하는 Feign Client 인터페이스를 만들어보겠습니다.
📂 경로
src/main/java/com/optimagrowth/license/service/client/OrganizationFeignClient.java
📌 코드
@FeignClient("organization-service")
public interface OrganizationFeignClient {
@RequestMapping(
method = RequestMethod.GET,
value = "/v1/organization/{organizationId}",
consumes = "application/json"
)
Organization getOrganization(
@PathVariable("organizationId") String organizationId
);
}
🔍 코드 하나하나 뜯어보기
1️⃣ @FeignClient("organization-service")
- 호출 대상은 Eureka에 등록된 서비스 ID
- 여기서
"organization-service"는 Eureka에 등록된 application name - Feign은 이 이름을 기반으로 Eureka Registry에서 실제 서비스 위치를 조회합니다 🧭
2️⃣ 인터페이스 기반 선언형 호출
public interface OrganizationFeignClient {
- 구현 클래스 ❌
- REST 호출 코드 ❌
- HTTP 클라이언트 설정 ❌
👉 오직 인터페이스만 존재합니다.
3️⃣ Controller와 완전히 동일한 매핑 방식
@RequestMapping(
method = RequestMethod.GET,
value = "/v1/organization/{organizationId}",
consumes = "application/json"
)
여기서 중요한 포인트 👇
✅ Spring Controller에서 엔드포인트를 정의하는 방식과 완전히 동일
✅ HTTP 메서드(GET) 명시
✅ 호출할 URI 명시
✅ Content-Type 지정
👉 Feign Client는 “클라이언트용 Controller”라고 생각하면 이해가 쉽습니다.
4️⃣ PathVariable 매핑
@PathVariable("organizationId") String organizationId
- URL 경로에 포함된
organizationId값을 - 메서드 파라미터로 매핑
- 실제 REST 호출 시 URL에 자동으로 바인딩됨 🔗
5️⃣ 응답 객체 자동 매핑
Organization getOrganization(...)
🔥 Feign의 강력한 장점
- JSON 응답 →
Organization객체로 자동 역직렬화 - ObjectMapper 설정을 직접 건드릴 필요 없음
- 반환 타입만 선언하면 끝
🧪 Feign Client 사용 방법
Feign Client를 사용하는 방법은 매우 단순합니다.
✔️ @Autowired로 주입
✔️ 일반 메서드 호출처럼 사용
@Autowired
private OrganizationFeignClient organizationFeignClient;
Organization org =
organizationFeignClient.getOrganization(organizationId);
💥 끝입니다.
HTTP 호출 코드? 없습니다.
Load Balancer 설정? 없습니다.
Eureka 조회 코드? 없습니다.
Feign Client가 모든 것을 대신 처리합니다. 🎉
🧠 정리 요약
📌 Netflix Feign Client의 핵심 가치
- 선언형 REST 호출
- 인터페이스 기반 설계
- Eureka + Load Balancer 자동 연동
- Controller와 동일한 어노테이션 모델
- REST 호출 코드 완전 제거
📌 언제 Feign을 쓰는가?
- 마이크로서비스 간 호출이 많을 때
- 코드 가독성과 유지보수를 중시할 때
- RestTemplate/ WebClient 코드가 반복될 때
'Spring Microservice > Service Discovery' 카테고리의 다른 글
| Service Discovery (0) | 2026.01.10 |
|---|---|
| Invoking services with a Load Balancer–aware Spring REST template (0) | 2026.01.04 |
| Looking up service instances with Spring Discovery Client (1) | 2026.01.04 |
| Using service discovery to look up a service (0) | 2026.01.04 |
| Registering services with Spring Eureka (0) | 2026.01.04 |