Skip to content

Commit c88bec3

Browse files
authored
Merge pull request #287 from TaskFlow-CLAP/CLAP-259
CLAP-259 회원 조회 API 가입일 기준 동적 정렬 추가
2 parents 55a00ad + 120ef65 commit c88bec3

File tree

8 files changed

+30
-18
lines changed

8 files changed

+30
-18
lines changed

src/main/java/clap/server/adapter/inbound/web/admin/FindMemberController.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,20 @@ public class FindMemberController {
2828
description = "모든 회원 정보를 페이징 처리하여 반환하거나 조건에 맞는 회원 정보를 반환합니다.",
2929
parameters = {
3030
@Parameter(name = "page", description = "조회할 페이지 번호 (0부터 시작, 기본값: 0)", example = "0"),
31-
@Parameter(name = "pageSize", description = "페이지 당 회원 수 (기본값: 20)", example = "20")
31+
@Parameter(name = "pageSize", description = "페이지 당 회원 수 (기본값: 20)", example = "20"),
32+
@Parameter(name = "sortDirection", description = "정렬 방향 (ASC 또는 DESC, 기본값: DESC)", example = "DESC")
33+
3234
}
3335
)
3436
@GetMapping("/members")
3537
public ResponseEntity<PageResponse<RetrieveAllMemberResponse>> getAllMembers(
3638
@RequestParam(defaultValue = "0") int page,
3739
@RequestParam(defaultValue = "20") int pageSize,
40+
@RequestParam(defaultValue = "DESC") String sortDirection,
3841
@ModelAttribute @Valid FindMemberRequest filterRequest) {
3942

4043
Pageable pageable = PageRequest.of(page, pageSize);
41-
PageResponse<RetrieveAllMemberResponse> response = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest);
44+
PageResponse<RetrieveAllMemberResponse> response = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest, sortDirection);
4245
return ResponseEntity.ok(response);
4346
}
4447
}

src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,8 @@ public Page<Member> findAllMembers(Pageable pageable) {
101101
}
102102

103103
@Override
104-
public Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) {
105-
return memberRepository.findMembersWithFilter(pageable, filterRequest).map(memberPersistenceMapper::toDomain);
104+
public Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) {
105+
return memberRepository.findMembersWithFilter(pageable, filterRequest,sortDirection).map(memberPersistenceMapper::toDomain);
106106
}
107107
}
108108

src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77

88
public interface MemberCustomRepository {
99
Page<MemberEntity> findAllMembers(Pageable pageable);
10-
Page<MemberEntity> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) ;
10+
Page<MemberEntity> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) ;
1111
}

src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberCustomRepositoryImpl.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import clap.server.adapter.outbound.persistense.entity.member.MemberEntity;
55
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus;
66
import com.querydsl.core.BooleanBuilder;
7+
import com.querydsl.core.types.OrderSpecifier;
78
import com.querydsl.jpa.impl.JPAQueryFactory;
89
import lombok.RequiredArgsConstructor;
910
import org.springframework.data.domain.Page;
1011
import org.springframework.data.domain.PageImpl;
1112
import org.springframework.data.domain.Pageable;
1213
import org.springframework.stereotype.Repository;
1314

15+
import java.time.LocalDateTime;
1416
import java.util.List;
1517

1618
import static clap.server.adapter.outbound.persistense.entity.member.QMemberEntity.memberEntity;
@@ -20,10 +22,11 @@
2022
public class MemberCustomRepositoryImpl implements MemberCustomRepository {
2123
private final JPAQueryFactory queryFactory;
2224

23-
private Page<MemberEntity> executeQueryWithPageable(Pageable pageable, BooleanBuilder whereClause) {
25+
private Page<MemberEntity> executeQueryWithPageable(Pageable pageable, BooleanBuilder whereClause, OrderSpecifier<?> orderSpecifier) {
2426
List<MemberEntity> result = queryFactory
2527
.selectFrom(memberEntity)
2628
.where(whereClause)
29+
.orderBy(orderSpecifier) // 동적 sorting
2730
.offset(pageable.getOffset())
2831
.limit(pageable.getPageSize())
2932
.fetch();
@@ -32,7 +35,7 @@ private Page<MemberEntity> executeQueryWithPageable(Pageable pageable, BooleanBu
3235
.select(memberEntity.count())
3336
.from(memberEntity)
3437
.where(whereClause)
35-
.fetch().size();
38+
.fetchOne();
3639

3740
return new PageImpl<>(
3841
result,
@@ -67,12 +70,18 @@ private BooleanBuilder createMemberFilter(FindMemberRequest filterRequest) {
6770

6871
@Override
6972
public Page<MemberEntity> findAllMembers(Pageable pageable) {
70-
return executeQueryWithPageable(pageable, new BooleanBuilder().and(memberEntity.status.ne(MemberStatus.DELETED)));
73+
OrderSpecifier<LocalDateTime> orderSpecifier = memberEntity.createdAt.desc(); // 기본 정렬: 최신순
74+
return executeQueryWithPageable(pageable, new BooleanBuilder().and(memberEntity.status.ne(MemberStatus.DELETED)), orderSpecifier);
7175
}
7276

7377
@Override
74-
public Page<MemberEntity> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) {
78+
public Page<MemberEntity> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) {
7579
BooleanBuilder whereClause = createMemberFilter(filterRequest);
76-
return executeQueryWithPageable(pageable, whereClause);
80+
81+
OrderSpecifier<LocalDateTime> orderSpecifier = sortDirection.equalsIgnoreCase("ASC")
82+
? memberEntity.createdAt.asc() // ASC 정렬
83+
: memberEntity.createdAt.desc(); // DESC 정렬
84+
85+
return executeQueryWithPageable(pageable, whereClause, orderSpecifier);
7786
}
7887
}

src/main/java/clap/server/application/port/inbound/admin/FindMembersWithFilterUsecase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,5 @@
77
import org.springframework.data.domain.Pageable;
88

99
public interface FindMembersWithFilterUsecase {
10-
PageResponse<RetrieveAllMemberResponse> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest);
10+
PageResponse<RetrieveAllMemberResponse> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection);
1111
}

src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public interface LoadMemberPort {
3131

3232
Page<Member> findAllMembers(Pageable pageable);
3333

34-
Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest);
34+
Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection);
3535

3636

3737
}

src/main/java/clap/server/application/service/admin/FindAllMembersService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@
55
import clap.server.application.mapper.RetrieveAllMemberMapper;
66
import clap.server.application.port.inbound.admin.FindAllMembersUsecase;
77
import clap.server.application.port.outbound.member.LoadMemberPort;
8+
import clap.server.common.annotation.architecture.ApplicationService;
89
import clap.server.domain.model.member.Member;
910
import lombok.RequiredArgsConstructor;
1011
import org.springframework.data.domain.Page;
1112
import org.springframework.data.domain.Pageable;
12-
import org.springframework.stereotype.Service;
1313
import org.springframework.transaction.annotation.Transactional;
1414

15-
@Service
15+
@ApplicationService
1616
@RequiredArgsConstructor
1717
public class FindAllMembersService implements FindAllMembersUsecase {
1818
private final LoadMemberPort loadMemberPort;

src/main/java/clap/server/application/service/admin/FindMembersWithFilterService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
import clap.server.application.mapper.RetrieveAllMemberMapper;
88
import clap.server.application.port.inbound.admin.FindMembersWithFilterUsecase;
99
import clap.server.application.port.outbound.member.LoadMemberPort;
10+
import clap.server.common.annotation.architecture.ApplicationService;
1011
import clap.server.domain.model.member.Member;
1112
import lombok.RequiredArgsConstructor;
1213
import org.springframework.data.domain.Page;
1314
import org.springframework.data.domain.Pageable;
14-
import org.springframework.stereotype.Service;
1515
import org.springframework.transaction.annotation.Transactional;
1616

17-
@Service
17+
@ApplicationService
1818
@RequiredArgsConstructor
1919
public class FindMembersWithFilterService implements FindMembersWithFilterUsecase {
2020
private final LoadMemberPort loadMemberPort;
@@ -23,8 +23,8 @@ public class FindMembersWithFilterService implements FindMembersWithFilterUsecas
2323

2424
@Transactional(readOnly = true)
2525
@Override
26-
public PageResponse<RetrieveAllMemberResponse> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) {
27-
Page<Member> members = loadMemberPort.findMembersWithFilter(pageable, filterRequest);
26+
public PageResponse<RetrieveAllMemberResponse> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) {
27+
Page<Member> members = loadMemberPort.findMembersWithFilter(pageable, filterRequest,sortDirection);
2828
return PageResponse.from(members.map(retrieveAllMemberMapper::toResponse));
2929
}
3030
}

0 commit comments

Comments
 (0)