Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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<PageResponse<RetrieveAllMemberResponse>> 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<RetrieveAllMemberResponse> response = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest);
PageResponse<RetrieveAllMemberResponse> response = findMembersWithFilterUsecase.findMembersWithFilter(pageable, filterRequest, sortDirection);
return ResponseEntity.ok(response);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -101,8 +101,8 @@ public Page<Member> findAllMembers(Pageable pageable) {
}

@Override
public Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) {
return memberRepository.findMembersWithFilter(pageable, filterRequest).map(memberPersistenceMapper::toDomain);
public Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) {
return memberRepository.findMembersWithFilter(pageable, filterRequest,sortDirection).map(memberPersistenceMapper::toDomain);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@

public interface MemberCustomRepository {
Page<MemberEntity> findAllMembers(Pageable pageable);
Page<MemberEntity> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) ;
Page<MemberEntity> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) ;
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
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;
import org.springframework.data.domain.PageImpl;
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;
Expand All @@ -20,10 +22,11 @@
public class MemberCustomRepositoryImpl implements MemberCustomRepository {
private final JPAQueryFactory queryFactory;

private Page<MemberEntity> executeQueryWithPageable(Pageable pageable, BooleanBuilder whereClause) {
private Page<MemberEntity> executeQueryWithPageable(Pageable pageable, BooleanBuilder whereClause, OrderSpecifier<?> orderSpecifier) {
List<MemberEntity> result = queryFactory
.selectFrom(memberEntity)
.where(whereClause)
.orderBy(orderSpecifier) // 동적 sorting
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
Expand All @@ -32,7 +35,7 @@ private Page<MemberEntity> executeQueryWithPageable(Pageable pageable, BooleanBu
.select(memberEntity.count())
.from(memberEntity)
.where(whereClause)
.fetch().size();
.fetchOne();

return new PageImpl<>(
result,
Expand Down Expand Up @@ -67,12 +70,18 @@ private BooleanBuilder createMemberFilter(FindMemberRequest filterRequest) {

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

@Override
public Page<MemberEntity> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) {
public Page<MemberEntity> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) {
BooleanBuilder whereClause = createMemberFilter(filterRequest);
return executeQueryWithPageable(pageable, whereClause);

OrderSpecifier<LocalDateTime> orderSpecifier = sortDirection.equalsIgnoreCase("ASC")
? memberEntity.createdAt.asc() // ASC 정렬
: memberEntity.createdAt.desc(); // DESC 정렬

return executeQueryWithPageable(pageable, whereClause, orderSpecifier);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
import org.springframework.data.domain.Pageable;

public interface FindMembersWithFilterUsecase {
PageResponse<RetrieveAllMemberResponse> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest);
PageResponse<RetrieveAllMemberResponse> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection);
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public interface LoadMemberPort {

Page<Member> findAllMembers(Pageable pageable);

Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest);
Page<Member> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection);


}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -23,8 +23,8 @@ public class FindMembersWithFilterService implements FindMembersWithFilterUsecas

@Transactional(readOnly = true)
@Override
public PageResponse<RetrieveAllMemberResponse> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest) {
Page<Member> members = loadMemberPort.findMembersWithFilter(pageable, filterRequest);
public PageResponse<RetrieveAllMemberResponse> findMembersWithFilter(Pageable pageable, FindMemberRequest filterRequest, String sortDirection) {
Page<Member> members = loadMemberPort.findMembersWithFilter(pageable, filterRequest,sortDirection);
return PageResponse.from(members.map(retrieveAllMemberMapper::toResponse));
}
}