IndexedDAO 도입으로 biz-crm 검색 속도 30배 향상!

by DD
3개월 전
조회수 2

biz-crm 서비스에서 검색 기능의 성능 저하 문제를 겪으며, 6초 이상 지연되는 쿼리 응답 시간 문제를 확인

고객 인터뷰를 통해 불필요한 기능(Expression 다중 필터) 사용을 확인하고, ChannelID 필터 강제화를 통해 조회 조건 단순화

IndexedDAO 패턴을 도입하여 인덱스 기반 쿼리 작성을 유도하고, 8초 쿼리를 200ms로 단축하는 성과를 달성

성능 저하의 원인: LOWER() 함수와 인덱스 무력화

biz-crm 서비스의 성능 저하 원인은 대소문자 구분 없는 검색(Case-insensitive)을 위해 사용된 LOWER() 함수가 인덱스를 무력화했기 때문이다. 기존 코드에서는 equalIgnoreCase, contains와 같은 JOOQ 메서드가 내부적으로 LOWER(col) 패턴을 생성하여 인덱스 활용을 방해했다.

LOWER() 함수: 인덱스가 원본 값 기준으로 생성되므로, 함수 연산은 인덱스 사용 불가

JOOQ 메서드: equalIgnoreCase, contains 등에서 LOWER(col) 패턴 생성

문제 발생 시점: 데이터 증가에 따라 Full Table Scan으로 인한 성능 저하 심화

결과적으로, 대용량 데이터에서 LOWER() 함수 사용은 성능 병목(Performance Bottleneck)을 유발하는 주요 원인이 되었다.

Customer-Driven 접근 방식: 사용자 인터뷰의 중요성

기술 튜닝(EXPLAIN, Indexing)에 앞서 실제 사용자 인터뷰를 통해 기능 사용 패턴을 파악한 점이 핵심적인 성공 요인이다. biz-crm의 Expression 다중 필터가 실제로는 거의 사용되지 않고, ChannelID를 이용한 검색이 주를 이룬다는 사실을 확인했다.

불필요한 기능 파악: Expression 다중 필터의 범용성이 오히려 성능 저하의 원인

조회 조건 단순화: ChannelID 필터 강제화를 통해 성능 개선 방향 설정

Customer-driven: 사용자의 실제 사용 패턴을 기반으로 문제 해결 방향 설정

이러한 고객 중심(Customer-driven) 접근 방식은 불필요한 기술적 튜닝을 방지하고, 실제 사용자의 요구에 부합하는 해결책을 제시하는 데 기여했다.

IndexedDAO 패턴의 설계 및 구현

IndexedDAO 패턴은 Generic Expression으로 작성된 쿼리를 SearchRequest 단위로 추상화하고, 자주 사용하는 조회 조건에 대해 인덱스 히트를 보장하는 방식으로 설계되었다. 기존 JOOQ의 JooqExpressionConverter가 범용적으로 변환하던 방식을 개선하여, 인덱스 활용 여부를 명확하게 관리한다.

SearchRequest DTO: 검색 조건을 명시적으로 선언

IndexedDAO 레이어: 인덱스 히트를 보장하는 쿼리 생성 책임 분리

코드 영향 최소화: 기존 코드에 영향을 주지 않으면서 성능 개선

결과적으로, IndexedDAO 패턴은 인덱스를 의식하는 쿼리(Index-aware Query)를 만들 수 있는 구조를 제공하며, 향후 다른 테이블에도 쉽게 적용할 수 있는 확장성을 확보했다.

IndexedDAO 도입 효과: 쿼리 성능 30배 향상

IndexedDAO 패턴 도입을 통해 타임아웃을 유발하던 change_logs 테이블의 8초 쿼리가 200ms대로 단축되었다. 이는 Full Table Scan을 하던 쿼리가 인덱스를 타도록 개선된 결과이다. 동일한 패턴으로 고통받던 다른 테이블에도 순차적으로 적용하여 서비스 전반의 성능 향상을 기대할 수 있게 되었다.

8초 쿼리 -> 200ms: 쿼리 응답 시간 30배 단축

Full Table Scan -> Index Hit: 인덱스 활용을 통한 성능 개선

확장성 확보: 다른 테이블에도 동일 패턴 적용 가능

결론적으로, IndexedDAO 패턴은 성능 개선(Performance Improvement)뿐만 아니라, 시스템 전반의 유지보수성(Maintainability)확장성(Scalability)을 향상시키는 효과를 가져왔다.

biz-crm IndexedDAO 적용기