From 3127b19bc4fea52578638f5a86e2fa7194358e85 Mon Sep 17 00:00:00 2001 From: pricelees Date: Fri, 18 Jul 2025 16:59:32 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=A4=91=EB=B3=B5=EB=90=9C=20?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=EC=9D=84=20=ED=99=95=EC=9D=B8=ED=95=A0=20?= =?UTF-8?q?=EB=95=8C=20findByStartAt=20=EB=8C=80=EC=8B=A0=20existsByStartA?= =?UTF-8?q?t=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=ED=85=8C=EC=8A=A4=ED=8A=B8=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 --- .../business/ReservationTimeService.kt | 27 +++++++-------- .../persistence/ReservationTimeRepository.kt | 2 +- .../business/ReservationTimeServiceTest.kt | 2 +- .../ReservationTimeRepositoryTest.kt | 33 +++++++++++++++++++ 4 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepositoryTest.kt diff --git a/src/main/java/roomescape/reservation/business/ReservationTimeService.kt b/src/main/java/roomescape/reservation/business/ReservationTimeService.kt index 9b2ff06b..2cfd3acb 100644 --- a/src/main/java/roomescape/reservation/business/ReservationTimeService.kt +++ b/src/main/java/roomescape/reservation/business/ReservationTimeService.kt @@ -12,6 +12,7 @@ import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository import roomescape.reservation.web.* import java.time.LocalDate +import java.time.LocalTime @Service class ReservationTimeService( @@ -28,30 +29,24 @@ class ReservationTimeService( @Transactional(readOnly = true) - fun findAllTimes(): ReservationTimesResponse = reservationTimeRepository.findAll() - .toResponses() - + fun findAllTimes(): ReservationTimesResponse = reservationTimeRepository.findAll() + .toResponses() @Transactional fun addTime(reservationTimeRequest: ReservationTimeRequest): ReservationTimeResponse { - validateIsDuplicatedTimeExists(reservationTimeRequest) + val startAt: LocalTime = reservationTimeRequest.startAt - return ReservationTimeEntity(startAt = reservationTimeRequest.startAt) + if (reservationTimeRepository.existsByStartAt(startAt)) { + throw RoomescapeException( + ErrorType.TIME_DUPLICATED, "[startAt: $startAt]", HttpStatus.CONFLICT + ) + } + + return ReservationTimeEntity(startAt = startAt) .also { reservationTimeRepository.save(it) } .toResponse() } - private fun validateIsDuplicatedTimeExists(reservationTimeRequest: ReservationTimeRequest) { - reservationTimeRepository.findByStartAt(reservationTimeRequest.startAt) - .also { - if (it.isNotEmpty()) { - throw RoomescapeException( - ErrorType.TIME_DUPLICATED, "[startAt: $it]", HttpStatus.CONFLICT - ) - } - } - } - @Transactional fun removeTimeById(id: Long) { val reservationTime: ReservationTimeEntity = findTimeById(id) diff --git a/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepository.kt b/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepository.kt index 26b533b8..d4a03bcd 100644 --- a/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepository.kt +++ b/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepository.kt @@ -4,5 +4,5 @@ import org.springframework.data.jpa.repository.JpaRepository import java.time.LocalTime interface ReservationTimeRepository : JpaRepository { - fun findByStartAt(startAt: LocalTime): List + fun existsByStartAt(startAt: LocalTime): Boolean } diff --git a/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.kt b/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.kt index cb4a9342..a1bedcfe 100644 --- a/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.kt +++ b/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.kt @@ -45,7 +45,7 @@ class ReservationTimeServiceTest : FunSpec({ val request = ReservationTimeRequest(startAt = LocalTime.of(10, 0)) // Mocking the behavior of reservationTimeRepository.findByStartAt - every { reservationTimeRepository.findByStartAt(request.startAt) } returns listOf(mockk()) + every { reservationTimeRepository.existsByStartAt(request.startAt) } returns true shouldThrow { reservationTimeService.addTime(request) diff --git a/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepositoryTest.kt b/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepositoryTest.kt new file mode 100644 index 00000000..ba7045a3 --- /dev/null +++ b/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepositoryTest.kt @@ -0,0 +1,33 @@ +package roomescape.reservation.infrastructure.persistence + +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe +import jakarta.persistence.EntityManager +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import roomescape.util.ReservationTimeFixture +import java.time.LocalTime + +@DataJpaTest +class ReservationTimeRepositoryTest( + val entityManager: EntityManager, + val reservationTimeRepository: ReservationTimeRepository, +) : FunSpec({ + + context("existsByStartAt") { + val startAt = LocalTime.of(10, 0) + + beforeTest { + entityManager.persist(ReservationTimeFixture.create(startAt = startAt)) + entityManager.flush() + entityManager.clear() + } + + test("동일한 시간이 있으면 true 반환") { + reservationTimeRepository.existsByStartAt(startAt) shouldBe true + } + + test("동일한 시간이 없으면 false 반환") { + reservationTimeRepository.existsByStartAt(startAt.plusSeconds(1)) shouldBe false + } + } +})