새소식

반응형
Java/Spring

Spring ClientHttpRequestFactory(RestTemplate 관련)

  • -
반응형

✅ ClientHttpReqeustFactory

Spring 의 ClientHttpReqeustFactory 는 RestTemplate 가 HTTP 요청을 실제로 어떻게

보낼지(커넥션 관리, 타임아웃, 버퍼링 등) 결정하는 핵심 인터페이스이다.

 

쉽게 말하면,

Spring 에서 HTTP 요청을 만들고(HttpRequest) 서버와 통신하는 역할을 담당하는 전략 인터페이스이다. 

 

즉, RestTemplate 의 '전송 엔진' 역할이라고 보면된다.

 

역할

역할 설명
HTTP Connection 생성 어떤 방식으로 연결할지 결정
타임아웃 설정 connect/read timeout 지정
버퍼링 여부 response body 읽기 여러 번 가능 여부
SSL/TLS 설정 HTTPS 인증서 커스터마이징 가능
Connection pooling Keep-Alive / 풀링 가능 여부

 

 

✅ Spring에서 제공하는 주요 구현체들

🔹 1) SimpleClientHttpRequestFactory

(가장 기본, JDK만으로 동작)

  • Java HttpURLConnection 기반
  • 연결 풀 없음(매번 새 연결 생성)
  • 성능은 보통이지만 의존성 없음
  • 타임아웃 설정 간단

 

예)

new SimpleClientHttpRequestFactory()

 

 

🔹 2) HttpComponentsClientHttpRequestFactory

(Apache HttpClient 기반, 가장 많이 사용된다.)

  • 커넥션 풀 지원
  • 멀티스레드 환경에서 성능 좋음
  • Keep-Alive / Idle connections 관리 지원
  • SSL 설정 커스터마이징 쉬움
  • Apache HttpClient 4.x 기반

 

예)

CloseableHttpClient httpClient = HttpClients.custom().build();
new HttpComponentsClientHttpRequestFactory(httpClient)

 

 

🔹 3) OkHttp3ClientHttpRequestFactory

(OkHttp 기반)

  • Android + Spring Boot 에서 자주 사용
  • HTTP/2 지원
  • 커넥션 풀, 리트라이 등 기능 강함

 

예)

new OkHttp3ClientHttpRequestFactory()

 

 

🔹 4) JettyClientHttpRequestFactory

(Jetty HTTP Client 기반)

  • Jetty 기반 어플리케이션과 잘 맞음
  • HTTP/2 지원
  • 비동기 요청 최적화

 

예)

new JettyClientHttpRequestFactory()

 

 

🔹 5) BufferingClientHttpRequestFactory (데코레이터)

  • Response Body 스트림을 메모리로 버퍼링
  • 스트림을 여러 번 읽을 수 있음
    → REST API 로그 남길 때 필수!

 

예)

new BufferingClientHttpRequestFactory(
        new SimpleClientHttpRequestFactory()
)

 

💡 자체적으로 HTTP 요청 처리 X

→ 다른 ClientHttpRequestFactory 위에 감싸서 사용하는 Wrapper

 

✅ 구현체 간 비교 정리

Factory 구현체 커넥션 풀 HTTP/2 장점 용도
SimpleClientHttpRequestFactory X X 의존성 없음, 단순 기본 기능
HttpComponentsClientHttpRequestFactory (Apache) O X 매우 안정적, 대규모 환경 대부분의 서버 환경
OkHttp3ClientHttpRequestFactory O O HTTP/2, 성능 좋음 모바일, 최신환경
JettyClientHttpRequestFactory O O Jetty 기반 최적화 Jetty 기반 서비스
BufferingClientHttpRequestFactory - - Response Body 여러번 읽기 가능 Request/Response 로깅

 

 

📌 결론: 실무 추천 조합

✔ 로깅(Interceptor) + 성능 둘 다 필요

@Bean
public RestTemplate restTemplate(RestTemplateInterceptor interceptor) {
    HttpComponentsClientHttpRequestFactory factory =
            new HttpComponentsClientHttpRequestFactory();

    return new RestTemplate(
            new BufferingClientHttpRequestFactory(factory)
    );
}

 

 

 

 

 

반응형
Contents