본문으로 이동
Feign 코드 분석과 서버 성능 개선
문서

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 클라이언트를 교체하는 방식으로 문제를 해결할 수 있습니다.