From bf8a005096900e52f8cd416cdaee1f1650f7ba2a Mon Sep 17 00:00:00 2001 From: pricelees Date: Thu, 4 Sep 2025 12:58:49 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=ED=85=8C=EB=A7=88=20/=20=EC=9D=BC?= =?UTF-8?q?=EC=A0=95=20=EC=88=98=EC=A0=95=20=EB=A1=9C=EC=A7=81=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0(=20->=20null=20=ED=95=84=EB=93=9C=EC=9D=B4=EB=A9=B4?= =?UTF-8?q?=20=EC=A6=89=EC=8B=9C=20=EC=A4=91=EB=8B=A8)=20=EB=B0=8F=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../schedule/business/ScheduleService.kt | 10 ++++++++-- .../schedule/business/ScheduleValidator.kt | 4 ++-- .../roomescape/schedule/web/ScheduleDto.kt | 6 +++++- .../roomescape/theme/business/ThemeServiceV2.kt | 5 +++++ .../theme/business/ThemeValidatorV2.kt | 14 +++++++------- .../kotlin/roomescape/theme/web/ThemeDtoV2.kt | 16 +++++++++++++++- 6 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/roomescape/schedule/business/ScheduleService.kt b/src/main/kotlin/roomescape/schedule/business/ScheduleService.kt index ba8fa9f4..dd989d70 100644 --- a/src/main/kotlin/roomescape/schedule/business/ScheduleService.kt +++ b/src/main/kotlin/roomescape/schedule/business/ScheduleService.kt @@ -33,7 +33,7 @@ class ScheduleService( return scheduleRepository.findAllByDate(date) .toThemeIdListResponse() .also { - log.info { "[ScheduleService.findThemesByDate] date=${date}인 ${it.themeIds.size}개 테마 조회 완료" } + log.info { "[ScheduleService.findThemesByDate] date=${date} 인 ${it.themeIds.size}개 테마 조회 완료" } } } @@ -44,7 +44,7 @@ class ScheduleService( return scheduleRepository.findAllByDateAndThemeId(date, themeId) .toRetrieveListResponse() .also { - log.info { "[ScheduleService.findSchedules] date=${date}, themeId=${themeId}인 ${it.schedules.size}개 일정 조회 완료" } + log.info { "[ScheduleService.findSchedules] date=${date}, themeId=${themeId} 인 ${it.schedules.size}개 일정 조회 완료" } } } @@ -86,6 +86,12 @@ class ScheduleService( @Transactional fun updateSchedule(id: Long, request: ScheduleUpdateRequest) { log.info { "[ScheduleService.updateSchedule] 일정 수정 시작: id=$id, request=${request}" } + + if (request.isAllParamsNull()) { + log.info { "[ScheduleService.updateSchedule] 일정 변경 사항 없음: id=$id" } + return + } + val schedule: ScheduleEntity = findOrThrow(id) scheduleValidator.validateCanUpdate(schedule, request) diff --git a/src/main/kotlin/roomescape/schedule/business/ScheduleValidator.kt b/src/main/kotlin/roomescape/schedule/business/ScheduleValidator.kt index d609b9fa..34c427ad 100644 --- a/src/main/kotlin/roomescape/schedule/business/ScheduleValidator.kt +++ b/src/main/kotlin/roomescape/schedule/business/ScheduleValidator.kt @@ -48,7 +48,7 @@ class ScheduleValidator( private fun validateAlreadyExists(date: LocalDate, themeId: Long, time: LocalTime) { if (scheduleRepository.existsByDateAndThemeIdAndTime(date, themeId, time)) { log.info { - "[ScheduleValidator.validateAlreadyExists] 동일한 날짜, 테마, 시간 존재: date=${date} / themeId=${themeId} / time=${time}" + "[ScheduleValidator.validateAlreadyExists] 동일한 날짜, 테마, 시간 존재로 인한 실패: date=${date} / themeId=${themeId} / time=${time}" } throw ScheduleException(ScheduleErrorCode.SCHEDULE_ALREADY_EXISTS) } @@ -59,7 +59,7 @@ class ScheduleValidator( if (dateTime.isBefore(LocalDateTime.now())) { log.info { - "[ScheduleValidator.validateDateTime] 이전 시간 선택: date=${date} / time=${time}" + "[ScheduleValidator.validateDateTime] 이전 시간 선택으로 인한 실패: date=${date} / time=${time}" } throw ScheduleException(ScheduleErrorCode.PAST_DATE_TIME) } diff --git a/src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt b/src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt index eed8f71a..c666dbe6 100644 --- a/src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt +++ b/src/main/kotlin/roomescape/schedule/web/ScheduleDto.kt @@ -39,7 +39,11 @@ data class ScheduleCreateResponse( data class ScheduleUpdateRequest( val time: LocalTime? = null, val status: ScheduleStatus? = null -) +) { + fun isAllParamsNull(): Boolean { + return time == null && status == null + } +} data class ScheduleDetailRetrieveResponse( val id: Long, diff --git a/src/main/kotlin/roomescape/theme/business/ThemeServiceV2.kt b/src/main/kotlin/roomescape/theme/business/ThemeServiceV2.kt index c6199161..bd3e9a2e 100644 --- a/src/main/kotlin/roomescape/theme/business/ThemeServiceV2.kt +++ b/src/main/kotlin/roomescape/theme/business/ThemeServiceV2.kt @@ -94,6 +94,11 @@ class ThemeServiceV2( fun updateTheme(id: Long, request: ThemeUpdateRequest) { log.info { "[ThemeService.updateTheme] 테마 수정 시작: id=${id}, request=${request}" } + if (request.isAllParamsNull()) { + log.info { "[ThemeService.updateTheme] 테마 변경 사항 없음: id=${id}" } + return + } + themeValidator.validateCanUpdate(request) val theme: ThemeEntityV2 = findOrThrow(id) diff --git a/src/main/kotlin/roomescape/theme/business/ThemeValidatorV2.kt b/src/main/kotlin/roomescape/theme/business/ThemeValidatorV2.kt index ee4eeee4..522b7187 100644 --- a/src/main/kotlin/roomescape/theme/business/ThemeValidatorV2.kt +++ b/src/main/kotlin/roomescape/theme/business/ThemeValidatorV2.kt @@ -32,7 +32,7 @@ class ThemeValidatorV2( fun validateCanCreate(request: ThemeCreateRequestV2) { if (themeRepository.existsByName(request.name)) { - log.info { "[ThemeValidator.validateCanCreate] 이름 중복: name=${request.name}" } + log.info { "[ThemeValidator.validateCanCreate] 이름 중복으로 인한 실패: name=${request.name}" } throw ThemeException(ThemeErrorCode.THEME_NAME_DUPLICATED) } @@ -55,7 +55,7 @@ class ThemeValidatorV2( maxParticipants: Short?, ) { if (isNotNullAndBelowThan(price, MIN_PRICE)) { - log.info { "[ThemeValidator.validateCanCreate] 최소 가격 미달: price=${price}" } + log.info { "[ThemeValidator.validateCanCreate] 최소 가격 미달로 인한 실패로 인한 실패: price=${price}" } throw ThemeException(ThemeErrorCode.PRICE_BELOW_MINIMUM) } validateTimes(availableMinutes, expectedMinutesFrom, expectedMinutesTo) @@ -72,18 +72,18 @@ class ThemeValidatorV2( || isNotNullAndBelowThan(expectedMinutesTo, MIN_DURATION) ) { log.info { - "[ThemeValidator.validateTimes] 최소 시간 미달: availableMinutes=$availableMinutes" + + "[ThemeValidator.validateTimes] 최소 시간 미달로 인한 실패로 인한 실패: availableMinutes=$availableMinutes" + ", expectedMinutesFrom=$expectedMinutesFrom, expectedMinutesTo=$expectedMinutesTo" } throw ThemeException(ThemeErrorCode.DURATION_BELOW_MINIMUM) } if (expectedMinutesFrom.isNotNullAndGraterThan(expectedMinutesTo)) { - log.info { "[ThemeValidator.validateTimes] 최소 예상 시간의 최대 예상 시간 초과: expectedMinutesFrom=$expectedMinutesFrom, expectedMinutesTo=$expectedMinutesTo" } + log.info { "[ThemeValidator.validateTimes] 최소 예상 시간의 최대 예상 시간 초과로 인한 실패: expectedMinutesFrom=$expectedMinutesFrom, expectedMinutesTo=$expectedMinutesTo" } throw ThemeException(ThemeErrorCode.MIN_EXPECTED_TIME_EXCEEDS_MAX_EXPECTED_TIME) } if (expectedMinutesTo.isNotNullAndGraterThan(availableMinutes)) { - log.info { "[ThemeValidator.validateTimes] 예상 시간의 이용 가능 시간 초과: availableMinutes=$expectedMinutesFrom, expectedMinutesFrom=$expectedMinutesFrom, expectedMinutesTo=$expectedMinutesTo" } + log.info { "[ThemeValidator.validateTimes] 예상 시간의 이용 가능 시간 초과로 인한 실패: availableMinutes=$expectedMinutesFrom, expectedMinutesFrom=$expectedMinutesFrom, expectedMinutesTo=$expectedMinutesTo" } throw ThemeException(ThemeErrorCode.EXPECTED_TIME_EXCEEDS_AVAILABLE_TIME) } } @@ -95,11 +95,11 @@ class ThemeValidatorV2( if (isNotNullAndBelowThan(minParticipants, MIN_PARTICIPANTS) || isNotNullAndBelowThan(maxParticipants, MIN_PARTICIPANTS) ) { - log.info { "[ThemeValidator.validateParticipants] 최소 인원 미달: minParticipants=$minParticipants, maxParticipants=$maxParticipants" } + log.info { "[ThemeValidator.validateParticipants] 최소 인원 미달로 인한 실패: minParticipants=$minParticipants, maxParticipants=$maxParticipants" } throw ThemeException(ThemeErrorCode.PARTICIPANT_BELOW_MINIMUM) } if (minParticipants.isNotNullAndGraterThan(maxParticipants)) { - log.info { "[ThemeValidator.validateParticipants] 최소 인원의 최대 인원 초과: minParticipants=$minParticipants, maxParticipants=$maxParticipants" } + log.info { "[ThemeValidator.validateParticipants] 최소 인원의 최대 인원 초과로 인한 실패: minParticipants=$minParticipants, maxParticipants=$maxParticipants" } throw ThemeException(ThemeErrorCode.MIN_PARTICIPANT_EXCEEDS_MAX_PARTICIPANT) } } diff --git a/src/main/kotlin/roomescape/theme/web/ThemeDtoV2.kt b/src/main/kotlin/roomescape/theme/web/ThemeDtoV2.kt index 830aa9c8..d5b6461a 100644 --- a/src/main/kotlin/roomescape/theme/web/ThemeDtoV2.kt +++ b/src/main/kotlin/roomescape/theme/web/ThemeDtoV2.kt @@ -49,7 +49,21 @@ data class ThemeUpdateRequest( val expectedMinutesFrom: Short? = null, val expectedMinutesTo: Short? = null, val isOpen: Boolean? = null, -) +) { + fun isAllParamsNull(): Boolean { + return name == null && + description == null && + thumbnailUrl == null && + difficulty == null && + price == null && + minParticipants == null && + maxParticipants == null && + availableMinutes == null && + expectedMinutesFrom == null && + expectedMinutesTo == null && + isOpen == null + } +} data class AdminThemeSummaryRetrieveResponse( val id: Long,