Skip to content

Commit 0780188

Browse files
authored
[Refactor] 메서드 매개변수 목록 간략화 (#253)
* refactor: 관리자 검색 조건 클래스로 묶기 * refactor: 피드백 검색 조건 클래스로 묶기 * refactor: 매개변수 간략화 * test: 리팩터링 이후 로직 검증 * refactor: FeedbackSearchCondition 클래스로 넘기기 * refactor: 메서드명 변경
1 parent ca7b6e8 commit 0780188

8 files changed

Lines changed: 164 additions & 86 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.programmers.signalbuddyfinal.domain.admin.dto;
2+
3+
import java.time.LocalDate;
4+
import lombok.AccessLevel;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
9+
@Getter
10+
@Builder
11+
@AllArgsConstructor(access = AccessLevel.PRIVATE)
12+
public class AdminSearchCondition {
13+
14+
private final LocalDate startDate;
15+
16+
private final LocalDate endDate;
17+
18+
private final Boolean deleted;
19+
}

src/main/java/org/programmers/signalbuddyfinal/domain/admin/service/AdminFeedbackService.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
import java.time.LocalDate;
44
import lombok.RequiredArgsConstructor;
5+
import org.programmers.signalbuddyfinal.domain.admin.dto.AdminSearchCondition;
56
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackResponse;
7+
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackSearchCondition;
68
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackSearchRequest;
79
import org.programmers.signalbuddyfinal.domain.feedback.repository.FeedbackRepository;
810
import org.programmers.signalbuddyfinal.domain.member.entity.enums.MemberRole;
@@ -31,10 +33,19 @@ public PageResponse<FeedbackResponse> searchFeedbackList(
3133
throw new BusinessException(GlobalErrorCode.ADMIN_ONLY);
3234
}
3335

36+
AdminSearchCondition adminSearchCondition = AdminSearchCondition.builder()
37+
.startDate(startDate).endDate(endDate).deleted(deleted)
38+
.build();
39+
40+
FeedbackSearchCondition condition = FeedbackSearchCondition.builder()
41+
.target(target).keyword(request.getKeyword())
42+
.answerStatus(request.getStatus()).categories(request.getCategory())
43+
.adminSearchCondition(adminSearchCondition)
44+
.build();
45+
3446
return new PageResponse<>(
3547
feedbackRepository.findAllByFilter(
36-
pageable, target, request.getKeyword(), request.getStatus(),
37-
request.getCategory(), startDate, endDate, deleted
48+
pageable, condition
3849
)
3950
);
4051
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package org.programmers.signalbuddyfinal.domain.feedback.dto;
2+
3+
import io.jsonwebtoken.lang.Collections;
4+
import java.util.Optional;
5+
import java.util.Set;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import org.programmers.signalbuddyfinal.domain.admin.dto.AdminSearchCondition;
9+
import org.programmers.signalbuddyfinal.domain.feedback.entity.enums.AnswerStatus;
10+
import org.programmers.signalbuddyfinal.domain.feedback.entity.enums.FeedbackCategory;
11+
import org.programmers.signalbuddyfinal.global.constant.SearchTarget;
12+
13+
@Getter
14+
public class FeedbackSearchCondition {
15+
16+
private final SearchTarget target;
17+
18+
private final String keyword;
19+
20+
private final AnswerStatus answerStatus;
21+
22+
private final Set<FeedbackCategory> categories;
23+
24+
private final Optional<AdminSearchCondition> adminSearchCondition;
25+
26+
@Builder
27+
private FeedbackSearchCondition(
28+
String keyword, SearchTarget target, AnswerStatus answerStatus,
29+
Set<FeedbackCategory> categories, AdminSearchCondition adminSearchCondition
30+
) {
31+
this.keyword = keyword;
32+
this.target = target;
33+
this.answerStatus = answerStatus;
34+
this.categories = Collections.asSet(categories);
35+
this.adminSearchCondition = Optional.ofNullable(adminSearchCondition);
36+
}
37+
}

src/main/java/org/programmers/signalbuddyfinal/domain/feedback/repository/CustomFeedbackRepository.java

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,23 @@
11
package org.programmers.signalbuddyfinal.domain.feedback.repository;
22

3-
import java.time.LocalDate;
4-
import java.util.Set;
53
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackResponse;
4+
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackSearchCondition;
65
import org.programmers.signalbuddyfinal.domain.feedback.entity.Feedback;
7-
import org.programmers.signalbuddyfinal.domain.feedback.entity.enums.AnswerStatus;
8-
import org.programmers.signalbuddyfinal.domain.feedback.entity.enums.FeedbackCategory;
9-
import org.programmers.signalbuddyfinal.global.constant.SearchTarget;
106
import org.springframework.data.domain.Page;
117
import org.springframework.data.domain.Pageable;
128

139
public interface CustomFeedbackRepository {
1410

1511
Page<FeedbackResponse> findAllByActiveMembers(
16-
Pageable pageable,
17-
SearchTarget target,
18-
AnswerStatus answerStatus, Set<FeedbackCategory> categories,
19-
Long crossroadId, String keyword
12+
Pageable pageable, Long crossroadId,
13+
FeedbackSearchCondition condition
2014
);
2115

2216
Page<FeedbackResponse> findPagedExcludingMember(Long memberId, Pageable pageable);
2317

2418
Page<FeedbackResponse> findAllByFilter(
25-
Pageable pageable, SearchTarget target,
26-
String keyword, AnswerStatus answerStatus,
27-
Set<FeedbackCategory> categories,
28-
LocalDate startDate, LocalDate endDate,
29-
Boolean deleted
19+
Pageable pageable,
20+
FeedbackSearchCondition condition
3021
);
3122

3223
Feedback findByIdOrThrow(Long id);

src/main/java/org/programmers/signalbuddyfinal/domain/feedback/repository/CustomFeedbackRepositoryImpl.java

Lines changed: 32 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
import com.querydsl.core.types.dsl.BooleanExpression;
1515
import com.querydsl.core.types.dsl.Expressions;
1616
import com.querydsl.jpa.impl.JPAQueryFactory;
17-
import java.time.LocalDate;
1817
import java.util.List;
1918
import java.util.Optional;
2019
import java.util.Set;
2120
import lombok.RequiredArgsConstructor;
2221
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackResponse;
22+
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackSearchCondition;
2323
import org.programmers.signalbuddyfinal.domain.feedback.entity.Feedback;
2424
import org.programmers.signalbuddyfinal.domain.feedback.entity.enums.AnswerStatus;
2525
import org.programmers.signalbuddyfinal.domain.feedback.entity.enums.FeedbackCategory;
@@ -58,26 +58,20 @@ public class CustomFeedbackRepositoryImpl implements CustomFeedbackRepository {
5858

5959
@Override
6060
public Page<FeedbackResponse> findAllByActiveMembers(
61-
Pageable pageable,
62-
SearchTarget target,
63-
AnswerStatus answerStatus, Set<FeedbackCategory> categories,
64-
Long crossroadId, String keyword
61+
Pageable pageable, Long crossroadId,
62+
FeedbackSearchCondition condition
6563
) {
66-
BooleanExpression searchCondition = searchCondition(target, keyword);
64+
BooleanExpression searchCondition = searchCondition(condition);
6765
BooleanExpression activityMember = member.memberStatus.eq(MemberStatus.ACTIVITY);
68-
BooleanExpression answerStatusCondition = answerStatusCondition(answerStatus);
69-
BooleanExpression categoriesCondition = categoriesCondition(categories);
7066
BooleanExpression crossroadIdCondition = crossroadIdCondition(crossroadId);
7167

7268
List<FeedbackResponse> results = jpaQueryFactory
7369
.select(feedbackResponseDto)
7470
.from(feedback)
7571
.join(member).on(feedback.member.eq(member)).fetchJoin()
7672
.where(
77-
searchCondition
78-
.and(answerStatusCondition)
79-
.and(categoriesCondition)
80-
.and(crossroadIdCondition)
73+
crossroadIdCondition
74+
.and(searchCondition)
8175
.and(activityMember)
8276
.and(isNotDeletedFeedback)
8377
)
@@ -91,10 +85,8 @@ public Page<FeedbackResponse> findAllByActiveMembers(
9185
.from(feedback)
9286
.join(member).on(feedback.member.eq(member)).fetchJoin()
9387
.where(
94-
searchCondition
95-
.and(answerStatusCondition)
96-
.and(categoriesCondition)
97-
.and(crossroadIdCondition)
88+
crossroadIdCondition
89+
.and(searchCondition)
9890
.and(activityMember)
9991
.and(isNotDeletedFeedback)
10092
).fetchOne()
@@ -120,29 +112,16 @@ public Page<FeedbackResponse> findPagedExcludingMember(Long memberId, Pageable p
120112

121113
@Override
122114
public Page<FeedbackResponse> findAllByFilter(
123-
Pageable pageable, SearchTarget target,
124-
String keyword, AnswerStatus answerStatus,
125-
Set<FeedbackCategory> categories,
126-
LocalDate startDate, LocalDate endDate,
127-
Boolean deleted
115+
Pageable pageable,
116+
FeedbackSearchCondition condition
128117
) {
129-
BooleanExpression searchCondition = searchCondition(target, keyword);
130-
BooleanExpression answerStatusCondition = answerStatusCondition(answerStatus);
131-
BooleanExpression categoriesCondition = categoriesCondition(categories);
132-
BooleanExpression betweenDates = betweenDates(feedback.createdAt, startDate, endDate);
133-
BooleanExpression deletedCondition = deletedCondition(deleted);
118+
BooleanExpression searchCondition = searchCondition(condition);
134119

135120
List<FeedbackResponse> results = jpaQueryFactory
136121
.select(feedbackResponseDto)
137122
.from(feedback)
138123
.join(member).on(feedback.member.eq(member)).fetchJoin()
139-
.where(
140-
searchCondition
141-
.and(answerStatusCondition)
142-
.and(deletedCondition)
143-
.and(categoriesCondition)
144-
.and(betweenDates)
145-
)
124+
.where(searchCondition)
146125
.offset(pageable.getOffset()).limit(pageable.getPageSize())
147126
.orderBy(getOrderSpecifiers(pageable, feedback.getType(), "feedback")).fetch();
148127

@@ -151,13 +130,8 @@ public Page<FeedbackResponse> findAllByFilter(
151130
.select(feedback.count())
152131
.from(feedback)
153132
.join(member).on(feedback.member.eq(member)).fetchJoin()
154-
.where(
155-
searchCondition
156-
.and(answerStatusCondition)
157-
.and(deletedCondition)
158-
.and(categoriesCondition)
159-
.and(betweenDates)
160-
).fetchOne()
133+
.where(searchCondition)
134+
.fetchOne()
161135
).orElse(0L);
162136

163137
return new PageImpl<>(results, pageable, count);
@@ -175,6 +149,23 @@ public Feedback findByIdOrThrow(Long id ) {
175149
).orElseThrow(() -> new BusinessException(FeedbackErrorCode.NOT_FOUND_FEEDBACK));
176150
}
177151

152+
private BooleanExpression searchCondition(FeedbackSearchCondition condition) {
153+
return Expressions.allOf(
154+
searchKeyword(condition.getTarget(), condition.getKeyword()),
155+
answerStatusCondition(condition.getAnswerStatus()),
156+
categoriesCondition(condition.getCategories()),
157+
condition.getAdminSearchCondition()
158+
.map(adminCondition -> Expressions.allOf(
159+
betweenDates(
160+
feedback.createdAt,
161+
adminCondition.getStartDate(), adminCondition.getEndDate()
162+
),
163+
deletedCondition(adminCondition.getDeleted())
164+
))
165+
.orElse(Expressions.TRUE)
166+
);
167+
}
168+
178169
private BooleanExpression answerStatusCondition(AnswerStatus answerStatus) {
179170
if (answerStatus == null) {
180171
return Expressions.TRUE;
@@ -205,7 +196,7 @@ private BooleanExpression categoriesCondition(Set<FeedbackCategory> categories)
205196
return expression;
206197
}
207198

208-
private BooleanExpression searchCondition(SearchTarget target, String keyword) {
199+
private BooleanExpression searchKeyword(SearchTarget target, String keyword) {
209200
BooleanExpression fulltextSearch = Expressions.TRUE;
210201
if (SearchTarget.WRITER.equals(target)) {
211202
fulltextSearch = fulltextSearch(keyword, member.nickname);

src/main/java/org/programmers/signalbuddyfinal/domain/feedback/service/FeedbackService.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.programmers.signalbuddyfinal.domain.crossroad.repository.CrossroadRepository;
77
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackRequest;
88
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackResponse;
9+
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackSearchCondition;
910
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackSearchRequest;
1011
import org.programmers.signalbuddyfinal.domain.feedback.entity.Feedback;
1112
import org.programmers.signalbuddyfinal.domain.feedback.exception.FeedbackErrorCode;
@@ -50,10 +51,14 @@ public PageResponse<FeedbackResponse> searchFeedbackList(
5051
FeedbackSearchRequest request,
5152
Long crossroadId
5253
) {
54+
FeedbackSearchCondition condition = FeedbackSearchCondition.builder()
55+
.target(target).keyword(request.getKeyword())
56+
.answerStatus(request.getStatus()).categories(request.getCategory())
57+
.build();
58+
5359
return new PageResponse<>(
5460
feedbackRepository.findAllByActiveMembers(
55-
pageable, target, request.getStatus(), request.getCategory(),
56-
crossroadId, request.getKeyword()
61+
pageable, crossroadId, condition
5762
)
5863
);
5964
}

src/test/java/org/programmers/signalbuddyfinal/domain/admin/service/AdminFeedbackServiceTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.programmers.signalbuddyfinal.domain.admin.service;
22

33
import static org.assertj.core.api.Assertions.assertThat;
4+
import static org.mockito.ArgumentMatchers.any;
45
import static org.mockito.Mockito.when;
56

67
import java.time.LocalDate;
@@ -12,6 +13,7 @@
1213
import org.junit.jupiter.api.DisplayName;
1314
import org.junit.jupiter.api.Test;
1415
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackResponse;
16+
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackSearchCondition;
1517
import org.programmers.signalbuddyfinal.domain.feedback.dto.FeedbackSearchRequest;
1618
import org.programmers.signalbuddyfinal.domain.feedback.entity.enums.AnswerStatus;
1719
import org.programmers.signalbuddyfinal.domain.feedback.entity.enums.FeedbackCategory;
@@ -73,10 +75,7 @@ void searchFeedbackList_Success() {
7375

7476
when(
7577
feedbackRepository.findAllByFilter(
76-
pageable, target,
77-
request.getKeyword(), request.getStatus(), request.getCategory(),
78-
startDate, endDate,
79-
deleted
78+
any(Pageable.class), any(FeedbackSearchCondition.class)
8079
)
8180
).thenReturn(new PageImpl<>(contents, pageable, 123));
8281

@@ -108,7 +107,8 @@ void searchFeedbackList_Failure() {
108107
// When & Then
109108
try {
110109
adminFeedbackService.searchFeedbackList(
111-
null, SearchTarget.SUBJECT_OR_CONTENT, null, null, null, null, user
110+
null, SearchTarget.SUBJECT_OR_CONTENT,
111+
null, null, null, null, user
112112
);
113113
} catch (BusinessException e) {
114114
assertThat(e.getErrorCode()).isEqualTo(GlobalErrorCode.ADMIN_ONLY);

0 commit comments

Comments
 (0)