Skip to content

Commit d53827f

Browse files
authored
Refactor/367 대시보드 코드 리팩토링 (#370)
* refactor/336 입금 환전 내역 수정 * refactor/336 입금 환전 내역 수정 * refactor/336 작가 수익 테스트 수정 * refactor/336 대시보드 메인현황 팔로우수 추가 * refactor/336 대시보드 메인현황 팔로우수 테스트 케이스 작성 * refactor/336 대시보드 팔로우 작가 조회 * refactor/336 대시보드 팔로우 작가 조회 * refactor/336 Response 수정 * refactor/354리뷰 mock 제거 실제 db연동 * refactor/354 레파지토리에 찜 기능 조회 추가 * refactor/354 찜 테스트 기능 추가 및 테스트 오류 수정 * refactor/354 찜 기능 수정 및 팔로우 기능 수정 * refactor/354 찜 기능 수정 및 팔로우 기능 수정 * refactor/354 찜 기능 수정 및 팔로우 기능 수정 * refactor/367 이미지 사용 우선 순위 변경 * refactor/367 상품명 정렬 수정 * refactor/367 교환 요청 조회 정렬 메모리->db 정렬로 변경 * refactor/367 메인현황-상품명 정렬 추가,
1 parent 697b0bc commit d53827f

File tree

5 files changed

+305
-69
lines changed

5 files changed

+305
-69
lines changed

src/main/java/com/back/domain/dashboard/artist/dto/request/ArtistSettlementSearchRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public record ArtistSettlementSearchRequest(
3636
Integer size,
3737

3838
/** 정렬 기준 */
39-
@Pattern(regexp = "^(date|grossAmount|commission|netAmount|status)$",
40-
message = "sort는 date, grossAmount, commission, netAmount, status 중 하나여야 합니다")
39+
@Pattern(regexp = "^(date|productName|grossAmount|commission|netAmount|status)$",
40+
message = "sort는 date, productName, grossAmount, commission, netAmount, status 중 하나여야 합니다")
4141
String sort,
4242

4343
/** 정렬 방향 */

src/main/java/com/back/domain/dashboard/artist/service/ArtistDashboardServiceImpl.java

Lines changed: 110 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -719,19 +719,39 @@ public ArtistOrderResponse.List getOrders(Long artistId, ArtistOrderSearchReques
719719
}
720720
}
721721

722-
// 동적 정렬 처리
723-
org.springframework.data.domain.Sort sort = createOrderSort(request.sort(), request.order());
724-
PageRequest pageRequest = PageRequest.of(request.page(), request.size(), sort);
722+
// 상품명 정렬 여부 확인
723+
boolean isProductNameSort = "productName".equals(request.sort());
724+
725+
Page<com.back.domain.order.order.entity.Order> orderPage;
726+
727+
if (isProductNameSort) {
728+
// 상품명 정렬: 별도 메서드 사용
729+
String direction = request.order() != null ? request.order() : "DESC";
730+
PageRequest pageRequest = PageRequest.of(request.page(), request.size());
731+
732+
orderPage = orderRepository.findOrdersByArtistSortedByProductName(
733+
artistId,
734+
orderStatus,
735+
request.keyword(),
736+
startDateTime,
737+
endDateTime,
738+
direction,
739+
pageRequest
740+
);
741+
} else {
742+
// 일반 정렬: 동적 정렬 처리
743+
org.springframework.data.domain.Sort sort = createOrderSort(request.sort(), request.order());
744+
PageRequest pageRequest = PageRequest.of(request.page(), request.size(), sort);
725745

726-
// Repository를 통한 실제 DB 조회
727-
Page<com.back.domain.order.order.entity.Order> orderPage = orderRepository.findOrdersByArtist(
728-
artistId,
729-
orderStatus,
730-
request.keyword(),
731-
startDateTime,
732-
endDateTime,
733-
pageRequest
734-
);
746+
orderPage = orderRepository.findOrdersByArtist(
747+
artistId,
748+
orderStatus,
749+
request.keyword(),
750+
startDateTime,
751+
endDateTime,
752+
pageRequest
753+
);
754+
}
735755

736756
// ID 리스트 추출
737757
List<Long> orderIds = orderPage.getContent().stream()
@@ -790,8 +810,7 @@ private org.springframework.data.domain.Sort createOrderSort(String sortField, S
790810
case "status" -> org.springframework.data.domain.Sort.by(direction, "status");
791811
case "totalAmount" -> org.springframework.data.domain.Sort.by(direction, "totalAmount");
792812
case "customerName" -> org.springframework.data.domain.Sort.by(direction, "user.name");
793-
case "productName" ->
794-
org.springframework.data.domain.Sort.by(direction, "orderDate"); // 상품명 정렬은 복잡하므로 일단 주문일자로 대체
813+
case "productName" -> null; // 상품명 정렬은 Repository에서 처리
795814
default -> org.springframework.data.domain.Sort.by(direction, "orderDate");
796815
};
797816
}
@@ -1112,8 +1131,8 @@ private String convertRefundStatusToKorean(com.back.domain.order.refund.entity.R
11121131

11131132
@Override
11141133
public ArtistExchangeResponse.List getExchangeRequests(Long artistId, ArtistExchangeSearchRequest request) {
1115-
log.info("작가 교환 요청 목록 조회 시작 - artistId: {}, page: {}, size: {}, status: {}, keyword: {}",
1116-
artistId, request.page(), request.size(), request.status(), request.keyword());
1134+
log.info("작가 교환 요청 목록 조회 시작 - artistId: {}, page: {}, size: {}, status: {}, keyword: {}, sort: {}, order: {}",
1135+
artistId, request.page(), request.size(), request.status(), request.keyword(), request.sort(), request.order());
11171136

11181137
// status 문자열을 ExchangeStatus enum으로 변환
11191138
com.back.domain.order.exchange.entity.Exchange.ExchangeStatus exchangeStatus = null;
@@ -1130,24 +1149,50 @@ public ArtistExchangeResponse.List getExchangeRequests(Long artistId, ArtistExch
11301149
}
11311150
}
11321151

1133-
// Repository를 통한 실제 DB 조회 (최신순 정렬)
1134-
Page<com.back.domain.order.exchange.entity.Exchange> exchangePage = exchangeRepository.findExchangesByArtist(
1135-
artistId,
1136-
exchangeStatus,
1137-
request.keyword(),
1138-
PageRequest.of(request.page(), request.size())
1139-
);
1152+
// 정렬 방향
1153+
String sortOrder = request.order() != null ? request.order() : "DESC";
1154+
1155+
// 정렬 필드에 따라 적절한 Repository 메서드 호출
1156+
Page<com.back.domain.order.exchange.entity.Exchange> exchangePage;
1157+
PageRequest pageRequest = PageRequest.of(request.page(), request.size());
1158+
1159+
String sortField = request.sort() != null ? request.sort() : "requestDate";
1160+
1161+
switch (sortField) {
1162+
case "productName" -> {
1163+
// 상품명 정렬 (DB 쿼리)
1164+
if ("ASC".equalsIgnoreCase(sortOrder)) {
1165+
exchangePage = exchangeRepository.findExchangesByArtistSortedByProductNameAsc(
1166+
artistId, exchangeStatus, request.keyword(), pageRequest);
1167+
} else {
1168+
exchangePage = exchangeRepository.findExchangesByArtistSortedByProductNameDesc(
1169+
artistId, exchangeStatus, request.keyword(), pageRequest);
1170+
}
1171+
}
1172+
case "customerName" -> {
1173+
// 구매자 이름 정렬 (DB 쿼리)
1174+
if ("ASC".equalsIgnoreCase(sortOrder)) {
1175+
exchangePage = exchangeRepository.findExchangesByArtistSortedByCustomerNameAsc(
1176+
artistId, exchangeStatus, request.keyword(), pageRequest);
1177+
} else {
1178+
exchangePage = exchangeRepository.findExchangesByArtistSortedByCustomerNameDesc(
1179+
artistId, exchangeStatus, request.keyword(), pageRequest);
1180+
}
1181+
}
1182+
default -> {
1183+
// 주문일자, 상태 정렬 (Pageable Sort 사용)
1184+
org.springframework.data.domain.Sort sort = createExchangeSort(sortField, sortOrder);
1185+
pageRequest = PageRequest.of(request.page(), request.size(), sort);
1186+
exchangePage = exchangeRepository.findExchangesByArtist(
1187+
artistId, exchangeStatus, request.keyword(), pageRequest);
1188+
}
1189+
}
11401190

11411191
// Entity → DTO 변환
11421192
List<ArtistExchangeResponse.ExchangeRequest> content = exchangePage.getContent().stream()
11431193
.map(this::convertToExchangeDto)
11441194
.toList();
11451195

1146-
// 메모리에서 정렬 (간단한 정렬만 지원)
1147-
if (request.sort() != null && !request.sort().equals("requestDate")) {
1148-
content = sortExchangesInMemory(content, request.sort(), request.order());
1149-
}
1150-
11511196
int totalPages = exchangePage.getTotalPages();
11521197
long totalElements = exchangePage.getTotalElements();
11531198
boolean hasNext = exchangePage.hasNext();
@@ -1168,36 +1213,18 @@ public ArtistExchangeResponse.List getExchangeRequests(Long artistId, ArtistExch
11681213
}
11691214

11701215
/**
1171-
* 메모리에서 교환 요청 정렬 처리
1216+
* 교환 요청 정렬 생성 (requestDate, status 정렬용)
11721217
*/
1173-
private List<ArtistExchangeResponse.ExchangeRequest> sortExchangesInMemory(
1174-
List<ArtistExchangeResponse.ExchangeRequest> list, String sort, String order) {
1175-
1176-
boolean asc = "ASC".equalsIgnoreCase(order);
1218+
private org.springframework.data.domain.Sort createExchangeSort(String sortField, String sortOrder) {
1219+
org.springframework.data.domain.Sort.Direction direction =
1220+
"ASC".equalsIgnoreCase(sortOrder)
1221+
? org.springframework.data.domain.Sort.Direction.ASC
1222+
: org.springframework.data.domain.Sort.Direction.DESC;
11771223

1178-
return list.stream()
1179-
.sorted((a, b) -> {
1180-
int cmp = 0;
1181-
switch (sort) {
1182-
case "productName":
1183-
String nameA = a.orderItem() != null ? a.orderItem().productName() : "";
1184-
String nameB = b.orderItem() != null ? b.orderItem().productName() : "";
1185-
cmp = nameA.compareTo(nameB);
1186-
break;
1187-
case "customerName":
1188-
String customerA = a.customer() != null ? a.customer().nickname() : "";
1189-
String customerB = b.customer() != null ? b.customer().nickname() : "";
1190-
cmp = customerA.compareTo(customerB);
1191-
break;
1192-
case "status":
1193-
cmp = a.status().compareTo(b.status());
1194-
break;
1195-
default:
1196-
cmp = a.requestDate().compareTo(b.requestDate());
1197-
}
1198-
return asc ? cmp : -cmp;
1199-
})
1200-
.toList();
1224+
return switch (sortField) {
1225+
case "status" -> org.springframework.data.domain.Sort.by(direction, "status");
1226+
default -> org.springframework.data.domain.Sort.by(direction, "createDate"); // requestDate
1227+
};
12011228
}
12021229

12031230
/**
@@ -1640,11 +1667,25 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
16401667
ArtistSettlementSearchRequest request,
16411668
Long artistId) {
16421669

1643-
// 1. 배송 완료된 주문 조회 (정렬 없이 전체 조회)
1644-
List<com.back.domain.order.order.entity.Order> allOrders =
1645-
orderRepository.findDeliveredOrdersByArtistInPeriod(artist, startDate, endDate);
1670+
// 1. 정렬 필드 확인
1671+
String sortField = request.sort() != null ? request.sort() : "date";
1672+
String sortOrder = request.order() != null ? request.order() : "DESC";
1673+
boolean isProductNameSort = "productName".equals(sortField);
1674+
1675+
// 2. 배송 완료된 주문 조회
1676+
List<com.back.domain.order.order.entity.Order> allOrders;
1677+
1678+
if (isProductNameSort) {
1679+
// 상품명 정렬: DB에서 정렬된 상태로 조회
1680+
allOrders = orderRepository.findDeliveredOrdersByArtistInPeriodSortedByProductName(
1681+
artist, startDate, endDate, sortOrder);
1682+
} else {
1683+
// 일반 조회 (정렬은 메모리에서 처리)
1684+
allOrders = orderRepository.findDeliveredOrdersByArtistInPeriod(
1685+
artist, startDate, endDate);
1686+
}
16461687

1647-
// 2. 주문을 OrderItem 단위로 변환 (작가의 상품만)
1688+
// 3. 주문을 OrderItem 단위로 변환 (작가의 상품만)
16481689
List<SettlementOrderItem> settlementItems = allOrders.stream()
16491690
.flatMap(order -> order.getOrderItems().stream()
16501691
.filter(item -> item.getProduct().getUser().getId().equals(artistId))
@@ -1657,17 +1698,19 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
16571698
)))
16581699
.toList();
16591700

1660-
// 3. 정렬 적용
1661-
settlementItems = sortSettlementItems(settlementItems, request.sort(), request.order());
1701+
// 4. 정렬 적용 (상품명 정렬이 아닌 경우만 메모리 정렬)
1702+
if (!isProductNameSort) {
1703+
settlementItems = sortSettlementItems(settlementItems, sortField, sortOrder);
1704+
}
16621705

1663-
// 4. 페이징 처리
1706+
// 5. 페이징 처리
16641707
int start = request.page() * request.size();
16651708
int end = Math.min(start + request.size(), settlementItems.size());
16661709
List<SettlementOrderItem> pagedItems = start < settlementItems.size()
16671710
? settlementItems.subList(start, end)
16681711
: List.of();
16691712

1670-
// 5. DTO 변환
1713+
// 6. DTO 변환
16711714
List<ArtistSettlementResponse.Settlement> content = pagedItems.stream()
16721715
.map(this::convertToSettlementDtoFromOrder)
16731716
.toList();
@@ -1689,7 +1732,8 @@ private ArtistSettlementResponse.Table createSettlementTableFromOrders(
16891732
}
16901733

16911734
/**
1692-
* 정산 아이템 정렬
1735+
* 정산 아이템 정렬 (메모리 정렬)
1736+
* productName 정렬은 DB에서 처리하므로 여기서는 제외
16931737
*/
16941738
private List<SettlementOrderItem> sortSettlementItems(
16951739
List<SettlementOrderItem> items, String sortField, String sortOrder) {
@@ -1699,6 +1743,7 @@ private List<SettlementOrderItem> sortSettlementItems(
16991743
return items.stream()
17001744
.sorted((a, b) -> {
17011745
int cmp = switch (sortField) {
1746+
case "productName" -> a.productName.compareTo(b.productName);
17021747
case "grossAmount" -> Integer.compare(a.grossAmount, b.grossAmount);
17031748
case "commission" -> Integer.compare(a.grossAmount / 10, b.grossAmount / 10);
17041749
case "netAmount" -> Integer.compare(a.grossAmount * 9 / 10, b.grossAmount * 9 / 10);

src/main/java/com/back/domain/dashboard/customer/service/DashboardServiceImpl.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -494,14 +494,22 @@ public FollowingResponse.List getFollowingArtists(Long userId, FollowingSearchRe
494494

495495
/**
496496
* Follow 엔티티를 Artist DTO로 변환
497+
* 프로필 이미지 우선순위: User.profileImageUrl > ArtistProfile.profileImageUrl
497498
*/
498499
private FollowingResponse.Artist convertToFollowingArtist(com.back.domain.follow.entity.Follow follow) {
499500
com.back.domain.artist.entity.ArtistProfile artistProfile = follow.getFollowingArtist();
501+
User artistUser = artistProfile.getUser();
502+
503+
// 프로필 이미지 URL 우선순위: User > ArtistProfile
504+
String profileImageUrl = artistUser.getProfileImageUrl();
505+
if (profileImageUrl == null || profileImageUrl.isBlank()) {
506+
profileImageUrl = artistProfile.getProfileImageUrl();
507+
}
500508

501509
return new FollowingResponse.Artist(
502510
artistProfile.getId().toString(),
503511
artistProfile.getArtistName(),
504-
artistProfile.getProfileImageUrl(),
512+
profileImageUrl, // null인 경우 프론트에서 기본 이미지 표시
505513
"/artists/" + artistProfile.getId()
506514
);
507515
}

0 commit comments

Comments
 (0)