Skip to content

Commit 4dd9a45

Browse files
Kimminu7NCookies
authored andcommitted
feat : 문제 조회 성능 최적화 (개선) (#119)
* feat : 카테고리 필터링 추가 ( code 또는 korName 필드 조회 ) * feat : join 을 통해 n:m 관계 최적화 * feat : EAGER 즉시 로딩 사용 ( 상세조회, 이미지 ) * feat : 카테고리 필터링 추가 ( code 또는 korName 필드 조회 ) * feat : join 을 통해 n:m 관계 최적화 * feat : EAGER 즉시 로딩 사용 ( 상세조회, 이미지 )
1 parent a77f542 commit 4dd9a45

File tree

2 files changed

+23
-9
lines changed

2 files changed

+23
-9
lines changed

src/main/java/org/ezcode/codetest/domain/problem/model/entity/Problem.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public class Problem extends BaseEntity {
7474
@OneToMany(mappedBy = "problem", cascade = CascadeType.ALL, orphanRemoval = true)
7575
private List<Testcase> testcases = new ArrayList<>();
7676

77-
@ElementCollection(fetch = FetchType.LAZY)
77+
@ElementCollection(fetch = FetchType.EAGER)
7878
private List<String> imageUrl = new ArrayList<>();
7979

8080
@Builder

src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/problem/ProblemQueryRepositoryImpl.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44

55
import org.ezcode.codetest.domain.problem.model.ProblemSearchCondition;
66
import org.ezcode.codetest.domain.problem.model.entity.Problem;
7+
import org.ezcode.codetest.domain.problem.model.entity.QCategory;
78
import org.ezcode.codetest.domain.problem.model.entity.QProblem;
9+
import org.ezcode.codetest.domain.problem.model.entity.QProblemCategory;
810
import org.ezcode.codetest.domain.problem.model.enums.Difficulty;
911
import org.springframework.data.domain.Page;
1012
import org.springframework.data.domain.PageImpl;
1113
import org.springframework.data.domain.Pageable;
1214
import org.springframework.stereotype.Repository;
1315

1416
import com.querydsl.core.BooleanBuilder;
17+
import com.querydsl.jpa.impl.JPAQuery;
1518
import com.querydsl.jpa.impl.JPAQueryFactory;
1619

1720
import lombok.RequiredArgsConstructor;
@@ -26,32 +29,43 @@ public class ProblemQueryRepositoryImpl implements ProblemRepositoryCustom {
2629
public Page<Problem> searchByCondition(Pageable pageable, ProblemSearchCondition searchCondition) {
2730

2831
QProblem problem = QProblem.problem;
32+
QProblemCategory problemCategory = QProblemCategory.problemCategory;
33+
QCategory category = QCategory.category;
2934

3035
// where 조건을 깔끔 하게 조립
3136
BooleanBuilder builder = new BooleanBuilder();
3237

3338
builder.and(problem.isDeleted.isFalse());
3439

35-
/*
36-
if(searchCondition.category() != null) {
37-
builder.and(problem.categories.contains(searchCondition.category()));
40+
JPAQuery<Problem> query = jpaQueryFactory
41+
.selectDistinct(problem)
42+
.from(problem)
43+
.leftJoin(problemCategory).on(problem.eq(problemCategory.problem))
44+
.leftJoin(problemCategory.category, category)
45+
.where(builder);
46+
47+
// 카테고리 필터링
48+
if (searchCondition.category() != null) {
49+
builder.and(category.code.eq(searchCondition.category())
50+
.or(category.korName.eq(searchCondition.category())));
3851
}
39-
*/
52+
53+
// 난이도 필터링
4054
if (searchCondition.difficulty() != null) {
4155
builder.and(problem.difficulty.eq(Difficulty.valueOf(searchCondition.difficulty())));
4256
}
4357

44-
List<Problem> content = jpaQueryFactory
45-
.selectFrom(problem)
46-
.where(builder)
58+
List<Problem> content = query
4759
.offset(pageable.getOffset())
4860
.limit(pageable.getPageSize())
4961
.orderBy(problem.createdAt.desc())
5062
.fetch();
5163

5264
Long total = jpaQueryFactory
53-
.select(problem.count())
65+
.select(problem.countDistinct())
5466
.from(problem)
67+
.leftJoin(problemCategory).on(problem.eq(problemCategory.problem))
68+
.leftJoin(problemCategory.category, category)
5569
.where(builder)
5670
.fetchOne();
5771

0 commit comments

Comments
 (0)