본문으로 이동
Spring JDBC 성능 문제, 네트워크 분석으로 파악하기
문서

Spring JDBC 성능 문제, 네트워크 분석으로 파악하기

강민주 · 토스 · 토스 기술 블로그

원본 보기

소개

토스페이먼츠 정산 플랫폼에서 많은 양의 정산 데이터 처리 과정에서 생긴 지연 이슈를 처리한 방법을 소개해요.

AI 핵심 요약

Spring Batch에서 JDBC `batchUpdate()`로 정산 데이터를 대량 삽입할 때 지연이 발생했지만, 쿼리 로그만으로는 원인을 찾지 못했다. Wireshark로 TCP 패킷을 분석해 insert 전에 반복되는 조회를 발견했고, Spring JDBC 코드를 추적해 null 파라미터의 SQL 타입을 알 수 없을 때 Oracle 드라이버가 `ParameterMetaData`를 얻기 위한 쿼리를 실행한다는 점을 확인했다. 전역 설정을 바꾸는 대신 null이 가능한 파라미터에 SQL 타입을 명시해 추가 조회를 막았으며, 약 100만 건 처리 시간이 18분에서 2분으로 줄었다. 이 사례는 네트워크 분석과 JDBC·드라이버 구현 확인이 로그만으로 드러나지 않는 성능 병목을 찾는 데 유용하며, 드라이버별 동작 차이도 고려해야 함을 보여준다.

  • 애플리케이션 로그에 원인이 보이지 않을 때는 Wireshark로 TCP 스트림을 확인해 실제 데이터베이스 통신을 살펴볼 수 있다.
  • JDBC 파라미터에 null을 전달하면 SQL 타입이 불명확할 수 있어 드라이버가 ParameterMetaData를 조회할 수 있다.
  • null이 가능한 파라미터에는 `MapSqlParameterSource.addValue()` 등에 SQL 타입을 명시하면 불필요한 메타데이터 조회를 피할 수 있다.
  • `spring.jdbc.getParameterType.ignore` 설정은 전역 동작에 영향을 줄 수 있으므로, 적용 범위와 데이터베이스별 동작을 고려해 선택해야 한다.
  • JDBC의 동작은 데이터베이스 드라이버마다 다르므로, 같은 코드라도 Oracle과 MySQL에서 성능 특성이 달라질 수 있다.