코드 개선의 이유
1. 예약 시스템의 로직의 영향으로 리턴해줘야할 컬럼이 늘었기때문에 같은 리스트에 담아서 보내기 위해서는 코드 수정이 필요했다.
2. entity방식으로 리턴하는 것보다는 dto 방식으로 리턴하는 것이 안전했다.
3. OrderBy절의 코드는 지극히 절차지향적이기에 비효율적이었다.
4. BooleanBuilder를 고려해보았다.
Entity → Dto 변환


select절에 코드를 추가했다.
entity → dto 방식으로 반환타입을 바꾸면서 리스트에 Store entity의 컬럼 이외의 컬럼값도 넣을 수 있게 되었다.
OrderBy절의 코드 수정
기존의 OrderBy절의 코드는 지극히 절차지향적이기에 굉장히 원시적이고 비효율적이라고 볼 수있다.

기존의 코드

개선한 코드
위와 같이 수정을 하면서 좀 더 클린코드에 가까워졌다.
entity의 필드값을 동적으로 주려고 했으나 그 부분에서는 해답을 찾지 못해 위 사진과 같이 리펙토링하였다.
OrderBy절에서는 BooleanExpression을 사용할 수 없고 OrderSpecifier을 사용해야 한다.
BooleanBuilder Vs BooleanExpression
BooleanExpression

private BooleanExpression eqStoreName(String storeName) {
if (StringUtils.isEmpty(storeName)) {
return null;
}
return store.typeOfBusiness.contains(storeName);
}
private BooleanExpression eqRoadNameAddress(String roadNameAddress) {
if (StringUtils.isEmpty(roadNameAddress)) {
return null;
}
return store.typeOfBusiness.contains(roadNameAddress);
}
private BooleanExpression eqTypeOfBusiness(String typeofBusiness) {
if (StringUtils.isEmpty(typeofBusiness)) {
return null;
}
return store.typeOfBusiness.eq(typeofBusiness);
}
private BooleanExpression eqBetweenStarScore(double starScore, String select) {
if (starScore == 0) {
return null;
} else if (select.equals("StarScoreASC")) {
returnstore.starScore.between(0, starScore);
}
returnstore.starScore.between(starScore, 5);
}
private BooleanExpression eqBetweenReview(int reviewCnt, String select) {
if (reviewCnt == 0) {
return null;
} else if (select.equals("ReviewASC")) {
returnstore.reviewCnt.between(0, reviewCnt);
}
returnstore.reviewCnt.between(reviewCnt, 100000);
}
각 메소드별로 각각의 기능을 세분화 되어있기때문에 각각의 메소드가 역할이 확실해진다.
BooleanBuilder

private BooleanBuilder searchCondition(String roadNameAddress, String storeName, String typeofBusiness, double starScore, int reviewCnt, String select) {
BooleanBuilder booleanBuilder = new BooleanBuilder();
if (org.springframework.util.StringUtils.hasText(storeName)) {
booleanBuilder.or(store.typeOfBusiness.contains(storeName));
}
if (org.springframework.util.StringUtils.hasText(roadNameAddress)) {
booleanBuilder.or(store.typeOfBusiness.contains(roadNameAddress));
}
if (org.springframework.util.StringUtils.hasText(typeofBusiness)) {
booleanBuilder.or(store.typeOfBusiness.eq(typeofBusiness));
}
if (select.equals("StarScoreLow")) {
booleanBuilder.or(store.starScore.between(0, starScore));
}else if (select.equals("StarScoreHigh")) {
booleanBuilder.or(store.starScore.between(starScore, 5));
}
if (select.equals("ReviewLow")) {
booleanBuilder.or(store.reviewCnt.between(0, reviewCnt));
}else if (select.equals("ReviewHigh")) {
booleanBuilder.or(store.reviewCnt.between(reviewCnt, 100000));
}
return booleanBuilder;
}
BooleanBuilder를 사용하면 BooleanExpression보다 더 짧게 코드를 구현할수있지만
어떠한 구문이 어떠한 역할을 하는지에 대해서는 한눈에 들어오지 않는다 라는 단점이 있다.
즉 BooleanExpression의 방식은
각각의 메소드의 역할이 확실한 만큼 여러사람이 협업할때의 입장에서는 누가봐도 이해하고 개선할 수 있는 쉬운코드가 되는 것이고
BooleanBuilder를 의 방식은
좀 더 코드가 짧아졌다는 장점이 있다.
'legacy > Pin-Table 성능 개선 기록' 카테고리의 다른 글
검색 성능 개선 #7 B-TREE index란 (0) | 2023.02.09 |
---|---|
검색 성능 개선 #6 방향성에 대한 고민2 (0) | 2023.02.09 |
검색 성능 개선 #4 동적쿼리(DynamicSQL) 구현 (0) | 2023.02.09 |
검색 성능 개선 #3 QueryDsl 구현 (0) | 2023.02.09 |
검색 성능 개선 #2 JPA findBy 메소드 (0) | 2023.02.09 |