MSA의 클라이언트 사이드 로드 밸런싱에 대해 배우는 와중에 FeignClient에 대해 공부하였습니다.
FeignClient는 HTTP Client 기능을 제공해준다고 합니다.
스파르타 사전 교육 과정에서 Naver API 호출을 위해 RestTemplate을 이용한 적이 있는데 FeignClient와 어떤 차이점이 있는지 궁금해졌습니다.
✅RestTemplate
템플릿 메서드 API를 사용하여 HTTP 요청을 수행하는 동기 HTTP 클라이언트
- 템플릿 메서드 : 여러 클래스에서 공통으로 사용하는 메서드를 템플릿화하여 상위 클래스에 정의, 하위 클래스마다 메서드의 세부 동작을 다르게 구현하는 패턴
- 동기 : 요청 보낸 후 응답을 받아야 다음 요청 수행 , 요청과 응답의 순서가 보장된다.
✔️ 특징
- 동기 방식 통신
- HTTP 메서드별 보편적 시나리오에 대한 템플릿 메서드 제공
(EX) getForObject(), getForEntity(), postForObject() 등 - Spring Framework에서 제공
- 동시성 높은 시나리오에서 성능 문제 발생 가능
✔️ 사용 예시
1. RestTemplate 의존성 주입
2. RestTemplate에서 제공해주는 템플릿 메서드를 이용하여 HTTP 요청
private final RestTemplate restTemplate;
@GetMapping("/order/{orderId}")
public String getOrder(@PathVariable String orderId){
String url = "http://localhost:190901/product/"+orderId;
return restTemplate.getForObject(url, String.class);
}
✅FeignClient
선언적 동기 HTTP 클라이언트
- 선언적 : 무엇을 할 것인가에 관한 것
✔️ 특징
- 동기 방식 통신
- 간결하고 쉬운 방법으로 구현 가능
- Feign을 사용할 때는 인터페이스만 정의하고 그에 따라 어노테이션을 달면 됨 - 구상이 아닌 추상화에 의존
- 구체적인 클래스가 아닌 인터페이스에 코딩 - Spring Cloud에서 제공
- 동시성 높은 시나리오에서 성능 이슈 발생 가능
✔️ 사용 예시
1. 시작 클래스에 @EnableFeignClients 애노테이션 추가
2. @FeignClient(name="") 이용하여 서버에 대한 인터페이스 정의
3. FeignClient 의존성 주입 후 메서드 수행
❗스프링 시작 클래스
@EnableFeignClients
@SpringBootApplication
public class SpringApplication {
public static void main(String[] args) {
SpringApplication.run(SpringApplication.class, args);
}
}
❗인터페이스 정의
@FeignClient(name="product-service")
public interface ProductClient {
@GetMapping("/product/{id}")
String getProduct(@PathVariable String id);
}
❗FeignClient로 요청 수행
private final ProductClient productClient;
@GetMapping("/order/{orderId}")
public String getOrder(@PathVariable("orderId") String orderId){
return productClient.getProduct(orderId); // http 서버로 요청 작업 수행
}
✅WebClient
비동기 HTTP 클라이언트
- 비동기 : 요청 보낸 후 응답과 상관없이 다음 요청 수행 ,요청과 응답의순서가 보장되지 않는다.
✔️ 특징
- 비동기 방식 통신
- 스프링 5.0 이후부터 도입
- Spring WebFlux에서 제공
- Non-Blocking , 리액티브 클라이언트
- Non-Blocking : 현재 작업이 수행되는 동안 다른 작업을 block(차단, 대기) 하지 않는다.
- 리액티브 : 데이터 흐름과 변경에 반응하여 시스템 구성하는 프로그래밍 , 데이터의 변경 사항이나 이벤트에 대해 자동으로 반응하도록 시스템 설계
✔️ 사용 예시
1. WebClient 의존성 주입
2. WebClient를 이용하여 비동기 get 요청
public class OrderController{
private final WebClient webClient;
public OrderController(WebClient.Builder webClientBuilder){
this.webClient = webClientBuilder.baseUrl("http://localhost:190901").build();
}
@GetMapping("/order/{orderId}")
public Mono<String> getOrder(@PathValue String orderId){
String url = "/product/"+orderId;
return webClient.get()
.uri(url)
.retrieve()
.bodyToMono(String.class);
}
}
🔎 결론
- 스프링 5.0 이후로 RestTemplate은 레거시로 간주되며 WebClient 사용을 권장하고 있습니다.
- 동기 vs 비동기, 선언 vs 절차 등의 두드러지는 특징을 바탕으로 개발 환경과 요구사항에 맞는 HTTP 클라이언트를 사용할 수 있습니다.
출처 :
1. https://medium.com/thefreshwrites/resttemplate-feignclient-webclient-with-spring-boot-f34979040b9e
3. https://iborymagic.tistory.com/73
4. https://junuuu.tistory.com/770
'스파르타 > TIL' 카테고리의 다른 글
2024.08.08 | 캐싱 전략 (0) | 2024.08.08 |
---|---|
2024.08.07 | 이벤트 드리븐 아키텍처 (0) | 2024.08.08 |
2024.08.05 | Observability ( Logs vs Traces vs Metrics ) (0) | 2024.08.06 |
2024.08.01 | 서비스 디스커버리 (0) | 2024.08.04 |
2024.07.31 | MSA 전체 아키텍처 (0) | 2024.08.01 |