본문 바로가기
[개발] 프레임워크/Spring

Feign Client

by Devsong26 2023. 11. 25.

스프링 클라우드의 Feign 클라이언트는 마이크로서비스 간의 HTTP 기반 통신을 간소화하기 위해 사용되는 선언적 REST 클라이언트입니다. Feign은 스프링 클라우드 넷플릭스 스택의 일부로, 서비스-투-서비스 호출을 더 쉽고 가독성 있게 만들어 줍니다. 

Feign의 주요 특징과 장점은 다음과 같습니다:

  • 선언적 REST 클라이언트
    • Feign을 사용하면 복잡한 HTTP 클라이언트 코드를 작성할 필요 없이, 인터페이스와 어노테이션을 이용하여 간단하게 HTTP 요청을 정의할 수 있습니다.
  • 인터페이스 기반 설계
    • Feign 클라이언트는 Java 인터페이스에 어노테이션을 추가함으로써 HTTP 요청을 정의합니다. 이 방법은 코드의 가독성을 높이고 유지보수를 용이하게 합니다.
  • 통합된 로드 밸런싱
    • Feign은 스프링 클라우드와 함께 사용될 때 리본(Ribbon)이라는 클라이언트 측 로드 밸런서와 쉽게 통합됩니다. 이를 통해 서비스 간의 통신 부하를 자동으로 분산시킬 수 있습니다.
  • 오류 복구 지원
    • Feign은 히스트릭스(Hystrix)와의 통합을 통해 회로 차단기 패턴을 구현할 수 있으며, 이를 통해 원격 서비스 호출이 실패했을 때의 오류 복구 기능을 제공합니다.
  • 간결한 구성
    • 스프링 부트와의 통합을 통해 Feign 클라이언트를 손쉽게 설정하고 관리할 수 있습니다.

 


 

실습

 

스펙은 다음과 같습니다.

  • org.springframework.boot: 3.2.0
  • java: 17
  • spring-boot-starter-web

Feignclient는 HttpMessageConverters 빈을 사용합니다. 이 빈은 spring-boot-starter-web 의존성 라이브러리를 추가할 경우 스프링 애플리케이션에서 기본적으로 제공됩니다. 따라서 webflux를 사용하는 경우 spring-boot-starter-web 를 추가해야 하는데 두 라이브러리는 동작하는 방식이 다르기 때문에 설정 등에서 충돌이 발생할 수 있으므로 Feign Client를 사용한다면 서블릿 기반의 전통적인 블로킹 I/O 모델인 spring-boot-starter-web 의존성 라이브러리를 사용해야 합니다.

 

build.gradle에 아래와 같이 추가합니다.

...

ext {
	set('springCloudVersion', "2023.0.0-RC1")
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

dependencyManagement {
	imports {
		mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
	}
}

...

 

 

스프링부트 애플리케이션 클래스에 아래와 같이 @EnableFeignClients 를 추가합니다.

...
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication
@EnableFeignClients
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}

}

 

 

Feign interface를 하나 개발합니다.

아래 /greeting URI는 https://developer-syubrofo.tistory.com/213 게시글을 참고하시면 됩니다.

@FeignClient(name= "internal", url = "http://localhost:8080")
public interface InternalFeign {

    @GetMapping("/greeting")
    String greeting();

}

 

태스트 코드를 통해 확인해 보겠습니다.

@ActiveProfiles("dev")
@ExtendWith(SpringExtension.class)
@SpringBootTest
class InternalFeignTest {

    @Autowired
    InternalFeign internalFeign;

    @Test
    public void test(){
        System.out.println(internalFeign.greeting());
    }

}

// 결과
Good evening!

 

'[개발] 프레임워크 > Spring' 카테고리의 다른 글

Spring에서 ApplicationEvent 처리하기  (0) 2023.11.29
스프링 트랜잭션  (0) 2023.11.26
JPA N+1 문제  (0) 2023.11.17
@RestControllerAdvice  (0) 2023.11.16
[Spring F/W] Spring Batch  (0) 2023.10.23