[Spring] HttpURLConnection, RestTemplate, WebClient

Java 환경에서 사용되는 HTTP 클라이언트인 HttpURLConnection, RestTemplate, WebClient를 비교해보자.


Java 환경에서 사용되는 HTTP 클라이언트인 HttpURLConnection, RestTemplate, WebClient 비교

🧱 1. HttpURLConnection (자바 기본 제공)

🚗 2. RestTemplate (Spring 제공, 동기)

🛸 3. WebClient (Spring WebFlux 제공, 비동기 & 논블로킹)


📌 먼저, 한눈에 보는 비교표

항목HttpURLConnectionRestTemplateWebClient
제공Java SE 표준Spring Web (3.x~)Spring WebFlux (5.x~)
방식동기 + 블로킹동기 + 블로킹비동기 + 논블로킹
쓰기 쉬움❌ 불편하고 코드 길다✅ 간결함✅ (조금 복잡하지만 유연함)
권장도❌ 현업에서 거의 안 씀⚠️ Spring 5부터 비권장✅ 최신 표준
성능느림, 커넥션 재활용 어려움괜찮음, 단순 요청에는 충분 (블로킹)고성능 (Netty 기반), MSA에서 더 좋음
활용Java 기본 네트워크 통신간단한 API 호출MSA, API Gateway, 대규모 호출 등
미래 방향-Deprecated 예정 (Spring 6에서는 제거될 수 있음)Spring이 권장하는 표준 방식

✅ 1. HttpURLConnection — Java 기본 클래스

URL url = new URL("https://api.example.com/data");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();

while ((inputLine = in.readLine()) != null) {
    content.append(inputLine);
}

in.close();
conn.disconnect();

❌ 단점

  • 코드가 너무 장황하고 귀찮음
  • 커넥션 풀도 없음 (직접 관리해야 함)
  • 에러 핸들링이 불편함

✅ 장점

  • Spring 없이도 동작 (가벼운 프로젝트, 시험용 앱에 쓸 수 있음)

🚨 실무에선 거의 안 씀. RestTemplate/WebClient로 대체.


✅ 2. RestTemplate — 동기 & 블로킹 방식의 Spring HTTP 클라이언트

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("https://api.example.com/data", String.class);

→ 응답이 올 때까지 기다림. 동기 처리.

✅ 장점

  • 코드가 아주 간단함
  • Spring 기반이라 다양한 옵션 (converter, interceptor 등) 연동 쉬움

⚠️ 단점

  • 동기 + 블로킹이라, 요청 수가 많으면 쓰레드 고갈 위험
  • Spring 5 이후로 점점 사용 비권장됨

    📢 Spring 공식 문서: “RestTemplate은 더 이상 발전하지 않으며, WebClient 사용을 권장함.”

🔧 주요 메서드들

메서드설명
getForObject()GET 요청 후, 결과를 객체로 받음
getForEntity()GET 요청 후, 전체 응답(ResponseEntity) 받음
postForObject()POST 요청 후, 결과를 객체로 받음
postForEntity()POST 요청 후, 전체 응답 받음
put()PUT 요청 (응답 없음)
delete()DELETE 요청


✅ 3. WebClient — 비동기 & 논블로킹 방식의 최신 HTTP 클라이언트

WebClient webClient = WebClient.create();
webClient.get()
    .uri("https://api.example.com/data")
    .retrieve()
    .bodyToMono(String.class)
    .subscribe(result -> System.out.println("결과: " + result));

System.out.println("여긴 먼저 실행됨!");  // 비동기니까 이게 먼저 출력될 수도 있음

✅ 장점

  • 논블로킹 + 비동기 처리
  • 대규모 트래픽 처리에 유리
  • 기능 확장도 쉬움 (OAuth2, Retry, Timeout 등)

❗ 단점

  • 처음 배울 땐 리액티브 스트림(Mono/Flux)이 좀 낯설 수 있음

🌐 현업에서는 WebClient가 기본이 되고 있어! 특히 MSA(마이크로서비스) 환경에서는 거의 필수!


🔍 현업 개발자들은 어떻게 생각할까?

  • HttpURLConnection은 진짜로 아무것도 없을 때 테스트용으로만 씀”
  • RestTemplate은 작고 단순한 서비스에서는 아직도 많이 씀”
  • WebClient는 대규모 시스템이나 MSA, API Gateway에서 표준처럼 쓰이고 있음”

🧑‍💻 간단 정리 :

“HttpURLConnection은 Java에서 기본 제공하는 HTTP 클라이언트지만, 코드가 장황하고 관리가 어렵기 때문에 Spring에서는 RestTemplate이나 WebClient를 사용합니다. RestTemplate은 동기 방식으로 간단한 API 호출에는 적합하지만, Spring 5부터는 WebClient처럼 비동기 + 논블로킹 방식을 사용하는 것이 대세입니다.”


🎁 선택 가이드

사용 상황추천 방식
가볍게 테스트용 API 호출RestTemplate or WebClient.block()
복잡한 서비스 간 통신, 고성능 서버WebClient
Java만 사용하는 초간단 도구 개발HttpURLConnection (단, 실무에는 비권장)
Spring 5 이상 + 새로운 프로젝트WebClient를 사용하는 게 미래지향적