Spring 프로젝트를 다루고 있는데 외부 API를 사용해야 하는 상황이 생겼습니다...
⭐ 외부 API 호출
💫 HttpURLConnection / URLConnection
자바에서 제공하는 기본적인 API 로 순수 JAVA만으로 HTTP통신이 가능합니다.
URL 을 이용하여 외부 API에 연결하고 데이터를 전송할 수 있으며, 테이터의 타입 및 길이에 거의 제한이 없습니다.
https://docs.oracle.com/javase/8/docs/api/java/net/HttpURLConnection.html
오래된 JAVA 버전에서 사용하는 클래스로 동기적 통신을 기본으로 사용하기 때문에 요청 을 보내고 응답 을 받을 때까지 스레드가 대기상태 에 있습니다.
URLConnection 은 상태적으로 저수준의 API에 해당하며 기본적인 요청/응답 기능이 제공되지만 추가적인 기능들은 직접 구현해야 합니다.
💫 RestTemplate
Spring 에서 제공하는 http 통신에 적용가능한 템플릿입니다.
- Spring 3.0 에서 추가
- org.springframework.http.client 패키지
- HttpClient 를 추상화해서 제공
- 가장 범용적으로 사용
- HTTP 요청 후 JSON, XML, String 과 같은 응답
- Blocking 기반의 동기방식
- HTTP 서버와의 통신을 단순화하고 Restful 원칙
- header, content-type 설정하며 외부 API 호출
- 서버-서버 통신에 사용
사용하고 편하고 직관적이지만 동기적인 HTTP 요청을 합니다.
커넥션풀을 기본적으로 사용하지 않아서 연결할 때마다 로컬 포트를 열고 tcp connection 을 맺어야 합니다.
connection pool 을 사용하여 이를 해결합니다.
동기적인 기술이기 때문에 대규모 요청이 들어올 경우에는 비동기/넌블로킹 방식을 지원하는 WebClient 를 고려하라는 추천이 있습니다.
Spring4 에서 추가된 비동기 방식인 AsyncRestTemplate 도 있습니다.
💫 HttpClient
HTTP 프로토콜을 쉽게 사용할 수 있도록 도와주는 Apache HTTP 컴포넌트입니다.
객체 생성이 쉽고 URLConnection 방식보다 코드가 간결하지만 반복적이고 코드가 깁니다.
응답의 콘텐츠 타입에 따라 별도의 로직이 필요합니다.
💫 WebClient
Spring5 버전부터 도입된 WebClient 라이브러리입니다.
비동기/논블로킹 방식으로 높은 처리량과 확장성을 지원하며 리액티브 프로그래밍을 할 수 있으며 데이터 스트림을 효과적으로 처리할 수 있습니다.
Webflux를 추가하여야 사용할 수 있습니다.
💫 OpenFeign
어노테이션을 사용하는 선언적 웹 서비스 클라이언트입니다.
인터페이스에 어노테이션들만 붙여 줌으로써 구현이 되며 Spring Data JPA 와 유사합니다.
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/
넷플릭스에서 개발한 Http client binder 으로 웹 서비스 클라이언트를 쉽게 작성할 수 있도록 지원합니다.
RestTemplate 사용 시 API 호출이 잦은 경우에는 코드를 반복하는 게 번거로워서인지 새로운 게 자꾸 나오는 느낌입니다.
인터페이스 / 어노테이션 기반으로 코드 작성이 쉬우며 RESTAPI 를 사용하는데 필요한 설정이 간편해서 비즈니스 로직에 더 집중할 수 있으며, 다른 Spring Cloud 기술과 통합이 쉬운 편입니다.
Spring Cloud 모듈이 추가되어야 하며,HttpCLient 가 Http2 를 지원하지 않습니다.(추가 설정 필요)
공식적으로 Reactive 모델을 지원하지 않으며 테스트 도구가 제공되지 않는 단점이 있습니다.
OPenFeign 이 왠지 끌리네요.
Spring4 버전을 사용하고 있어서 사용할 수 없고 RestTemplate 으로 적용한 후에 OPenFeign 도 적용이 가능한지 한 번 알아보고 싶네요. ㅇ _<
'Java' 카테고리의 다른 글
[Java] 여러 버전 자바 JDK 전환 (0) | 2024.11.26 |
---|