-
Notifications
You must be signed in to change notification settings - Fork 3
다른 사용자 정보 조회
박지율 edited this page Dec 9, 2021
·
7 revisions
다른 유저 프로필 조회 API 구현 방식에 따른 속도 테스트
다른 유저 프로필 조회 API 를 2가지 방식으로 구현했습니다.
user 1 은 질문 4000개 답변 2000개 댓글 1만개 고인물입니다.
user 2 는 질문 2개 답변 10개 댓글 15개 뉴비입니다.
답변,질문,유저 테이블을 조인해서 데이터를 가져온 후 length로 갯수를 체크한다음 리턴 -> 쿼리를 한번날림
async getUserProfile(userId: number) {
const user = await this.userRepository
.createQueryBuilder('user')
.innerJoinAndSelect('user.question', 'question')
.innerJoinAndSelect('user.answer', 'answer')
.innerJoinAndSelect('user.comment', 'comment')
.where('user.id = :userId', { userId })
.getOne();
const userProfile = {
user: user,
questionCount: user.question.length,
answerCount: user.answer.length,
commentCount: user.comment.length
};
return userProfile;
}
응답이 늦어 결국 서버가 죽었습니다.
select 의 문제인가 싶어 innerjoinandselect 대신 select에 조인한 데이터의 id만 명시해줬습니다만 결과는 같았습니다.
밑의 코드 참고
async getUserProfile(userId: number) {
const user = await this.userRepository
.createQueryBuilder('user')
.innerJoin('user.question', 'question')
.innerJoin('user.answer', 'answer')
.innerJoin('user.comment', 'comment')
.where('user.id = :userId', { userId })
.select(['user.id', 'user.nickname', 'user.email', 'user.photo', 'user.liked_count', 'question.id', 'answer.id', 'comment.id'])
.getOne();
const userProfile = {
user: user,
questionCount: user.question.length,
answerCount: user.answer.length,
commentCount: user.comment.length
};
return userProfile;
}
20~30ms
loadRelationCountAndMap을 사용해서 각 갯수를 가져옴 실제로 실행되는 쿼리
쿼리가 3개 날아감
async getUserProfile(userId: number) {
const user = await this.userRepository
.createQueryBuilder('user')
.where('user.id = :userId', { userId })
.loadRelationCountAndMap('user.questionCount', 'user.question')
.loadRelationCountAndMap('user.answerCount', 'user.answer')
.loadRelationCountAndMap('user.commentCount', 'user.comment')
.select(['user.id', 'user.nickname', 'user.email', 'user.photo', 'user.liked_count'])
.getOne();
return user;
}
20~30ms
18~25ms
예상했던 결과 : 쿼리를 여러번 날리는 B가 더 느릴 것이라 예상
실제 결과 : 많은 데이터에서는 B가 비교 불가능한 수준으로 빨랐고, 적은 데이터에서 또한 B가 빨랐습니다.
결론 : count를 위해서는 select후 length가 아닌 count 연산을 사용하는 것이 필수입니다.