From 120ef651b91d119b781949175fd3b268a1a2b88f Mon Sep 17 00:00:00 2001 From: Sihun23 Date: Tue, 4 Feb 2025 13:51:38 +0900 Subject: [PATCH] =?UTF-8?q?CLAP-259=20fix:=EA=B0=80=EC=9E=85=EC=9D=BC=20?= =?UTF-8?q?=EA=B8=B0=EC=A4=80=20=EB=8F=99=EC=A0=81=20=EC=A0=95=EB=A0=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/admin/FindMemberController.java | 7 +++++-- .../persistense/MemberPersistenceAdapter.java | 4 ++-- .../member/MemberCustomRepository.java | 2 +- .../member/MemberCustomRepositoryImpl.java | 19 ++++++++++++++----- .../admin/FindMembersWithFilterUsecase.java | 2 +- .../port/outbound/member/LoadMemberPort.java | 2 +- .../service/admin/FindAllMembersService.java | 4 ++-- .../admin/FindMembersWithFilterService.java | 8 ++++---- 8 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java index 77a0ff52..b85c69f4 100644 --- a/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java +++ b/src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java @@ -28,17 +28,20 @@ public class FindMemberController { description = "모든 회원 정보를 페이징 처리하여 반환하거나 조건에 맞는 회원 정보를 반환합니다.", parameters = { @Parameter(name = "page", description = "조회할 페이지 번호 (0부터 시작, 기본값: 0)", example = "0"), - @Parameter(name = "pageSize", description = "페이지 당 회원 수 (기본값: 20)", example = "20") + @Parameter(name = "pageSize", description = "페이지 당 회원 수 (기본값: 20)", example = "20"), + @Parameter(name = "sortDirection", description = "정렬 방향 (ASC 또는 DESC, 기본값: DESC)", example = "DESC") + } ) @GetMapping("/members") public ResponseEntity> getAllMembers( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "20") int pageSize, + @RequestParam(defaultValue = "DESC") String sortDirection, @ModelAttribute @Valid FindMemberRequest filterRequest) { Pageable pageable = PageRequest.of(page, pageSize); - PageResponse response = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest); + PageResponse response = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest, sortDirection); return ResponseEntity.ok(response); } } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java index 8d507516..b307b27e 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -101,8 +101,8 @@ public Page findAllMembers(Pageable pageable) { } @Override - public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { - return memberRepository.findMembersWithFilter(pageable, filterRequest).map(memberPersistenceMapper::toDomain); + public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) { + return memberRepository.findMembersWithFilter(pageable, filterRequest,sortDirection).map(memberPersistenceMapper::toDomain); } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java index 218020e6..da412b98 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java @@ -7,5 +7,5 @@ public interface MemberCustomRepository { Page findAllMembers(Pageable pageable); - Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) ; + Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) ; } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java index 1d5f6e6a..39863735 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java @@ -4,6 +4,7 @@ import clap.server.adapter.outbound.persistense.entity.member.MemberEntity; import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus; import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.OrderSpecifier; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -11,6 +12,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; import static clap.server.adapter.outbound.persistense.entity.member.QMemberEntity.memberEntity; @@ -20,10 +22,11 @@ public class MemberCustomRepositoryImpl implements MemberCustomRepository { private final JPAQueryFactory queryFactory; - private Page executeQueryWithPageable(Pageable pageable, BooleanBuilder whereClause) { + private Page executeQueryWithPageable(Pageable pageable, BooleanBuilder whereClause, OrderSpecifier orderSpecifier) { List result = queryFactory .selectFrom(memberEntity) .where(whereClause) + .orderBy(orderSpecifier) // 동적 sorting .offset(pageable.getOffset()) .limit(pageable.getPageSize()) .fetch(); @@ -32,7 +35,7 @@ private Page executeQueryWithPageable(Pageable pageable, BooleanBu .select(memberEntity.count()) .from(memberEntity) .where(whereClause) - .fetch().size(); + .fetchOne(); return new PageImpl<>( result, @@ -67,12 +70,18 @@ private BooleanBuilder createMemberFilter(FindMemberRequest filterRequest) { @Override public Page findAllMembers(Pageable pageable) { - return executeQueryWithPageable(pageable, new BooleanBuilder().and(memberEntity.status.ne(MemberStatus.DELETED))); + OrderSpecifier orderSpecifier = memberEntity.createdAt.desc(); // 기본 정렬: 최신순 + return executeQueryWithPageable(pageable, new BooleanBuilder().and(memberEntity.status.ne(MemberStatus.DELETED)), orderSpecifier); } @Override - public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { + public Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) { BooleanBuilder whereClause = createMemberFilter(filterRequest); - return executeQueryWithPageable(pageable, whereClause); + + OrderSpecifier orderSpecifier = sortDirection.equalsIgnoreCase("ASC") + ? memberEntity.createdAt.asc() // ASC 정렬 + : memberEntity.createdAt.desc(); // DESC 정렬 + + return executeQueryWithPageable(pageable, whereClause, orderSpecifier); } } diff --git a/src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java b/src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java index 8950e39f..90bb28b3 100644 --- a/src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java @@ -7,5 +7,5 @@ import org.springframework.data.domain.Pageable; public interface FindMembersWithFilterUsecase { - PageResponse findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest); + PageResponse findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java b/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java index 6faeaf4a..9aae3ca7 100644 --- a/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java +++ b/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java @@ -31,7 +31,7 @@ public interface LoadMemberPort { Page findAllMembers(Pageable pageable); - Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest); + Page findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection); } diff --git a/src/main/java/clap/server/application/service/admin/FindAllMembersService.java b/src/main/java/clap/server/application/service/admin/FindAllMembersService.java index e8119aa3..5bd6d901 100644 --- a/src/main/java/clap/server/application/service/admin/FindAllMembersService.java +++ b/src/main/java/clap/server/application/service/admin/FindAllMembersService.java @@ -5,14 +5,14 @@ import clap.server.application.mapper.RetrieveAllMemberMapper; import clap.server.application.port.inbound.admin.FindAllMembersUsecase; import clap.server.application.port.outbound.member.LoadMemberPort; +import clap.server.common.annotation.architecture.ApplicationService; import clap.server.domain.model.member.Member; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -@Service +@ApplicationService @RequiredArgsConstructor public class FindAllMembersService implements FindAllMembersUsecase { private final LoadMemberPort loadMemberPort; diff --git a/src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java b/src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java index 35da56de..2ab0ac5c 100644 --- a/src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java +++ b/src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java @@ -7,14 +7,14 @@ import clap.server.application.mapper.RetrieveAllMemberMapper; import clap.server.application.port.inbound.admin.FindMembersWithFilterUsecase; import clap.server.application.port.outbound.member.LoadMemberPort; +import clap.server.common.annotation.architecture.ApplicationService; import clap.server.domain.model.member.Member; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -@Service +@ApplicationService @RequiredArgsConstructor public class FindMembersWithFilterService implements FindMembersWithFilterUsecase { private final LoadMemberPort loadMemberPort; @@ -23,8 +23,8 @@ public class FindMembersWithFilterService implements FindMembersWithFilterUsecas @Transactional(readOnly = true) @Override - public PageResponse findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) { - Page members = loadMemberPort.findMembersWithFilter(pageable, filterRequest); + public PageResponse findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) { + Page members = loadMemberPort.findMembersWithFilter(pageable, filterRequest,sortDirection); return PageResponse.from(members.map(retrieveAllMemberMapper::toResponse)); } }