Skip to content

Commit

Permalink
refactor : kuddy top5를 추출하는 함수 가독성 개선
Browse files Browse the repository at this point in the history
함수가 길어 가독성이 없는 것을 개선
Related to: #134
  • Loading branch information
june0216 committed Oct 7, 2023
1 parent 9702305 commit b3caefe
Showing 1 changed file with 39 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.kuddy.common.review.exception.ReviewNotFoundException;
import com.kuddy.common.review.repository.ReviewRepository;
import com.querydsl.core.Tuple;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.dsl.BooleanExpression;
import com.querydsl.core.types.dsl.CaseBuilder;
import com.querydsl.core.types.dsl.Expressions;
Expand Down Expand Up @@ -41,47 +42,61 @@ public class Top5KuddyService {
private final JPAQueryFactory queryFactory;
private final CacheManager contentCacheManager;
public List<Profile> findTopKuddies() {
// 점수 계산
NumberExpression<Integer> reviewScore = new CaseBuilder()
.when(review.grade.eq(Grade.PERFECT)).then(10)
.when(review.grade.eq(Grade.GOOD)).then(5)
.when(review.grade.eq(Grade.DISAPPOINT)).then(-5)
.otherwise(0);

// 최우선은 KuddyLevel이 'SOULMATE'와 'COMPANION'인 멤버
BooleanExpression isHighLevelKuddy = member.profile.kuddyLevel.eq(KuddyLevel.SOULMATE)
.or(member.profile.kuddyLevel.eq(KuddyLevel.COMPANION));

// RoleType이 "KUDDY"인 멤버만
BooleanExpression isKuddyRole = member.roleType.eq(RoleType.KUDDY);

// 오늘 기준 7일 전 날짜
LocalDate sevenDaysAgo = LocalDate.now().minusDays(7);

BooleanExpression isWithinLastSevenDays = review.createdDate.after(sevenDaysAgo.atStartOfDay());
NumberExpression<Integer> reviewScore = calculateReviewScore();
BooleanExpression highLevelAndRoleCriteria = highLevelKuddyCriteria().and(isKuddyRole());
BooleanExpression lastSevenDaysCriteria = withinLastSevenDays();

JPAQuery<Tuple> query = queryFactory
.select(review.meetup.kuddy, reviewScore.sum().as("totalScore"))
.from(review)
.leftJoin(review.meetup.kuddy, member)
.leftJoin(member.profile, profile)
.where(isHighLevelKuddy.and(isKuddyRole).and(isWithinLastSevenDays)) // 조건: 높은 레벨의 Kuddy만 + RoleType이 "KUDDY"인 경우 + 최근 7일 이내의 리뷰
.where(highLevelAndRoleCriteria.and(lastSevenDaysCriteria))
.groupBy(member.id)
.orderBy(
// 점수 높은 순, 그리고 최신 리뷰 날짜 순
Expressions.numberTemplate(Integer.class, "{0}", reviewScore.sum()).desc(),
review.createdDate.desc()
)
.orderBy(orderByScoreAndDate(reviewScore))
.limit(5);

List<Tuple> results = query.fetch();

return extractProfilesFromResults(results);
}

private NumberExpression<Integer> calculateReviewScore() {
return new CaseBuilder()
.when(review.grade.eq(Grade.PERFECT)).then(10)
.when(review.grade.eq(Grade.GOOD)).then(5)
.when(review.grade.eq(Grade.DISAPPOINT)).then(-5)
.otherwise(0);
}

private BooleanExpression highLevelKuddyCriteria() {
return member.profile.kuddyLevel.in(KuddyLevel.SOULMATE, KuddyLevel.COMPANION);
}

private BooleanExpression isKuddyRole() {
return member.roleType.eq(RoleType.KUDDY);
}

private BooleanExpression withinLastSevenDays() {
LocalDate sevenDaysAgo = LocalDate.now().minusDays(7);
return review.createdDate.after(sevenDaysAgo.atStartOfDay());
}

private OrderSpecifier<?>[] orderByScoreAndDate(NumberExpression<Integer> reviewScore) {
return new OrderSpecifier[]{
Expressions.numberTemplate(Integer.class, "{0}", reviewScore.sum()).desc(),
review.createdDate.desc()
};
}

private List<Profile> extractProfilesFromResults(List<Tuple> results) {
return results.stream()
.map(tuple -> tuple.get(review.meetup.kuddy).getProfile())
.collect(Collectors.toList());
}



@Cacheable(value="topKuddies",cacheManager = "contentCacheManager")
public Top5KuddyListResDto getTop5Kuddy(){
List<Profile> profiles = findTopKuddies(); // 캐시에 데이터가 없으면 실행
Expand Down

0 comments on commit b3caefe

Please sign in to comment.