작업 환경 :
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();