Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Populate Study Vote References to Documents #177

Open
SeungJL opened this issue Jul 12, 2024 · 0 comments
Open

Populate Study Vote References to Documents #177

SeungJL opened this issue Jul 12, 2024 · 0 comments

Comments

@SeungJL
Copy link
Contributor

SeungJL commented Jul 12, 2024

문제 상황

스터디 투표 정보를 가져올 때, 평균 2.3초 정도의 시간이 소요되고, 이는 mongoDB에서 스터디 장소와 참여자들 데이터들을 objectID로 저장해둔걸 populate하는 과정에서 소요가 길어진다고 예상하고 있었음. 하지만 실제로 프론트로 오는 데이터가 몇개든 소요 시간에 큰 차이가 없었고, 백엔드 코드를 확인했음.

await Vote.findOne({ date }).populate([
    "participations.place",
    "participations.attendences.user",
    "participations.absences.user",
  ]);

백엔드에서는 보내야 하는 지역이 어디든 date 기준으로 모든 데이터를 일단 populate를 한 뒤에 그 중에서 filter을 하는 식으로 프론트로 전송하고 있었음. 이를 필요한 participations만 골라낸 뒤에 populate를 진행하면 훨씬 소요가 감소할 거라고 예상함.

따라서 두가지 해결책을 생각함

  1. location을 전송하면 해당 location의 participations만 필터 후에 populate 진행

  2. 최초 home 화면에서 보이는 스터디 장소는 3개만 있으면 됨. 때문에 조건에 따라 장소 해당 location의 장소 3개만 전송해도 될 거 같은데, 이 때 발생하는 추가적인 소요들이 있음

  • a. 참여 인원에 따른 알고리즘 정렬을 백엔드에서 진행해야 함
  • b. 기타 자잘한 것들

때문에 장소를 3개 전송할때와 전체를 전송할때 소요되는 시간 차이가 어느정도일지 비교한 뒤에 판단이 필요.

모임 데이터도 마찬가지!

소요 시간 평균 6.5초

위의 vote data와 마찬가지라로 cursor에 상관없이 일단 모든 gather 데이터를 가져와서 populate를 한 뒤에 필터를 하는 방식입니다. cursor 등의 방법으로 필터를 하는건 전송 상의 데이터를 줄이는 거고, cursor을 적용한 뒤에(필터를 한 뒤에) populate를 한다면 소요가 훨씬 감소할 거라 예상합니다.

소모임 데이터 성능 분석
url:/groupStudy
소요시간 평균 4.8초
특정 id를 프론트에서 보내고 해당 id만 가져오는 기능 추가 필요
status가 end가 아닌 것들과 end인 것들을 필터해서 가져올 수 있도록 변경
cursor을 추가해서 항목을 cursor 개수만큼만 가져올 수 있도록 변경
이 때 데이터는 cursor 개수만큼 랜덤으로 가져올 수 있도록 함
이 때 위의 1,2,3번 모두 필터후에 populate를 하면 성능이 개선될거라고 예상

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant