Skip to content

Conversation

@elive7
Copy link
Contributor

@elive7 elive7 commented Sep 1, 2025

🍃 Pull Requests

⛳️ 작업한 브랜치

  • Resolved: #213

👷 작업한 내용

  • 몽고 db를 활용하여 가수이름 검색, 노래 검색을 구현했습니다.
    • 가수별 노래 이름 검색의 경우 like로도 충분할 것 같아 그 검색에는 MongoDB를 구현하지 않았습니다.
    • 가수 이름은 자동완성, 노래 이름은 nori+english analyzer+자동 완성 인덱스를 사용하였습니다. 또한 노래 이름의 경우에는 검색어의 길이에 따라 각각 필드에 대한 가중치를 다르게 주어 계산했습니다.
    • 첫 페이지에서 altas search를 활용한 결과를 얻을 수 없는 경우, 다시 한 번 mysql like를 시도하는 fallback구조로 작성했습니다.
    • 기존 곡 collect시 MongoDB에도 노래 데이터가 들어가도록 작성했으며, 하루에 한번은 배치 작업을 통해 MOngoDB에 없는 데이터들을 저장할 수 있도록 했습니다.
    • 성능 테스트 결과 mongoDB가 복잡한 연산+MySql에 한 번 더 조회하는 오버헤드가 있음에도 불구 p99에서 더 안정적인 모습을 보였습니다. (repository, service단 모두)
    • 이메일이 부족하여, dev,prod에 대한 Mongo Cluster만 생성한 관계로 local에서는 MongoDB repoistort가 noop으로 동작할 수 있도록 설정했습니다.

🚨 참고 사항

elive7 added 29 commits April 13, 2025 18:38
- 가수 검색의 경우 nori가 아닌 edege n-gram을 사용해 자동완성 효과를 낼 수 있도록 작성했습니다.
- mongodb에서는 id만 반환하기 떄문에, 해당 id 리스트를 가지고 페이지네이션을 구현할 수 있도록 IdsWithHasNext를 작성해주었습니다.
- idsWithHasNext을 가지고 가수 데이터로 변환할 때, id 리스트 순서대로 가져올 수 있도록 findAllByIdsInOrder를 추가했습니다.
-  mongodb에서 결과를 찾을 수 없는 경우, fall-back 구조로 mysql에서 검색이 일어날 수 있도록 했습니다.
- 곡의 상당수가 영어인 관계로 한국어 분석기 nori+영어 분석기 english+자동 완성의 형태로 인덱스를 구현했습니다.
- 길이가 짤은 경우에는 자동완성에 2배의 가중치를 주고, 길이가 길어지면 분석기를 통한 결과에 2배의 가중치를 주도록 작성했습니다.
- 가수별 곡 검색의 경우, 검색하려는 데이터의 범위가 매우 한정적이라고 생각해 따로 altas search를 적용하지는 않았습니다.
- 역시 똑같은 방식으로 SongQueryService 내 searchSongs를 수정했습니다.
- ids 순서대로 결과를 받을 수 있도록 findAllByIdsInOrder를 추가했습니다.
- 첫페이지인데 결과가 없는 경우 mysql like로 fall-back하도록 코드를 작성했습니다.
- 곡이 생성될 떄 mongodb에도 해당 곡이 들어갈 수 있도록 처리했습니다.
…가 저장되도록 수정

- 현재 곡 생성은 SongCollector가 담당하고 있기에 해당 과정에서 mongodb에도 데이터가 삽입되도록 수정했습니다.
- 이 때 mongodb의 songid가 mysql 속 songid와 같을 수 있도록 PreparedStatement 을 사용했습니다.
- 하루에 한 번 mysql에 있는 song 중 mongofb에서 없는 song들을 추가적으로 삽입하는 동기화 로직을 작성했습니다.
- 가수별로 곡 검색의 경우 결과가 얼마 되지 않기에 mysql like로 처리할 예정입니다.
- 이 과정에서 MongoRepository 인터페이스와 2개의 구현체로 분리했습니다.
@elive7 elive7 requested a review from jinkonu September 1, 2025 15:45
@elive7 elive7 requested a review from sebbbin September 1, 2025 15:45
@elive7 elive7 self-assigned this Sep 1, 2025
@elive7 elive7 added the feat 🔥 new feature label Sep 1, 2025
Copy link
Collaborator

@jinkonu jinkonu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

대장정을 하셨군요 ...
정말 고생 많으셨고 작년보다도 훨씬 성장한 모습을 보면서 저도 많은 자극을 받았습니다.
Mongo DB와 맞닿아 있는 기술적인 부분은 블로그 글 보면서 팔로업 해볼게요!
수고 많으셨습니다 🥹🥹

findAllByIdsInOrder -> findAllByIdsInListOrder로 리스트의 순서를 반영한다는 의미를 명확히 하였습니다.
findAllIdByIdIn->findAllByIdsIn 기존 이름이 중복되고 이상해서 수정했습니다.
- ArtistMongo를 확장해서 쓸 이유도 없고 지금은 List로만 사용하고 있기에 그에 맞게 정의 부분을 수정했습니다.
@elive7 elive7 merged commit 8056b35 into dev Sep 26, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feat 🔥 new feature

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants