From 3a49cd3c4992b1aabdfe71100b54c16e172f1830 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EB=8F=99=ED=9B=88?= <2dh2@naver.com> Date: Sat, 24 Jan 2026 13:49:11 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=8F=99=EC=95=84=EB=A6=AC=20=EB=AA=A9?= =?UTF-8?q?=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20=EB=AA=A8=EC=A7=91?= =?UTF-8?q?=20=EC=A4=91=EC=9D=B8=20=EA=B3=B3=EC=9D=84=20=EB=A8=BC=EC=A0=80?= =?UTF-8?q?=20=EB=B3=B4=EC=97=AC=EC=A3=BC=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/club/controller/ClubApi.java | 3 +- .../club/repository/ClubQueryRepository.java | 40 ++++++++++++++++--- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java index b7fc87a2..cd1e21db 100644 --- a/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java +++ b/src/main/java/gg/agit/konect/domain/club/controller/ClubApi.java @@ -48,7 +48,8 @@ public interface ClubApi { @Operation(summary = "페이지 네이션으로 동아리 리스트를 조회한다.", description = """ - - isRecruiting가 true일 경우, 모집일이 빠른 순으로 정렬됩니다. + - isRecruiting가 true일 경우, 모집 중인 동아리만 조회하며 모집일(마감일)이 빠른 순으로 정렬됩니다. + - isRecruiting가 false일 경우, 전체 동아리를 조회하되 모집 중인 동아리를 먼저 보여줍니다. - status은 BEFORE(모집 전), ONGOING(모집 중), CLOSED(모집 마감)으로 반환됩니다. """) @GetMapping diff --git a/src/main/java/gg/agit/konect/domain/club/repository/ClubQueryRepository.java b/src/main/java/gg/agit/konect/domain/club/repository/ClubQueryRepository.java index af99e035..fc8a7f2f 100644 --- a/src/main/java/gg/agit/konect/domain/club/repository/ClubQueryRepository.java +++ b/src/main/java/gg/agit/konect/domain/club/repository/ClubQueryRepository.java @@ -19,6 +19,8 @@ import com.querydsl.core.BooleanBuilder; import com.querydsl.core.Tuple; import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.CaseBuilder; import com.querydsl.jpa.impl.JPAQuery; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -138,10 +140,16 @@ private void addRecruitingCondition(BooleanBuilder condition, Boolean isRecruiti return; } + condition.and(createOngoingRecruitmentCondition()); + } + + private BooleanExpression createOngoingRecruitmentCondition() { LocalDate today = LocalDate.now(); - condition.and(clubRecruitment.id.isNotNull()) - .and(clubRecruitment.startDate.loe(today)) - .and(clubRecruitment.endDate.goe(today)); + return clubRecruitment.id.isNotNull() + .and( + clubRecruitment.isAlwaysRecruiting.isTrue() + .or(clubRecruitment.startDate.loe(today).and(clubRecruitment.endDate.goe(today))) + ); } /* 정렬 조건 */ @@ -155,11 +163,33 @@ private List> createClubSortOrders(Boolean isRecruiting) { } private void addRecruitmentSortOrder(List> orders, Boolean isRecruiting) { + BooleanExpression isOngoingRecruitment = createOngoingRecruitmentCondition(); + if (!isRecruiting) { - return; + orders.add( + new CaseBuilder() + .when(isOngoingRecruitment) + .then(0) + .otherwise(1) + .asc() + ); } - orders.add(clubRecruitment.endDate.asc()); + orders.add( + new CaseBuilder() + .when(isOngoingRecruitment.and(clubRecruitment.endDate.isNull())) + .then(1) + .otherwise(0) + .asc() + ); + + orders.add( + new CaseBuilder() + .when(isOngoingRecruitment) + .then(clubRecruitment.endDate) + .otherwise((LocalDate)null) + .asc() + ); } private void addDefaultSortOrder(List> orders) {