Skip to content

Commit 33b1a3e

Browse files
authored
GETP-325 feat: 프로젝트 지원 테이블 인덱스 설계를 통해 프로젝트 목록 조회 API 성능 약 2.35배 개선 (#182)
1 parent ed2a825 commit 33b1a3e

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

get-p-persistence/src/main/java/es/princip/getp/persistence/adapter/project/apply/CountProjectApplicationAdapter.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package es.princip.getp.persistence.adapter.project.apply;
22

3+
import com.querydsl.core.types.dsl.BooleanExpression;
34
import es.princip.getp.application.project.apply.port.out.CountProjectApplicationPort;
5+
import es.princip.getp.domain.project.apply.model.ProjectApplicationStatus;
46
import es.princip.getp.domain.project.commission.model.ProjectId;
57
import es.princip.getp.persistence.adapter.project.apply.model.QProjectApplicationJpaEntity;
68
import es.princip.getp.persistence.adapter.project.apply.model.QTeammateJpaEntity;
@@ -23,15 +25,29 @@ class CountProjectApplicationAdapter extends QueryDslSupport implements CountPro
2325
= QProjectApplicationJpaEntity.projectApplicationJpaEntity;
2426
private static final QTeammateJpaEntity teammate = QTeammateJpaEntity.teammateJpaEntity;
2527

28+
private static final ProjectApplicationStatus[] statusesWithoutPendingTeamApproval
29+
= Arrays.stream(ProjectApplicationStatus.values())
30+
.filter(status -> !status.equals(PENDING_TEAM_APPROVAL))
31+
.toArray(ProjectApplicationStatus[]::new);
32+
33+
private static BooleanExpression applicationStatusNePendingTeamApproval() {
34+
return application.status.in(statusesWithoutPendingTeamApproval);
35+
}
36+
37+
private static BooleanExpression teammateApplicationStatusNePendingTeamApproval() {
38+
return teammate.application.status.in(statusesWithoutPendingTeamApproval);
39+
}
40+
2641
@Override
2742
public Map<ProjectId, Long> countBy(final ProjectId... projectId) {
2843
final Long[] ids = Arrays.stream(projectId)
2944
.map(ProjectId::getValue)
3045
.toArray(Long[]::new);
46+
3147
final Map<ProjectId, Long> counts = queryFactory.select(application.projectId, application.count())
3248
.from(application)
3349
.where(application.projectId.in(ids)
34-
.and(application.status.ne(PENDING_TEAM_APPROVAL)))
50+
.and(applicationStatusNePendingTeamApproval()))
3551
.groupBy(application.projectId)
3652
.fetch()
3753
.stream()
@@ -40,10 +56,11 @@ public Map<ProjectId, Long> countBy(final ProjectId... projectId) {
4056
tuple -> Optional.ofNullable(tuple.get(application.count()))
4157
.orElse(0L)
4258
));
59+
4360
queryFactory.select(teammate.application.projectId, teammate.count())
4461
.from(teammate)
4562
.where(teammate.application.projectId.in(ids)
46-
.and(teammate.application.status.ne(PENDING_TEAM_APPROVAL)))
63+
.and(teammateApplicationStatusNePendingTeamApproval()))
4764
.groupBy(teammate.application.projectId)
4865
.fetch()
4966
.forEach(tuple -> {
@@ -52,6 +69,7 @@ public Map<ProjectId, Long> countBy(final ProjectId... projectId) {
5269
.orElse(0L);
5370
counts.put(key, counts.getOrDefault(key, 0L) + value);
5471
});
72+
5573
return counts;
5674
}
5775

@@ -60,13 +78,15 @@ public Long countBy(final ProjectId projectId) {
6078
Long count = queryFactory.select(application.count())
6179
.from(application)
6280
.where(application.projectId.eq(projectId.getValue())
63-
.and(application.status.ne(PENDING_TEAM_APPROVAL)))
81+
.and(applicationStatusNePendingTeamApproval()))
6482
.fetchOne();
83+
6584
count += queryFactory.select(teammate.count())
6685
.from(teammate)
6786
.where(teammate.application.projectId.eq(projectId.getValue())
68-
.and(teammate.application.status.ne(PENDING_TEAM_APPROVAL)))
87+
.and(teammateApplicationStatusNePendingTeamApproval()))
6988
.fetchOne();
89+
7090
return count;
7191
}
7292
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
create index ix_project_application_project_id_status
2+
on project_application(project_id, status);
3+
4+
create index ix_team_project_application_teammate_project_application_id
5+
on team_project_application_teammate(project_application_id);

0 commit comments

Comments
 (0)