일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- onclick
- dto
- clean code
- kmeans
- 다익스트라
- Android Studio
- Python
- Django
- spring boot
- bottom-up
- BufferedReader
- Controller
- 유니온 파인드
- union-find
- 우선순위큐
- 동적계획법
- compiler
- 벨만 포드 알고리즘
- disjoint set
- scikit-learn
- 기술면접
- 플로이드 와샬
- 엔테크서비스
- top-down
- 음수가 포함된 최단경로
- 코딩테스트
- Java
- 직무면접
- 거쳐가는 정점
- 최단경로
- Today
- Total
춤추는 개발자
[Spring] Server to Server 연동을 위한 여정 본문
🙋♂️ 개요
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
'Developer's_til > 스프링 프레임워크' 카테고리의 다른 글
[Spring] API 속도 개선을 위한 여정 (0) | 2024.02.17 |
---|---|
[Spring] Static 변수와 스프링 빈 (1) | 2023.12.20 |
[Spring] Mybatis의 동적쿼리와 변수 (1) | 2023.12.08 |
[Spring] XSS필터와 Surrogate pair (0) | 2023.11.10 |
[Spring] 완전한 AOP 솔루션을 제공하는 AspectJ (0) | 2023.10.25 |