목차
왜 포스팅을 하는가?
필자는 최근 자바로 구축된 레거시 프로젝트에서 코틀린 서버를 새로 구축하여 지원자 통합 검색 서버를 구축한 적이 있다. 코틀린 언어 자체에 대한 학습이나 사내교육등은 모두 선행으로 책임지고 진행을 했었고, 자신감도 차있는 상태에서 나름 성공적으로 서비스를 서버를 만들어 배포까지 했다.
하지만, 지원서는 RDB에 수십 개 이상의 정규화된 테이블이 존재했고, 수십 개 이상의 복합 조건들은 다이나믹 쿼리 빌더에 의해 작성되며 복잡한 조인 쿼리가 만들어지게 되고, 조건에 따라 서브쿼리가 추가되기도, outer join들이 추가되기도 하면서 쿼리 속도는 아무리 인덱스 튜닝을 하더라도 느려질 수 밖에 없었다.
페이징 처리가 필요해지는 상황에서 카운트 쿼리를 위해 요청마다 두 번 이상의 검색 쿼리가 수행되다보니 이를 줄이기 위해 코루틴을 생각했고, 아무 생각없이 넣은 코루틴 로직은 검색 서비스 쿼리 타임아웃이라는 문제를 일으키게 되었다.
검색 쿼리의 수행시간이 1분 이상이 걸리는 상황에서 비동기로 카운트 쿼리가 동시 수행되고, 이를 기다리지 못한 사용자가 재 검색 요청들을 계속해서 보내게되니 커넥션풀은 가득차고, 이는 해당 RDB를 사용하는 모든 서비스에 장애를 가져오는 결과까지 불러오게 되었다.
이를 해결하기위해 결국 ElasticSearch까지 도입을 하게되었지만, 이번 포스팅에서는 가볍게 코루틴을 적용했다가 참사가 났던 부분에 집중해 코루틴에 대해 좀 더 알아보고 잘 사용하기 위한 방법론에 대해 학습해본다.