피드로 돌아가기
올리브영 테크블로그Backend
원문 읽기
신규 전시 프로젝트에서 WebClient 사용하기
올리브영 전시팀이 RestTemplate 대신 WebClient를 도입해 동시 사용자 1,000명 이상에서 응답속도 격차 확대
AI 요약
Context
올리브영 전시팀은 모놀로식 아키텍처에서 MSA로 마이그레이션하면서 신규 전시 서버가 기존 온라인몰 서버와 빈번하게 통신해야 했다. 기존의 RestTemplate 기반 Blocking I/O 방식은 동시 사용자 수 증가 시 응답 지연이 급속도로 악화되는 문제가 있었다.
Technical Solution
- HTTP 클라이언트를 RestTemplate(Spring 3.0, Blocking I/O, 멀티 스레드)에서 WebClient(Spring 5.0, Non-Blocking I/O, 싱글 스레드)로 변경
- spring-boot-starter-webflux 의존성 추가로 Reactor 기반 Mono/Flux 타입 지원
- MaxInMemorySize를 기본값 256KB에서 2MB로 증설해 대용량 응답 처리
- HttpClient 레벨에서 Connection Timeout을 10초, Response Timeout을 60초로 명시 설정
- mutate() 메서드로 기존 WebClient 인스턴스를 불변으로 유지하면서 X-Fingerprint 헤더 등 추가 설정을 적용
- retrieve() 메서드로 HTTP 상태코드별 처리(4xx, 5xx 분기) 또는 exchange() 메서드로 원본 ClientResponse 접근 가능
Impact
동시 사용자 1,000명 미만 구간에서는 RestTemplate과 WebClient의 응답속도 차이가 미미하지만, 동시 사용자 수가 증가할수록 응답속도 격차가 점진적으로 확대됨
Key Takeaway
Spring Boot 2.5 이상에서 다른 서비스와의 동기식 HTTP 통신이 필요한 경우, Non-Blocking 기반의 WebClient를 선택하면 고부하 구간에서 스레드 풀 고갈 문제를 회피하고 응답성을 유지할 수 있다.
실천 포인트
Spring Boot 2.5 이상 환경에서 마이크로서비스 간 API 호출 시 WebClient의 Builder 패턴으로 maxInMemorySize(2MB), Connection Timeout(10초), Response Timeout(60초)를 사전 설정하고 mutate()로 요청별 커스텀 헤더를 추가하면, 동시 사용자 1,000명 이상 환경에서 RestTemplate 대비 응답 지연을 크게 완화할 수 있다.