(기존 평균 평점 × 리뷰 수 + 새로운 평점) ÷ (리뷰 수 + 1)
방식으로 구현되어 있었음. 하지만 이 방식은 리뷰 수가 많아질수록 소수점 정밀도가 떨어지는 문제가 있었고, 부동 소수점 연산 누적 오차로 인해 실제 평균과 차이가 발생할 수 있었음.리뷰가 많아지더라도 기사님의 평균 평점을 정확하게 계산하고 유지할 수 있는 방식이 필요했음.
다음 두 가지 접근 방안을 고려함:
리뷰 저장 시 평균 값 필드를 직접 업데이트하기
→ 기존 평균 값을 기준으로 새로운 평점을 반영하여 평균을 갱신
→ 성능은 좋지만 정밀도 저하 우려 존재
리뷰를 저장할 때마다 전체 리뷰를 조회해 평균 값을 다시 계산하기
→ 계산 비용이 다소 있지만 정확도를 보장할 수 있음
최종적으로 2번을 선택하여 구현함.
리뷰 저장 후 해당 기사님의 모든 리뷰를 조회하여 평균 평점을 새로 계산하는 방식으로 수정하였고, 이를 통해 정확한 평점 반영이 가능해졌음.
전
const driver = await driverRepository.findById(driverId); // 기사님 평균 평점, 리뷰 수 가져오기
const total = driver.averageRating * driver.reviewCount + rating; // 기존 총합 + 새 평점
const newAverageRating = total / (driver.reviewCount + 1); // 총 리뷰 수 + 1
await driverRepository.updateAverageRating(driverId, newAverageRating); // 평균 평점 업데이트
await driverRepository.incrementReviewCount(driverId); // 리뷰 수 +1
return review;
후
const allReviews = await reviewRepository.findAllByDriver(driverId);// 기사님의 전체 리뷰 조회
const total = allReviews.reduce((sum, r) => sum + r.rating, 0); // 기존 리뷰 평점 총합
const averageRating = total / (allReviews.length);// 리뷰 수로 나누어 평균 계산
console.log(total, averageRating);
await driverRepository.updateAverageRating(driverId, averageRating);// 평균 평점 업데이트
return review;
최종