0. 전제
테스트 시나리오
로컬 ↔ 외부 API 호출
0 ~ 500 VUS까지 30초간 점진적 증가 (100, 300, 500 단계)
각 단계별(100, 300, 500 VUS) 30초간 steady call 유지
환경
네트워크: 로컬(한국) ↔ 일본(VPN) ↔ 한국(server) 호출
하드웨어: Windows 11, AMD Ryzen 7 5800X (8-Core / 16-Thread), 메모리 64GB
소프트웨어: Spring Boot 3.5.7
JVM 설정: Heap max 16GB, min 1GB
JVM 스레드풀: 초기 200으로 설정, 이후 400까지 확장하여 테스트 진행
1. 기본 동작 차이
구분 | OpenFeign | WebClient | 비고 |
I/O 모델 | Blocking I/O (동기) | Non-blocking I/O (비동기) | 스레드 점유 방식 차이 |
HTTP Client | JDK HttpURLConnection (기본) OkHttpClient / Apache HttpClient 5 교체 가능 | Reactor Netty (기본) | OpenFeign은 클라이언트 교체로 성능 개선 가능 |
Connection Pool | 기본 : 없음 OkHttpClient / Apache HttpClient 5 적용 시 지원 | 기본 지원 | 연결 재사용성 차이 |
2. 성능 지표 비교 (Stage 6 기준)
지표 | OpenFeign (기본) | WebClient | 설명 |
TPS (처리량) | 약 217 (포화 상태) | 약 985 (선형 증가) | WebClient가 4.5배 이상 처리 |
Mean RES | 4,409 ms | 102 ms | OpenFeign은 지연 폭증 |
P95 RES | 7,081 ms | 74.4 ms | WebClient는 안정적 |
3. 설정 및 튜닝 진행
Apache HttpClient 5 사용
클래스패스에 HttpClient 5 추가 → 자동 적용
필요 시 비활성화:
spring.cloud.openfeign.httpclient.hc5.enabled=falseBean 등록:
CloseableHttpClient직접 정의하여 커넥션 풀 크기 조절 (setMaxConnTotal,setMaxConnPerRoute)
※ Spring Cloud OpenFeign 4부터는 Apache HttpClient 4 지원 중단 → 반드시 HttpClient 5 사용
Apache Tomcat 커넥션풀 증대
server:
tomcat:
threads:
max: 400 # Tomcat Thread 400개 (Feign Connection Pool과 1:1 매칭)
accept-count: 100 # 대기 큐 크기Apache HttpClient 5 커넥션 풀 설정 추가
/**
* Apache HttpClient 5 커넥션 풀 매니저 설정
* - 전체 최대 커넥션: 400
* - 라우트별 최대 커넥션: 100
*/
@Bean
public PoolingHttpClientConnectionManager poolingHttpClientConnectionManager() {
return PoolingHttpClientConnectionManagerBuilder.create()
.setMaxConnTotal(400) // 전체 최대 커넥션 수
.setMaxConnPerRoute(100) // 라우트별 최대 커넥션 수
.build();
}
/**
* Apache HttpClient 5 빈 등록
* 커넥션 풀 매니저를 사용하여 성능 최적화
*/
@Bean
public HttpClient httpClient(PoolingHttpClientConnectionManager connectionManager) {
return HttpClients.custom()
.setConnectionManager(connectionManager)
.evictIdleConnections(TimeValue.of(java.time.Duration.ofSeconds(30)))
.evictExpiredConnections()
.build();
}4. 부하 테스트 결과
단계 | OpenFeign (기본) | OpenFeign (튜닝 후) | WebClient |
Stage 2 (100 VU) | TPS 77.8 / RES 366ms | TPS 153 / RES 331ms | TPS 91.7 / RES 140ms |
Stage 4 (300 VU) | TPS 180 / RES 2,422ms | TPS 354 / RES 2,448ms | TPS 546 / RES 93.1ms |
Stage 6 (500 VU) | TPS 217 / RES 4,409ms | TPS 394 / RES 4,972ms | TPS 985 / RES 102ms |
5. 결론
소규모 트래픽(100명 수준): OpenFeign 튜닝 시 WebClient와 유사한 성능 확보 가능
중대규모 트래픽(300명 이상): WebClient가 압도적으로 안정적이며 확장성 우수
OpenFeign 튜닝: OkHttpClient 또는 Apache HttpClient 5 적용으로 개선되지만 Blocking I/O 특성상 한계 존재
JVM 스레드풀 영향: 초기 200에서 400까지 확장했으나, OpenFeign은 스레드 점유 특성상 근본적 한계로 성능 개선 폭이 제한적
최종 권고: 대규모 트래픽 환경에서는 WebClient 사용이 적합