Skip to content

Commit

Permalink
[REFACT] Achievement 도메인 관련 쿼리에 대해 인덱스 적용 및 쿼리 최적화 수행
Browse files Browse the repository at this point in the history
  • Loading branch information
JIN-076 committed Apr 28, 2024
1 parent 644ac59 commit baeba2a
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -203,8 +203,7 @@ public void executeEvent(final SequenceAchievementUpdateEvent event) {
// -- 'SEQUENCE' 타입 업적에 한해, 달성 조건을 위해 사용된 히스토리 soft delete 처리
Achievement achievement = getById(event.getAchievementId());
List<UserActivity> history = userActivityRepository.getActivityHistoryByActivityType(
event.getUserId(), achievement.getActivityType(),
achievement.getRequirementValue());
event.getUserId(), achievement.getActivityType(), achievement.getRequirementValue());
history.forEach(UserActivity::delete);

log.info("call socket for event {} completion", event.getAchievementId());
Expand Down Expand Up @@ -264,7 +263,7 @@ public Achievement getById(Long achievementId) {
}

public Integer getProgressLevelSize(ActivityType activityType) {
return achievementRepository.findByActivityType(activityType).size();
return achievementRepository.findMaxProgressLevelByActivityType(activityType);
}

public UserAchievement getByUserAndAchievementId(final AchievementEvent event) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,8 @@ public interface AchievementJpaRepository extends JpaRepository<Achievement, Lon
@Query("select ac from Achievement ac where ac.id = :id")
Optional<Achievement> findById(Long id);

@Query("select ac from Achievement ac where ac.activityType = :activityType")
List<Achievement> findByActivityType(ActivityType activityType);

@Query("select max(ac.progressLevel) from Achievement ac where ac.activityType = :activityType group by ac.activityType")
Integer findMaxProgressLevelByActivityType(ActivityType activityType);

@Query("""
select ac.activityType from Achievement ac join UserAchievement ua
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ public class UserAchievementRepositoryCustomImpl implements UserAchievementRepos
@Override
public List<UserAchievementDetailInfoRes> getAchievementInfoAboutUser(Long userId) {

List<Tuple> sql1 = jpaQueryFactory.select(
List<Tuple> sql1 = jpaQueryFactory
.select(
achievement.id,
Expressions.numberPath(Long.class, String.valueOf(userId)),
achievement.title,
Expand All @@ -56,7 +57,8 @@ public List<UserAchievementDetailInfoRes> getAchievementInfoAboutUser(Long userI
)
.fetch();

List<Tuple> sql2 = jpaQueryFactory.select(
List<Tuple> sql2 = jpaQueryFactory
.select(
userAchievement.achievement.id,
userAchievement.user.id,
userAchievement.achievement.title,
Expand Down Expand Up @@ -138,17 +140,17 @@ public Long getAvailableAchievementWithoutNull(Long userId, ActivityType activit

private Tuple findAvailableAchievementByActivityType(Long userId, ActivityType activityType) {

return jpaQueryFactory.select(
userAchievement.achievement.id.max(),
return jpaQueryFactory
.select(
userAchievement.achievement.id,
userAchievement.completed,
findAvailableNextStep(userAchievement.achievement.id.max(), activityType)
findAvailableNextStep(userAchievement.achievement.id, activityType)
)
.from(userAchievement)
.innerJoin(userActivity).on(userAchievement.user.id.eq(userActivity.user.id))
.innerJoin(userAchievement.achievement).on(userActivity.activityType.eq(userAchievement.achievement.activityType))
.where(
userAchievement.user.id.eq(userId),
userAchievement.achievement.activityType.eq(activityType)
userActivity.activityType.eq(activityType)
)
.groupBy(userActivity.activityType)
.fetchOne();
Expand All @@ -157,18 +159,14 @@ private Tuple findAvailableAchievementByActivityType(Long userId, ActivityType a
// 오늘 날짜를 제외한, Accumulate 타입 업적의 진행 횟수 조회
@Override
public Integer getAccumulatedProgressCountByActivity(Long userId, ActivityType activityType) {
Long result = jpaQueryFactory.select(userActivity.createdAt.count())
.from(achievement)
.innerJoin(userActivity).on(achievement.activityType.eq(userActivity.activityType), userActivity.user.id.eq(userId))
Long result = jpaQueryFactory
.select(userActivity.createdAt.countDistinct())
.from(userActivity)
.innerJoin(achievement).on(userActivity.activityType.eq(achievement.activityType),
userActivity.user.id.eq(userId))
.where(
achievement.id.in(
JPAExpressions.select(achievement1.id.min())
.from(achievement1)
.where(
achievement1.requirementType.eq(RequirementType.ACCUMULATE),
achievement1.activityType.eq(activityType)
)
)
achievement.requirementType.eq(RequirementType.ACCUMULATE),
userActivity.activityType.eq(activityType)
)
.fetchOne();

Expand All @@ -177,7 +175,8 @@ public Integer getAccumulatedProgressCountByActivity(Long userId, ActivityType a

@Override
public Long findMinAchievementIdByActivityType(ActivityType activityType) {
return jpaQueryFactory.select(achievement.id.min())
return jpaQueryFactory
.select(achievement.id.min())
.from(achievement)
.where(achievement.activityType.eq(activityType))
.fetchOne();
Expand All @@ -186,7 +185,8 @@ public Long findMinAchievementIdByActivityType(ActivityType activityType) {
private BooleanExpression findAvailableNextStep(NumberExpression<Long> achievementId,
ActivityType activityType) {

return jpaQueryFactory.selectOne()
return jpaQueryFactory
.selectOne()
.from(achievement)
.where(
achievement.activityType.eq(activityType),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@ public interface UserActivityJpaRepository extends JpaRepository<UserActivity, L
UserActivityRepositoryCustom {

@Query("""
select uact from UserActivity uact where uact.user.id = :userId
and uact.activityType = :activityType and uact.deletedAt is null order by uact.createdAt desc
select uat from UserActivity uat where uat.user.id = :userId
and uat.activityType = :activityType and uat.deletedAt is null
""")
List<UserActivity> findByUserIdAndActivityType(Long userId, ActivityType activityType);

@Query("""
select uact from UserActivity uact where uact.user.id = :userId and uact.activityType = :activityType
and FUNCTION('DATE_FORMAT', uact.createdAt, '%Y-%m-%d') = CURRENT_DATE
select uat from UserActivity uat where uat.user.id = :userId and uat.activityType = :activityType
and FUNCTION('DATE_FORMAT', uat.createdAt, '%Y-%m-%d') = CURRENT_DATE
""")
Optional<UserActivity> findByActivityTypeAndCreatedAt(Long userId, ActivityType activityType);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,13 @@ public class UserActivityRepositoryCustomImpl implements UserActivityRepositoryC

@Override
public List<UserActivity> getActivityHistoryByActivityType(Long userId, ActivityType activityType, Integer limit) {
return jpaQueryFactory.selectFrom(userActivity)
return jpaQueryFactory
.selectFrom(userActivity)
.where(
userActivity.user.id.eq(userId),
userActivity.activityType.eq(activityType),
userActivity.deletedAt.isNull()
)
.orderBy(userActivity.createdAt.desc())
.limit(limit)
.fetch();
}
Expand Down

0 comments on commit baeba2a

Please sign in to comment.