Feign 코드 분석과 서버 성능 개선
김성두 · 토스 · 토스 기술 블로그
소개
Feign과 다중 스레드를 사용하는 과정에서 생긴 문제를 이해하고 성능 개선까지 한 경험을 공유해요.
AI 핵심 요약
약 15,000건의 데이터를 다중 스레드로 처리하던 중 서버가 느려지는 문제가 발생했고, 스레드 덤프의 `locked` 표시를 따라 원인을 조사했습니다. Feign의 기본 클라이언트가 `HttpURLConnection`을 사용하고, JDK 11의 내부 `KeepAliveCache`가 정적 공유 자원인 데다 `synchronized`로 보호되어 여러 스레드가 대기하는 것이 원인이었습니다. Spring Boot 2.x에서 Apache HttpClient 5 의존성만 추가하고 활성화 설정을 빠뜨린 점을 바로잡거나 JDK 17 이상으로 업그레이드해 해결할 수 있었습니다. 개선 후 API 처리량은 최소 8배 향상됐고, 약 10분 걸리던 작업이 1분대로 줄어 Feign의 실제 런타임 구현과 JDK 내부 동작을 확인하는 중요성을 얻었습니다.
- Feign 의존성을 추가하는 것만으로 원하는 HTTP 클라이언트가 선택되는지 가정하지 말고, 실제 런타임 구현체를 확인하세요.
- Spring Boot 2.x에서 Feign과 Apache HttpClient 5를 함께 쓸 때는 `feign.httpclient.hc5.enabled: true` 설정이 필요합니다.
- 스레드 덤프의 `locked` 표시를 단서로 삼아 호출 경로를 추적하면 공유 자원과 동기화 지점을 찾는 데 도움이 됩니다.
- JDK 17 이상으로 업그레이드하거나 Feign의 HTTP 클라이언트를 교체하는 방식으로 문제를 해결할 수 있습니다.
비슷한 학습 자료
토스ㅣSLASH 23 - 프로파일러로 시스템 성능 향상시키기
SLASH · YouTube
Spark Connect on Kubernetes #1: 견고한 Spark Connect 만들기
박지원 · 토스 기술 블로그
고객은 절대 기다려주지 않는다: 빠른 데이터 서빙으로 고객 만족도를 수직 상승 시키는 법
이세찬 · 토스 기술 블로그
신용대출 찾기 서비스 제휴사 Mock 서버 개발기 #2
류경린 · 토스 기술 블로그
SSR 서버 최적화로 비용 아끼기
정진우/문현경 · 토스 기술 블로그
Spring JDBC 성능 문제, 네트워크 분석으로 파악하기
강민주 · 토스 기술 블로그