-
Notifications
You must be signed in to change notification settings - Fork 2
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
refactor: 팔로잉 소식 조회 쿼리 성능 개선 #437
Conversation
…정(팔로우 취소시에는 알림 발송 x) (#421)
Test Results64 tests 64 ✅ 2s ⏱️ Results for commit 8f5821e. ♻️ This comment has been updated with latest results. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안 그래도 쿼리 삭제해야 한다고 말씀 드리려고 했는데 발견해 주셔서 감사합니다 !!
private QFollowingMemoryLogEntity followingMemoryLog = | ||
QFollowingMemoryLogEntity.followingMemoryLogEntity; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 방식은 왜 바꾼 건가요??
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이 편이 더 깔끔해 보여서 없애봤습니다. 다음 PR 에서 다른 Repository도 동일하게 적용해볼까 생각하고 있습니다.
🌱 관련 이슈
📌 작업 내용 및 특이사항
팔로잉 소식 조회 시 firstResult/maxResults specified with collection fetch; applying in memory 라는 경고 로그가 발생했습니다.
![image](https://private-user-images.githubusercontent.com/96187152/369674268-f3a3f378-b1ef-4d4f-b7b4-0ab17c907680.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2NDU3MjMsIm5iZiI6MTczOTY0NTQyMywicGF0aCI6Ii85NjE4NzE1Mi8zNjk2NzQyNjgtZjNhM2YzNzgtYjFlZi00ZDRmLWI3YjQtMGFiMTdjOTA3NjgwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDE4NTAyM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQ4YTU0ZWVkNGFlNDRjNDdkNjQwNDhlOTQ2MTE1M2FkZmNlZGFlOGIyNjMwOWQyOTIwOGViYmNlMWI5MmNkM2MmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.B58iKBPltYkE97G3g5lTFPrbvwMZGK7o9mQNkS361ek)
이는 oneToMany관계에서 fetch join 을 걸고, 페이징 처리를 하려 할 때 발생하는 문제로 조회한 모든 데이터를 메모리에 올린 후 페이징을 한다는 뜻입니다. (10개의 데이터만 페이징 해서 가져와야 하는데 100개를 다 들고 온 다음 앞의 10개를 자른다는 뜻입니다. )
이를 해결하기 위해 memory와 oneToMany 인 stroke, image를 fetchJoin에서 제외하였습니다. (Batch Size 가 지정되어 있어 in 절로 해당 stroke, image를 조회하게 됩니다.)
결과
k6으로 성능 테스트를 해본 결과입니다.
개선 전 성능입니다.
![개선 전 성능 (10 100)](https://private-user-images.githubusercontent.com/96187152/369677377-afaaa49b-3657-4ae9-a0cb-fe250c151d53.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2NDU3MjMsIm5iZiI6MTczOTY0NTQyMywicGF0aCI6Ii85NjE4NzE1Mi8zNjk2NzczNzctYWZhYWE0OWItMzY1Ny00YWU5LWEwY2ItZmUyNTBjMTUxZDUzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDE4NTAyM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU0Y2MwNThkNDY5NGU4MzM0ODExZGMwZDgyMGM2MTlmYjliZjEwYWRmODVkMTUzN2JjMDRjMWIzMmNmMTM0YTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.YsZNaRKiDFmTmJ7yAbbHo_sl85-Agt-RCPTlnMBYNS4)
개선 후 성능입니다.
![개선 중 (firstresult 제거) 성능 (10 100)](https://private-user-images.githubusercontent.com/96187152/369674814-60aeefbe-1919-4cd0-b034-14d8d59b3317.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2NDU3MjMsIm5iZiI6MTczOTY0NTQyMywicGF0aCI6Ii85NjE4NzE1Mi8zNjk2NzQ4MTQtNjBhZWVmYmUtMTkxOS00Y2QwLWIwMzQtMTRkOGQ1OWIzMzE3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDE4NTAyM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc0YjJhMDkzN2M3NjM2OTA2YTUxOWRlNGNlMWRmZjdlZGJkMTA3YjVlYzU0YTk0Mzk0ZWRmYmZmOGJlNWFkMDMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.KQQJGizBbX6-TmsZvCTf7TDVtJaHQdh4W-2xVOtjVGs)
📝 참고사항
24.09.23 수정
다중 삽입/삭제:
followingMemoryLog에 member(소식 받는 사람) 칼럼을 추가할 경우, 수영 기록이 등록되거나 삭제될 때마다 해당 사용자를 팔로우하는 사람 수만큼 followingMemoryLog 레코드가 추가/삭제되어야 합니다.
팔로우 시 다량의 데이터 추가 문제:
사용자가 새로운 팔로우를 추가할 때, 해당 유저의 최근 100일간의 메모리 기록을 모두 followingMemoryLog에 추가해야 합니다.
3.또한 큰 성능의 차이가 나지 않았습니다. 아래는 각각 friend 로 조인하여 조회 하는 방법과 followingMemoryLog 에 member 칼럼을 추가 한 후 테스트 하였습니다. (50명 팔로우, 유저 당 100일 치 기록, 10 thread per 1sec, 100 loop)
followingMemoryLog에 member 칼럼 추가 전
![image](https://private-user-images.githubusercontent.com/96187152/369841432-39e678ea-939c-481a-97df-80645b504733.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2NDU3MjMsIm5iZiI6MTczOTY0NTQyMywicGF0aCI6Ii85NjE4NzE1Mi8zNjk4NDE0MzItMzllNjc4ZWEtOTM5Yy00ODFhLTk3ZGYtODA2NDViNTA0NzMzLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDE4NTAyM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTBiMTNiYjhhZjkyYjMxOGZiOTNhMWVjZWQ4ZDlhNjIzMzc3ZmZkOTk5ZGU3MjAwYWY2MzIzMjlhMTdkN2Q4YTUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.2gM_cZbgvD9YR-JDr-U65NsHBWGbITwvHJDqvP-DBoM)
followingMemoryLog에 member 칼럼 추가 후
![image](https://private-user-images.githubusercontent.com/96187152/369844431-03b1dc30-0c02-406b-96b1-f4f1eb6a20cf.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk2NDU3MjMsIm5iZiI6MTczOTY0NTQyMywicGF0aCI6Ii85NjE4NzE1Mi8zNjk4NDQ0MzEtMDNiMWRjMzAtMGMwMi00MDZiLTk2YjEtZjRmMWViNmEyMGNmLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTUlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE1VDE4NTAyM1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY3YTA3MTYyY2RjMzMwNzM5NmExMjBhMmU0OTI4MjEwYTA4NjlhNjhmNWRiMWUzNDAwZDM1ZTQwNWM1ZjJmMzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0._fgRQ-YovsXC8gUa1qFI-EJDXnZyszOe19vkQPKZ3qk)
따라서 쿼리 성능이 개선되지 않을 뿐만 아니라, 오히려 수영 기록 및 팔로잉 관련 CUD(Create, Update, Delete) 작업 성능이 저하될 것이라 판단되어 적용하지 않았습니다.