-
Notifications
You must be signed in to change notification settings - Fork 0
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
Feat(Problem): 시험, 과목, 자격증 테이블의 역정규화 #85
base: develop
Are you sure you want to change the base?
Conversation
- 사용하지 않던 클래스 삭제
- Subject, Exam, Certificate의 정보를 합친 ProblemInfo Entity를 만들고, Problem과 매핑 - 기존에 Problem에 서브 쿼리를 날리던 것을 left join으로 바꿔 성능 향상
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.
역정규화 도입한건 아주 좋은듯 ~
도입 전 후의 성능 차이가 궁금하네
그리고 problemInfo가 DB에 없으면 inner join으로 아무 값이 안나올것 같으니 개발 DB 업데이트가 필수적일듯~
.join(problem.problemInfo, problemInfo) | ||
.leftJoin(bookmark).on(bookmark.problem.id.eq(problem.id).and(memberIdExistsOrFalse(memberId))) |
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.
로그인 여부랑 상관없이 bookmark를 join하고 있는데 이 부분을 수정이 필요한거 아닌가?
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.
이게 내가 서브 쿼리로 짰던 이유였어...! 흐음... 수정을 해야겠네.. 감사
.flatMap(subjectId -> { | ||
List<ProblemWithBookmarkDetailQueryDto> problems = problemRepository.findDetailByExamIdAndSubjectIdWithBookmark(memberId, examId, subjectId, MAX_PROBLEM_COUNT); | ||
Collections.shuffle(problems); // 문제 리스트를 랜덤으로 섞음 | ||
return problems.stream().limit(count); | ||
}) |
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.
기존에는 20문제를 DB에서 랜덤으로 가져왔다고 하면
지금은 20문제만 가져오는 로직인데 여기서 발생하는 차이가 있을 듯?
그 이유는 examId, subjectId에 맞는 값을 가져올 때
examId와 subjectId를 queryDSL에 Nullable 하게 쿼리를 만들어서 전달하는데, subjectId는 현재 로직 상 무조건 받기 때문에 해당 사항은 아니지만 examId는 nullable 하기 때문에
- examiId가 null이 아닌 경우 -> examId와 subjectId 모두 맵핑 되는 문제는 20문제밖에 존재하지 않아 기존의 로직과 새 로직의 차이가 없음
- examId가 null인 경우 -> subjectId만 맵핑되는 쿼리 결과가 나오기 때문에 정처기 기준 100+a 에 값들 중 20문제가 랜덤으로 뽑혔으나 지금에는 DB 쿼리 결과가 고정이 될것으로 예상이 됨 -> 클라이언트랑 합의가 된 부분인지??
라고 생각 되는데 혹시 내가 이해한게 맞나? 잘못 이해했다면 말해줘 approve로 바꿀게
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 변경된 내용
역정규화 테이블 ProblemInfo 생성
Bookmark 여부를 서브쿼리로 가져오던 것에서 join으로 가져오도록 변경
랜덤 쿼리 개선
기존에 각 과목마다 최대 20문제를 랜덤으로 가져오는 부분에서 RAND() 함수를 통해 MySQL에 쿼리를 날림
20문제를 모두 가져와서 랜덤으로 섞은 후 원하는 개수를 반환하는 것으로 변경
위 사항들에 따른 테스트 코드 변경
추가 내용
참조
Closes #76