춤추는 개발자

[Spring] Server to Server 연동을 위한 여정 본문

Developer's_til/스프링 프레임워크

[Spring] Server to Server 연동을 위한 여정

Heon_9u 2024. 12. 15. 16:33
728x90
반응형

🙋‍♂️ 개요

Spring 환경에서 서버 간의 연동을 위해 구글링하다보면, 아래와 같이 3가지의 기술들이 나열된다.
ㅇ RestTemplate
ㅇ WebClient
ㅇ FeignClient

 

 

✅ RestTemplate이란?

Http 요청을 보내기 위해 Spring에서 제공하는 동기식 클라이언트 라이브러리.

 

- Http 프로토콜에 맞게 다양한 메서드 제공

- RESTful 형식을 갖춘 템플릿

- HttpClient를 추상화해서 응답 형식으로 JSON, XML 등 다양한 형식을 지원

- 동기식, Blocking I/O

- 동시성이 높은 시나리오에는 부적합

- Connection Pool(소켓 풀) 기능 제공

 

[ 동기식(Synchronous)이란? ]

요청한 작업에 대해 완료 여부를 신경쓰면서 작업을 순차적으로 수행하는 방식

말 그대로 요청이 들어온 순서대로 처리하는 방식으로 동시에 여러가지 요청을 처리할 수 없다.

tmi)

Syn은 그리스어로 '함께', chrono는 '시간'이라는 뜻으로 작업 시간을 함께 맞춰서 실행한다고 해석할 수 있다.

 

[ Blocking이란? ]

다른 요청의 작업을 처리하기 위해 현재 작업을 멈추는 방식

 

✅ WebClient란?

WebFlux 라이브러리의 일부로 비동기식 반응형 클라이언트.

 

- 비동기, Non-Blocking I/O

- Reactive Programming 원칙을 기반으로 스레드를 차단하지 않고, 동시 연결을 처리

- Http 메서드에 대한 다양한 교환 방법을 제공

- Functional API를 제공하여 메서드 체인을 사용한 선언적 스타일로 요청이 가능

 

[ 비동기(asynchronous)란? ]

요청한 작업에 대해 완료 여부를 따지지 않고 처리하는 방식

동기 방식과 정반대되는 처리 방식으로 I/O작업과 같은 느린 작업을 할 때, 멀티 작업을 진행

 

[ Non-Blocking이란? ]

현재 작업중인 요청을 처리하면서 다른 요청이 들어오면 동시에 처리하는 방식

 

✅ FeignClient란?

Netflix에서 개발한 Http Client로 현재는 OpenFeign이라는 이름의 오픈소스, 인터페이스와 어노테이션 방식으로 구현체 없이 Http Client를 구현.

 

- 인퍼테이스/어노테이션으로 간결하게 API 호출을 수행

- JSON, XML 등 다양한 포멧 지원

- Feign Decoder/Encoder/Interceptor 등을 통해 커스터마이징, 추가 기능 가능

- 싱글 스레드 기반의 동기식

 

[ @Async ]

어노테이션 기반으로 FeignClient도 비동기식으로도 사용할 수 있다. 대신, Spring에 요청을 처리할 수 있는 Bean을 등록해야 한다.

 

 

💻 실무에서는..?

 위에 작성한 내용보다도 훨씬 디테일한 특징/기능들이 많기 때문에 실무에서 활용한다면 직접 찾아보는걸 추천드립니다!

저는 실무에서 외부 API와의 연동이 필요해 기존 RestTemplate 기반으로 서버 연동 로직을 참고하면서 리팩토링의 필요성을 느꼈습니다....😱

하나의 클래스에 담겨있는 토큰 인증, header 셋팅, URL 설정 등의 온갖 로직들이 뒤섞여 있는걸 보면서 리팩토링 욕구를 터뜨렸습니다.

 

 리팩토링하기 전, 서버 연동 방법이 RestTemplate밖에 없나? 라는 생각이 들어 위 방식들을 살펴보면서 FeignClient 방식을 선택!

 

📢 why?

가장 첫번째로 눈여겨본 것은 ✨가독성과 간결한 API✨

기존 코드가 너무 읽히지 않아서 그런지... 인터페이스 방식으로 깔끔하게 보이는 Feign 방식이 가장 눈에 들어왔다.
거기에 굳이 비동기/Non-Blocking 방식이나 Http Client의 소켓풀 필요하다기에는 서버 연동이 포함된 기능이 전체 10%이하였기 때문에 다른 방식들이 눈에 들어오지 않았다.
+) 외부 응답 중 다양한 예외 처리를 커스터마이징하고, 프론트에 응답 or 로그를 통해 확인할 수 있다는 특징이 있다. 직접 사용해보니 로그 레벨부터 서비스에 맞춤형으로 다룰 수 있다는게 꽤나 매력적이었다.

 

 

✅ Reference

RestTemplate 정리

동기/비동기와 Blocking/non-Blocking

WebClient 정리

 

728x90
반응형