Skip to content

팔로워 수 반환 문제

pc5401 edited this page Dec 4, 2024 · 1 revision

문제점 🚨

팔로워 수를 조회할 때 항상 0 또는 1로만 반환되는 문제가 발생했습니다.

원인 분석 🕵️‍♂️

  • 원인: 기존 코드에서 innerJoingetCount()를 사용하여 팔로워 수를 계산했습니다.
    • 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;

해결 방법 🛠️

leftJoinCOUNT(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을 사용함으로써 팔로워가 없는 스트리머도 조회됩니다.

결론 🏁

이번 수정으로 팔로워 수 반환 문제가 해결되었습니다. 처음 작성할 때, 어떻게 쿼리가 생성될 지 생각하지 않았던 것이 실수의 이유였습니다. 지금 정확한 팔로워 수를 제공함으로써 사용자 경험을 향상시킬 수 있습니다. 앞으로도 데이터 조회 시 조인 방식과 집계 함수를 신중하게 선택해야 합니다.

👋 소개
📖 회의록
🗓️ 개발일지
🗃 설계 문서
🕵️‍♂️ 회고록
💪 멘토링 일지
🎳 트러블 슈팅
💽 발표자료
Clone this wiki locally