HTTP 다양한 통신 방법(URLConnection, RestTemplate, HttpClient, WebClient)
RestTemplate
스프링에서 제공하는 http통신에 유용하게 쓸 수 있는 템플릿이며, HTTP 서버와의 통신을 단순화하고 RESTful 원칙을
지킨다. RestTemplate는 기계적이고 반복적인 코드들을 깔끔하게 정리해준다.
장점
- 기계적이고 반복적인 코드를 최대한 줄여준다. URL, Response 받을 Object 설정 등
- RESTful 형식에 맞춘다.
- 멀티쓰레드 방식을 사용한다.
- Blocking 방식을 사용한다.
- json, xml을 쉽게 응답받는다
- 어플리케이션이 RestTemplate를 생성하고, URI, HTTP 메소드 등의 헤더를 담아 요청한다.
- RestTemplate 는 HttpMessageConverter 를 사용하여 requestEntity 를 요청메세지로 변환한다.
- RestTemplate 는 ClientHttpRequestFactory 로 부터 ClientHttpRequest 를 가져와서 요청을 보낸다.
- ClientHttpRequest 는 요청메세지를 만들어 HTTP 프로토콜을 통해 서버와 통신한다.
- RestTemplate 는 ResponseErrorHandler 로 오류를 확인하고 있다면 처리로직을 태운다.
- ResponseErrorHandler 는 오류가 있다면 ClientHttpResponse 에서 응답데이터를 가져와서 처리한다.
- RestTemplate 는 HttpMessageConverter 를 이용해서 응답메세지를 java object(Class responseType) 로 변환한다.
- 어플리케이션에 반환된다.
URLConnection
jdk 1.2부터 내장되어 있으며 java.net 패키지에 있다. URL의 내용을 읽어오거나 URL 주소에 대해 HTTP 통신 및
GET, POST로 데이터를 전달할 때 사용한다.
URLConnection 클래스를 사용하는 방법은 아래와 같다.
1. URL 객체 생성
2. 생성된 URL 객체의 openConnection() 메서드를 통해 URLConnection 획득
3. 리턴된 URLConnection 객체 설정
4. 헤더 필드 읽기
5. 입력 스트림으로 데이터 읽기
6. 출력 스트림으로 데이터 쓰기
7. 연결 종료
문제점
- 응답코드가 4xx 이거나 5xx 일 경우 IOException 이 터진다.
- 타임아웃을 설정할 수 없다.
- 쿠키 제어가 불가능하다.
HttpClient
HTTP 프로토콜을 손쉽게 사용할 수 있도록 도와주는 Apache HTTP 컴포넌트이다.
1. HttpClient httpClient = new DefaultHttpClient(); 처럼 HttpClient 객체 생성
2. 메소드에 따라 new HttpGet("http://..." URL 정보)
3. 응답받기 위한 객체 생성
HttpResponse response = httpClient.execute(httpGet);
4. HttpEntity entity = response.getEntity();
5. Steam 처리
URLConnetion 과의 차이점
- 모든 응답코드를 읽을수 있다.
- 타임아웃 설정 가능하다.
- 쿠키 제어가 가능하다.
문제점
- URLConnection을 사용하는 방식보다 코드가 간결해졌으나, 여전히 반복적이고 코드가 길다.
- 스트림 처리 로직을 별도로 짜야한다.
- 응답의 컨텐츠타입에 따라 별도 로직이 필요하다.
WebClient
스프링 5.0에서 추가된 인터페이스다. 스프링 5.0 이전에는 비동기 클라이언트로 AsyncRestTemplate를 사용했었다.
하지만 스프링 5.0 이후부터는 WebClient를 사용할 것을 권장한다.
특징
- 싱글 스레드 방식을 사용한다.
- Non-Blocking 방식을 사용한다.
- JSON, XML을 쉽게 응답받는다.
사용하기 위해선 webflux 의존성을 추가해줘야 한다.
RestTemplate와 WebClient의 차이
RestTemplate와 WebClient의 가장 큰 차이점은 Non-Blocking과 비동기화 가능 여부이다.
이러한 이유때문에 스프링에서는 WebClient 사용을 권장하는 이유다.
RestTemplate | WebClient | |
Non-Blocking | 불가능 | 가능 |
비동기화 | 불가능 | 가능 |
* blocking
블로킹은 말 그대로 하나의 작업이 진행중일 때 끝날때까지 작업이 중단된다는 의미이다.
하나의 작업이 진행되고 완료될 때까지 모든 일을 중단한 상태로 대기해야 하는 것을 블로킹 방식이라고 한다.
블로킹 방식의 소켓통신은 결과가 올 때까지 다른 작업을 중단하고 하염없이 기다리게 됩니다.
* Non-blocking
Bloking과 반대로 하나의 작업이 진행중일 때 끝날때까지 작업이 중단되지 않고 다른 작업을 진행한다는 의미이다.
하나의 작업을 진행하면서 다른 작업도 진행할 수 있으므로 효율이나 반응속도가 더 뛰어나다.
하지만 설계가 복잡해진다는 단점이 있습니다.