“같은 데이터, 다른 접근으로 15배 빨라진 이야기”
시간표 탭에서 “월 1, 2, 3교시 & 수 1,2교시”처럼 요일·교시 조합으로 과목을 검색할 때가 있습니다.
그런데 이 필터가 들어가면 응답 속도가 2초 이상으로 느려지는 현상이 존재했었습니다.


데이터 구조를 살펴보면 다음과 같았습니다. 한 과목이 여러 스케줄을, 한 스케줄이 여러 교시를 갖는 구조였죠.
과목 1 → 스케줄 N → 교시 M예를 들어, “의사결정과토론”은
월요일 1·2·3교시,
금요일 4·5교시
이렇게 두 개의 스케줄을 가지고, 각 스케줄은 [1, 2, 3], [4, 5]라는 교시들을 가집니다.
한 학기 과목 데이터만 봐도:
검색 시 세 테이블을 모두 조인해야 하다 보니,
조인 비용 + 필터링 비용 + 메모리 후처리가 겹치며
캐시가 없을 때는 2초가 훌쩍 넘는 경우가 왕왕 존재했습니다.
“월 1,2,3교시”처럼 여러 조건을 동시에 만족해야 해서 DB에서 효율적으로 처리하기 어렵습니다.
그래서 당시 코드에서는 이렇게 처리하고 있었습니다:
schedule.periods.contains(1) // 해당 스케줄이 1교시를 포함하고 있나
&& schedule.periods.contains(2) // 2교시를 포함하나
&& schedule.periods.contains(3) // 3교시를 포함하나