From 0ff7702c833f8edfd0ddebcaff0f5843415deaed Mon Sep 17 00:00:00 2001 From: pricelees Date: Sun, 7 Sep 2025 21:39:28 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20schedule=EC=9D=98=20=EC=9A=94=EC=95=BD?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EC=A0=9C=EA=B3=B5=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?&=20=EB=82=A0=EC=A7=9C=EB=A1=9C=20=EC=A1=B0=ED=9A=8C=ED=95=A0?= =?UTF-8?q?=20=EB=95=8C=20DISTINCT=20=EC=BF=BC=EB=A6=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedule/business/ScheduleService.kt | 17 +++++++++++++---- .../persistence/ScheduleRepository.kt | 8 ++++++++ .../roomescape/schedule/web/ScheduleDto.kt | 12 ++++++++++++ 3 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/roomescape/schedule/business/ScheduleService.kt b/src/main/kotlin/roomescape/schedule/business/ScheduleService.kt index 3637d42c..2d8ce9e3 100644 --- a/src/main/kotlin/roomescape/schedule/business/ScheduleService.kt +++ b/src/main/kotlin/roomescape/schedule/business/ScheduleService.kt @@ -30,8 +30,7 @@ class ScheduleService( fun findThemesByDate(date: LocalDate): AvailableThemeIdListResponse { log.info { "[ScheduleService.findThemesByDate] 동일한 날짜의 모든 테마 조회: date=$date" } - return scheduleRepository.findAllByDate(date) - .toThemeIdListResponse() + return AvailableThemeIdListResponse(scheduleRepository.findAllUniqueThemeIdByDate(date)) .also { log.info { "[ScheduleService.findThemesByDate] date=${date} 인 ${it.themeIds.size}개 테마 조회 완료" } } @@ -54,8 +53,8 @@ class ScheduleService( val schedule: ScheduleEntity = findOrThrow(id) - val createdBy = memberService.findById(schedule.createdBy).name - val updatedBy = memberService.findById(schedule.updatedBy).name + val createdBy = memberService.findSummaryById(schedule.createdBy).name + val updatedBy = memberService.findSummaryById(schedule.updatedBy).name return schedule.toDetailRetrieveResponse(createdBy, updatedBy) .also { @@ -63,6 +62,16 @@ class ScheduleService( } } + @Transactional(readOnly = true) + fun findSummaryById(id: Long): ScheduleSummaryResponse { + log.info { "[ScheduleService.findDateTimeById] 일정 개요 조회 시작 : id=$id" } + + return findOrThrow(id).toSummaryResponse() + .also { + log.info { "[ScheduleService.findDateTimeById] 일정 개요 조회 완료: id=$id" } + } + } + @Transactional fun createSchedule(request: ScheduleCreateRequest): ScheduleCreateResponse { log.info { "[ScheduleService.createSchedule] 일정 생성 시작: date=${request.date}, time=${request.time}, themeId=${request.themeId}" } diff --git a/src/main/kotlin/roomescape/schedule/infrastructure/persistence/ScheduleRepository.kt b/src/main/kotlin/roomescape/schedule/infrastructure/persistence/ScheduleRepository.kt index 8bae9654..40879db1 100644 --- a/src/main/kotlin/roomescape/schedule/infrastructure/persistence/ScheduleRepository.kt +++ b/src/main/kotlin/roomescape/schedule/infrastructure/persistence/ScheduleRepository.kt @@ -1,6 +1,7 @@ package roomescape.schedule.infrastructure.persistence import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Query import java.time.LocalDate import java.time.LocalTime @@ -11,4 +12,11 @@ interface ScheduleRepository : JpaRepository { fun findAllByDateAndThemeId(date: LocalDate, themeId: Long): List fun existsByDateAndThemeIdAndTime(date: LocalDate, themeId: Long, time: LocalTime): Boolean + + @Query(""" + SELECT DISTINCT s.themeId + FROM ScheduleEntity s + WHERE s.date = :date + """) + fun findAllUniqueThemeIdByDate(date: LocalDate): List } diff --git a/src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt b/src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt index c666dbe6..91b70e91 100644 --- a/src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt +++ b/src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt @@ -66,3 +66,15 @@ fun ScheduleEntity.toDetailRetrieveResponse(createdBy: String, updatedBy: String updatedAt = this.updatedAt, updatedBy = updatedBy ) + +data class ScheduleSummaryResponse( + val date: LocalDate, + val time: LocalTime, + val themeId: Long +) + +fun ScheduleEntity.toSummaryResponse() = ScheduleSummaryResponse( + date = this.date, + time = this.time, + themeId = this.themeId +)