“같은 데이터, 다른 접근으로 15배 빨라진 이야기”

1) 배경과 문제

시간표 탭에서 “월 1, 2, 3교시 & 수 1,2교시”처럼 요일·교시 조합으로 과목을 검색할 때가 있습니다.

그런데 이 필터가 들어가면 응답 속도가 2초 이상으로 느려지는 현상이 존재했었습니다.

Screenshot 2025-10-19 at 12.57.46 AM.png

Screenshot 2025-10-19 at 12.58.20 AM.png

데이터 구조를 살펴보면 다음과 같았습니다. 한 과목이 여러 스케줄을, 한 스케줄이 여러 교시를 갖는 구조였죠.

예를 들어, “의사결정과토론”은

한 학기 과목 데이터만 봐도:

검색 시 세 테이블을 모두 조인해야 하다 보니,

조인 비용 + 필터링 비용 + 메모리 후처리가 겹치며

캐시가 없을 때는 2초가 훌쩍 넘는 경우가 왕왕 존재했습니다.

2) 왜 느렸을까?

“월 1,2,3교시”처럼 여러 조건을 동시에 만족해야 해서 DB에서 효율적으로 처리하기 어렵습니다.

그래서 당시 코드에서는 이렇게 처리하고 있었습니다:

schedule.periods.contains(1) // 해당 스케줄이 1교시를 포함하고 있나
    && schedule.periods.contains(2) // 2교시를 포함하나
    && schedule.periods.contains(3) // 3교시를 포함하나