From 7bda14984eafe84142ed02acd64f4f531eb55f8e Mon Sep 17 00:00:00 2001 From: pricelees Date: Tue, 7 Oct 2025 18:05:18 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=9D=B8=EA=B8=B0=20=ED=85=8C?= =?UTF-8?q?=EB=A7=88=20=EC=A1=B0=ED=9A=8C=20=EC=8B=9C=20ORDER=20BY=20?= =?UTF-8?q?=EC=9C=84=EC=B9=98=20=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EB=8F=99?= =?UTF-8?q?=EC=9D=BC=20=EC=98=88=EC=95=BD=EC=88=98=EC=9D=B8=20=EA=B2=BD?= =?UTF-8?q?=EC=9A=B0=20ID=20=EC=98=A4=EB=A6=84=EC=B0=A8=EC=88=9C=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistence/ThemeRepository.kt | 3 +- .../sangdol/roomescape/theme/ThemeApiTest.kt | 32 ++++++++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt b/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt index cef38dff..2260e2fe 100644 --- a/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt +++ b/service/src/main/kotlin/com/sangdol/roomescape/theme/infrastructure/persistence/ThemeRepository.kt @@ -32,10 +32,9 @@ interface ThemeRepository : JpaRepository { AND (s.date BETWEEN :startFrom AND :endAt) GROUP BY s.theme_id - ORDER BY - reservation_count desc LIMIT :count ) ranked_themes ON t.id = ranked_themes.theme_id + ORDER BY ranked_themes.reservation_count DESC, t.id ASC """, nativeQuery = true ) diff --git a/service/src/test/kotlin/com/sangdol/roomescape/theme/ThemeApiTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/theme/ThemeApiTest.kt index 30e51c65..3051cd56 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/theme/ThemeApiTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/theme/ThemeApiTest.kt @@ -4,14 +4,15 @@ import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.utils.KoreaDate import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.theme.business.DateUtils +import com.sangdol.roomescape.theme.dto.ThemeInfoResponse import com.sangdol.roomescape.theme.exception.ThemeErrorCode import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeEntity import com.sangdol.roomescape.theme.infrastructure.persistence.ThemeRepository -import com.sangdol.roomescape.theme.dto.ThemeInfoResponse import com.sangdol.roomescape.theme.mapper.toEntity import com.sangdol.roomescape.user.infrastructure.persistence.UserEntity import io.kotest.matchers.collections.shouldContainInOrder import io.kotest.matchers.collections.shouldHaveSize +import io.kotest.matchers.comparables.shouldBeLessThan import org.hamcrest.CoreMatchers.equalTo import org.springframework.http.HttpMethod import java.time.LocalDate @@ -72,6 +73,35 @@ class ThemeApiTest( response.map { it.id }.shouldContainInOrder(expectedResult) } } + + test("예약 수가 동일한 경우 ID 오름차순으로 정렬한다.") { + val expectedSize = initialize("두 개의 테마에 각각 1개의 확정 예약 생성") { + val user = testAuthUtil.defaultUserLogin() + (1..2).map { _ -> + dummyInitializer.createConfirmReservation( + user.first, + scheduleRequest = ScheduleFixture.createRequest.copy( + date = DateUtils.getSundayOfPreviousWeek(KoreaDate.today()) + ) + ) + } + }.size + + runTest( + on = { + get("/themes/most-reserved?count=10") + }, + expect = { + statusCode(HttpStatus.OK.value()) + } + ).also { res -> + val response: List = + ResponseParser.parseListResponse(res.extract().path("data.themes")) + + response shouldHaveSize expectedSize + response[0].id shouldBeLessThan response[1].id + } + } } }