Rest Client는 *RESTful 웹 서비스를 사용하기 위한 클라이언트 애플리케이션이고. (1)
여러 가지 HTTP 클라이언트 라이브러리를 사용하여 RESTful 웹 서비스와 통신할 수 있는데, (2)
대표적으로 HttpClient, OkHttp, RestTemplate와 WebClient 등이 있습니다. (3)
Rest Client는 HTTP 메서드를 사용하여 웹 서비스에 요청을 보내고, 응답을 받아서 처리할 수 있고, JSON,XML 등의 데이터 형식을 처리할 수 있으며 HTTP 요청 및 응답에 대한 정보를 추가할 수 있기 때문에 클라이언트와 서버 간의 상호작용을 단순화하고, 효율적으로 처리할 수 있어서 다른 웹 서비스와 통신하는 애플리케이션을 쉽게 구현할 수 있습니다.
나올 수 있는 질문들
-그럼 RESTful 웹 서비스는 뭔데?(1)
-여러 가지 HTTP 클라이언트 라이브러리에는 뭐가 있는데? (2)
-RestTemplate와 WebClient의 차이점은 뭔데? (3)
-왜 쉽게 구현할 수 있는데?(4)
(1) *-Restful 웹 서비스
RESTful 웹 서비스는 HTTP를 기반으로 구현된 웹 서비스입니다. RESTful 웹 서비스는 클라이언트와 서버 간의 상호작용을 위해 HTTP 메서드(GET, POST, PUT, DELETE 등)와 URL을 사용합니다.
RESTful 웹 서비스는 다음과 같은 특징을 가지고 있습니다.
- 자원(Resource) - RESTful 웹 서비스는 URL을 통해 자원을 표현합니다. 자원은 서비스에서 관리되는 정보를 나타내며, 각 자원에는 고유한 URI(Uniform Resource Identifier)가 있습니다.
- 표현(Representation) - RESTful 웹 서비스는 자원의 표현 방법을 명시합니다. 예를 들어, JSON, XML 등의 데이터 형식을 사용하여 자원을 표현할 수 있습니다.
- 상태 전이(State Transfer) - RESTful 웹 서비스는 HTTP 메서드를 사용하여 상태 전이를 수행합니다. 예를 들어, POST 요청을 사용하여 새로운 자원을 생성하거나 PUT 요청을 사용하여 자원을 갱신할 수 있습니다.
- 자기 서술적(Self-descriptive) 메시지 - RESTful 웹 서비스는 요청과 응답에 대한 정보를 포함하는 메시지를 사용합니다. 이러한 메시지는 서비스에 대한 설명이나 문서화를 용이하게 합니다.
- 하이퍼미디어(Hypermedia) - RESTful 웹 서비스는 하이퍼미디어를 사용하여 자원 간의 관계를 표현합니다. 예를 들어, HTML에서 하이퍼링크를 사용하여 관련된 웹 페이지로 이동할 수 있습니다.
RESTful 웹 서비스는 단순하고 확장성이 뛰어나며, 여러 플랫폼에서 쉽게 사용할 수 있습니다. RESTful 웹 서비스를 사용하면 다양한 기기와 플랫폼에서 데이터를 공유하고, 분산 시스템을 구성하는 등의 다양한 용도로 활용할 수 있습니다.
(2) 여러 가지 HTTP 클라이언트 라이브러리
1. HttpURLConnection
기본 JDK에 포함되어 있음. (jdk1.2부터 내장되어 있으며 java.net 패키지에 있다.)
상대적으로 가벼우며 핵심적인 API만 지원하고 있음.
HttpClient 보다 성능이 좋음
서버로부터 전달받은 Response 결과를 Stream으로 직접 처리해야 하는 등.. 개발 생산성이 떨어지는 요소가 다소 있음.
2. HttpClient
Apache에서 제공한다.
HttpClient는 3 버전과 4버전이 있으며 4버전부터는 HttpComponents로 불린다.(단, 3버전과 4 버전은 둘 간 직접적인 호환은 되지 않음)
HttpComponents(4 버전)부터는 Thread에 안정적인 기능들을 많이 제공한다.
상대적으로 무거움
HttpURLConnection 대비 다양한 API를 지원함.
3. OKHttp
Square의 오픈소스 프로젝트
OKHttp는 통신을 동기화로 할지 비동기로 처리할지 선택하여 사용할 수 있음.
단 스레드를 넘나들 수 없음. (스레드 간에 데이터를 공유하기 위해서는 Handler를 활용해야 함)
4. Retrofit
Square의 오픈소스 프로젝트
어노테이션을 사용하여 개발할 수 있으므로 개발의 생산성 및 가독성이 올라감.
어노테이션을 사용하여 코드를 생성하기 때문에 인터페이스를 적용하여 주로 개발함.
5. RestTemplate
RestTemplate은 간편하게 Rest방식의 API를 호출할 수 있는 Spring 내장 클래스이다.
Spring 3.0부터 지원하는 Spring의 HTTP 통신 템플릿이다.
Restful의 원칙을 지킬 수 있으며 HTTP 메서드들에 적합한 여러 메소드 제공한다.
JSON, XML, String 응답을 모두 받는다.
Blocking I/O 기반의 동기방식을 사용한다.(Rest API 호출 후 응답을 받을 때까지 기다림)
Header + Content-Type을 설정해서 외부 API 호출이 가능하다.
java.net.HttpURLConnection, Apache HttpComponents, OkHttp 3, Netty 같은 HTTP Client 라이브러리 중 하나를 유연하게 사용할 수 있다.
6. WebClient
WebClient는 RestTemplate를 대체하는 HTTP 클라이언트이다. 기존의 동기 API를 제공할 뿐만 아니라, 논블로킹 및 비동기 접근 방식을 지원해서 효율적인 통신이 가능하다.
WebClient는 요청을 나타내고 전송하게 해주는 빌더 방식의 인터페이스를 사용하며, 외부 API로 요청을 할 때 리액티브 타입의 전송과 수신을 합니다. (Mono, Flux)
WebClient 특징 3가지 싱글 스레드 방식을 사용, Non-Blocking 방식을 사용, JSON, XML을 쉽게 응답받는다.
(3) RestTemplate vs WebClient
RestTemplate과 WebClient는 Spring에서 제공하는 HTTP 클라이언트 라이브러리입니다. 두 라이브러리의 차이점은 다음과 같습니다.
- 비동기 처리 방식 : RestTemplate는 동기식 호출만 지원합니다. 하지만 WebClient는 비동기식 호출을 지원하며, 리액티브 스트림 프로그래밍을 사용할 수 있습니다.
- 스레드 모델 : RestTemplate은 Java의 기본 스레드 모델을 사용합니다. 하지만 WebClient는 Netty I/O 스레드 모델을 사용합니다. 따라서 WebClient는 더 적은 수의 스레드로 더 많은 요청을 처리할 수 있습니다.
- 요청 및 응답 객체 : RestTemplate은 요청 및 응답 객체를 POJO(Plain Old Java Object)로 사용할 수 있습니다. 하지만 WebClient는 요청 및 응답 객체를 Mono나 Flux와 같은 리액티브 타입으로 사용할 수 있습니다.
- 구성 방식 : RestTemplate는 XML이나 Java Config와 같은 구성 방식을 사용할 수 있습니다. 하지만 WebClient는 Java Config만 지원합니다.
따라서, RestTemplate은 간단한 RESTful 웹 서비스와의 통신에 적합하며, WebClient는 비동기식 호출이 필요하거나 리액티브 스트림 프로그래밍을 사용할 때 적합합니다. 또한, WebClient는 RestTemplate보다 더 높은 성능을 보이지만, 사용하기에는 더 복잡합니다
동기식 vs 비동기식
동기식과 비동기식은 프로그램이 실행되는 방식의 차이를 나타내며, 다음과 같은 차이점이 있습니다.
호출 방식 : 동기식은 호출된 함수가 처리를 완료할 때까지 호출한 함수가 대기합니다. 반면에 비동기식은 호출된 함수가 처리를 완료하지 않아도 호출한 함수는 대기하지 않고 다음 코드를 실행합니다.
응답 방식 : 동기식은 함수의 처리 결과가 반환될 때까지 대기합니다. 반면에 비동기식은 함수의 처리 결과를 콜백 함수나 이벤트로 받아 처리합니다.
리소스 사용 : 동기식은 호출한 함수가 처리 결과를 받을 때까지 자원을 점유합니다. 반면에 비동기식은 호출한 함수가 처리 결과를 대기하지 않으므로 자원을 점유하지 않습니다.
복잡도 : 동기식은 순차적인 코드 실행 흐름을 갖기 때문에 코드의 복잡도가 낮습니다. 반면에 비동기식은 별도의 스레드나 이벤트 루프를 사용하여 복잡한 비동기 처리를 수행해야 하므로 코드의 복잡도가 높을 수 있습니다.
동기식과 비동기식 중 어떤 방식을 선택해야 하는지는 상황에 따라 다르며, 대체로 I/O 처리가 많은 프로그램에서는 비동기식 방식이 효율적일 수 있습니다. 하지만, 복잡한 프로그램에서는 동기식 방식이 코드의 복잡도를 낮출 수 있으므로 적절한 방식을 선택하는 것이 중요합니다.
'기술면접' 카테고리의 다른 글
Session(세션)에 대해 모르는 사람한테 설명하듯 간단하게 설명하시오 (0) | 2023.04.09 |
---|---|
Spring에서 제공하는 HTTP 클라이언트 라이브러리에 대해 말하시 (0) | 2023.03.13 |
Spring MVC 프레임워크의 요청처리 과정 (0) | 2023.03.13 |
트랜잭션(transaction) (0) | 2023.02.11 |
추상 클래스와 인터페이스의 차이는 무엇인가요 (0) | 2023.01.11 |