case1: 작품 검색 개선
요약
문제 상황 - 6초가 걸리는 쿼리 실행 시간
- ContentDocument : KeywordId = N : M
- ContentDocument 내에 Array 형태로 KeywordId가 존재
ContentDocument = {… “keywordIds”:[1,2,3…] …}
- 입력된
List<Long> keywordIds
를 가진 모든 컨텐츠를 검색해야 함
- ex:
List<Long> keywordIds = List.of(1,2,3...)
인 경우 1 또는 2 또는 3… 키워드 아이디를 갖는 모든 ContentDocument 검색
- 결과 세트가 많은 것 기준으로, 약 2만건의 결과를 반환하고, 6초의 실행 시간이 걸림
시도 1 - 인덱스 추가
- Read 수는 줄었지만 결과 세트는 줄지 않아 별 소용이 없었음
시도 2 - 집계 파이프라인을 통해 키워드 id당 3건씩만 가져와보기
- 각 keywordId 당 3개의 ContentDocument 결과만 받아오기 위해(결과 세트를 줄이기 위해) 집계 파이프라인 사용
- 6초 → 800ms로 줄어서 성공적인 줄 알았으나, 성능 테스트를 수행하면 몽고DB의 메모리가 부족하다는 예외가 반환되었음
- 확인해보니 unwind라는 집계 파이프라인은 ContentDocument를 keywordId 개수만큼 증폭시키는 동작을 하였음
- ContentDocument가 10개의 keywordId를 가졌다면 10개의 keywordId 1개를 가진 ContentDocument를 10개 만들어버리게 동작
- 따라서 해당 방안은 사용하기 어렵다고 생각함
해결 - 새로운 데이터 구조 추가
- keywordId 당 ContentDocument를 3개씩 갖는 새로운 데이터 구조를 추가하여 문제 해결