작업 환경 :

  • Spring Framework 4.3.7

  • JVM 옵션에 프록시 서버정보(IP, PORT) 설정

HttpURLConnection과 HttpClient는 Java에서 기본적으로 제공하는 클래스로, 기본적인 HTTP 연결시 사용.

이들은 아래와 같은 JVM 옵션 프록시 설정시 각각 다음과 같은 차이가 존재한다.

export JAVA_OPTS=" ${JAVA_OPTS} -Dhttp.proxyHost=(프록시 서버 아이피) -Dhttp.proxyPort=(프록시 서버 포트)"
export JAVA_OPTS=" ${JAVA_OPTS} -Dhttps.proxyHost=(프록시 서버 아이피) -Dhttps.proxyPort=(프록시 서버 포트)"

HttpURLConnection과 HttpClient 차이

✔︎ HttpURLConnection 사용하여 HTTP 연결시

JVM 시스템 프로퍼티를 사용하여 프록시 설정을 가져온다.

따라서 -Dhttp.proxyHost 및 -Dhttp.proxyPort 옵션으로 지정한 프록시 설정이 자동 적용된다.

URL url = new URL("http://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();

✔︎ HttpClient 사용하여 HTTP 연결시

기본적으로 JVM 시스템 프로퍼티를 무시. 따라서 별도의 프록시 설정 추가 필요.

HttpClient httpClient = HttpClients.custom()
    .setDefaultRequestConfig(requestConfig)
    .setProxy(new HttpHost("{프록시 서버 아이피}", {프록시 서버 포트}))
    .build();

추가로, 스프링 프레임워크에서 HTTP 통신을 더 쉽게 할 수 있도록 지원하는 RestTemplate이나 WebClient의 경우에도

프록시 설정 관련하여 다음과 같은 차이가 있다.

RestTemplate이나 WebClient 차이

✔︎ RestTemplate

RestTemplate은 내부적으로 HttpURLConnection을 사용하므로, 기본적으로 JVM 시스템 프로퍼티에 설정된 프록시 설정을 따른다.

RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("http://example.com", String.class);

✔︎ WebClient

WebClient는 Reactor Netty 라이브러리를 사용하여 HTTP 요청을 처리하므로,

JVM 시스템 프로퍼티의 프록시 설정을 무시하고 별도의 프록시 설정이 필요하다.

HttpClient httpClient = HttpClient.create().proxy(proxy -> proxy.type(Proxy.HTTP)
                .host("{프록시 서버 아이피}")
                .port({프록시 서버 포트}));
                
WebClient webClient = WebClient.builder()
                .clientConnector(new ReactorClientHttpConnector(httpClient))
                .build();