๐ HttpClient ๊ฐ์
๐ HttpClient ๊ฐ์ ๊ณผ์
๐ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋น๊ต
What? Why?
์๋ฐ์์ HTTP ์์ฒญ์ ์์ฑํ๊ณ , ์๋ฒ์ ํต์ ํ๋ฉฐ, ์๋ต์ ์ฒ๋ฆฌํ๊ธฐ ์ํ API
Java 11์์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋์
๋์์ผ๋ฉฐ, ์ด์ ์ HttpURLConnection๋ณด๋ค ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ๊ธฐ๋ฅ์ด ํ๋ถํ๋ค.
- ๋น๋ ํจํด ๋์
:
HttpRequest.newBuilder() - ์ญํ ๋ถ๋ฆฌ:
HttpClient,HttpRequest,HttpResponse - ๋น๋๊ธฐ ์ฒ๋ฆฌ ์ง์:
HttpClient.sendAsync()
์ฃผ์ ํด๋์ค
HttpClient: HTTP ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ํ ํด๋ผ์ด์ธํธ ๊ฐ์ฒด๋ฅผ ์์ฑHttpRequest: HTTP ์์ฒญ์ ์ธ๋ถ ์ฌํญ(URI, ๋ฉ์๋, ํค๋ ๋ฑ)HttpResponse: ์๋ฒ๋ก๋ถํฐ ๋ฐ์ HTTP ์๋ต
์ฃผ์ ๋ฉ์๋
HttpClient.newHttpClient()
๊ธฐ๋ณธ ์ค์ ์ ์ฌ์ฉํ HttpClient ์ธ์คํด์ค๋ฅผ ์์ฑ
- ์์ฒญ(GET), ํ๋กํ ์ฝ(HTTP/2), ๋ฆฌ๋ค์ด๋ ํธ(NEVER), SSL(Default)
HttpClient client = HttpClient.newHttpClient();
HttpRequest.newBuilder()
์๋ก์ด HttpRequest ๋น๋๋ฅผ ์์ฑ
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://foo.com/"))
.timeout(Duration.ofMinutes(2))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofFile(Paths.get("file.json")))
.build();
- client.send(request,
HttpResponse.BodyHandlers.ofString())
๋๊ธฐ์ ์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ ๋ฌธ์์ด๋ก ๋ฐ์
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
- client.sendAsync(request,
HttpResponse.BodyHandlers.ofString())
๋น๋๊ธฐ์ ์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ต์ CompletableFuture๋ก ๋ฐ์
client.sendAsync(request, BodyHandlers.ofString())
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
๊ธฐ๋ฅ ์ ๋ฐ์ดํธ ์์ฝ
- java 11:
HttpClient๋์ - java 14: TLS 1.3 ์ง์
- java 15: OAuth2 ๋ฑ ๋ค์ํ ์ธ์ฆ ๋ฐฉ์์ ์ง์ํ๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ
- java 17: ์ปค๋ฅ์ ํ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ํฅ์
- java 18~21: HTTP/3์ ์ ์ ์ง์์ด ์ถ๊ฐ, ๋ณด์ ๊ฐํ
๋ค๋ฅธ HTTP ๋ผ์ด๋ธ๋ฌ๋ฆฌ
RestTemplate
- ๋๊ธฐ ๋ฐฉ์
- ๊ฐ๋จํ ์ฌ์ฉ๋ฒ: ๊ฐ๋จํ REST ํธ์ถ์ ์ ํฉ
- ์ ํ ์ฌํญ: ๋น๋๊ธฐ๋ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ์ง ์์ผ๋ฉฐ, ๊ธฐ๋ฅ์ด ์ ํ์
import org.springframework.web.client.RestTemplate;
public class RestTemplateExample {
public static void main(String[] args) {
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("https://api.example.com/data", String.class);
System.out.println(response);
}
}
WebClient
- ๋น๋๊ธฐ ๋ฐ ๋ฐ์ํ ์ง์: ๋น๋๊ธฐ ํธ์ถ๊ณผ ๋ฆฌ์กํฐ๋ธ ์คํธ๋ฆผ์ ์ง์
- ์ ์ฐ์ฑ: ๋ค์ํ HTTP ์์ฒญ๊ณผ ์๋ต ์ฒ๋ฆฌ๋ฅผ ์ ์ฐํ๊ฒ ์ง์
- ๋ชจ๋ํ ์ฌ์ฉ๋ฒ: ํ๋์ ์ธ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํฉ
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
public class WebClientExample {
public static void main(String[] args) {
WebClient client = WebClient.create("https://api.example.com");
Mono<String> response = client.get()
.uri("/data")
.retrieve()
.bodyToMono(String.class);
response.subscribe(System.out::println);
}
}
๋น๊ต
