-
Notifications
You must be signed in to change notification settings - Fork 0
팔로워 수 반환 문제
pc5401 edited this page Dec 4, 2024
·
1 revision
팔로워 수를 조회할 때 항상 0
또는 1
로만 반환되는 문제가 발생했습니다.
-
원인: 기존 코드에서
innerJoin
과getCount()
를 사용하여 팔로워 수를 계산했습니다.-
innerJoin
은 조인된 결과가 없을 경우 해당 레코드를 제외합니다. - 따라서 팔로워가 없는 스트리머는 조회되지 않아
0
이 반환되었습니다. - 반대로 팔로워가 있는 경우에도 조인 결과가 단일 레코드로 처리되어
getCount()
가 항상1
만 반환되었습니다.
-
// 팔로워 수 조회 (개선 전)
async getFollowerCount(streamerId: number): Promise<number> {
const count = await this.usersRepository
.createQueryBuilder('user')
.innerJoin('user.followers', 'follower')
.where('user.id = :streamerId', { streamerId })
.getCount();
return count;
}
-
생성된 SQL 쿼리:
SELECT COUNT(*) AS count FROM users user INNER JOIN follows follows ON user.users_id = follows.streamer_id INNER JOIN users follower ON follower.users_id = follows.follower_id WHERE user.users_id = :streamerId;
leftJoin
과 COUNT(follower.id)
를 명시적으로 사용하여 정확한 팔로워 수를 반환하도록 수정했습니다.
-
leftJoin
사용: 팔로워가 없는 경우에도 스트리머 정보를 포함합니다. -
COUNT(follower.id)
사용: 팔로워의 ID를 명시적으로 카운트하여 정확한 팔로워 수를 계산합니다.
// 팔로워 수 조회 (개선 후)
async getFollowerCount(streamerId: number): Promise<number> {
const result = await this.usersRepository
.createQueryBuilder('user')
.leftJoin('user.followers', 'follower')
.where('user.id = :streamerId', { streamerId })
.select('COUNT(follower.id)', 'count')
.getRawOne();
return parseInt(result.count, 10);
}
-
생성된 SQL 쿼리:
SELECT COUNT(follower.users_id) AS count FROM users user LEFT JOIN follows follows ON user.users_id = follows.streamer_id LEFT JOIN users follower ON follower.users_id = follows.follower_id WHERE user.users_id = :streamerId;
- 정확한 팔로워 수 반환: 팔로워 수가 정확하게 계산되어 사용자에게 올바른 정보를 제공합니다.
-
팔로워가 없는 경우에도 대응:
leftJoin
을 사용함으로써 팔로워가 없는 스트리머도 조회됩니다.
이번 수정으로 팔로워 수 반환 문제가 해결되었습니다. 처음 작성할 때, 어떻게 쿼리가 생성될 지 생각하지 않았던 것이 실수의 이유였습니다. 지금 정확한 팔로워 수를 제공함으로써 사용자 경험을 향상시킬 수 있습니다. 앞으로도 데이터 조회 시 조인 방식과 집계 함수를 신중하게 선택해야 합니다.