✅ 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)
);
}