From 879a941bd0870ab4205c5f243f0a2ef8e0d689b4 Mon Sep 17 00:00:00 2001 From: This2sho Date: Fri, 14 Jun 2024 03:11:22 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EC=9A=B4=EC=98=81=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=ED=91=9C=ED=98=84=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parkingapi/korea/KoreaParkingAdapter.java | 4 +- .../pusan/PusanPublicParkingAdapter.java | 4 +- .../seoul/SeoulPublicParkingAdapter.java | 4 +- .../respository/ParkingBulkRepository.java | 44 ++++++------ .../korea/KoreaParkingAdapterTest.java | 8 +-- .../pusan/PusanPublicParkingAdapterTest.java | 8 +-- .../seoul/SeoulPublicParkingAdapterTest.java | 8 +-- .../domain/parking/FreeOperatingTime.java | 67 ++++++------------- .../common/domain/parking/OperatingTime.java | 47 ++++++------- .../domain/parking/ParkingFeeCalculator.java | 6 +- .../common/domain/parking/TimeInfo.java | 17 ++++- .../infra/converter/TimeInfoConverter.java | 25 +++++++ .../mysql/V5.0.0__change_column_name.sql | 24 +++++++ .../domain/parking/FreeOperatingTimeTest.java | 6 +- .../parking/ParkingFeeCalculatorTest.java | 8 ++- .../common/domain/parking/TimeInfoTest.java | 11 +-- .../converter/TimeInfoConverterTest.java | 36 ++++++++++ 17 files changed, 195 insertions(+), 132 deletions(-) create mode 100644 domain/src/main/java/com/parkingcomestrue/common/infra/converter/TimeInfoConverter.java create mode 100644 domain/src/main/resources/db/migration/mysql/V5.0.0__change_column_name.sql create mode 100644 domain/src/test/java/com/parkingcomestrue/common/infra/converter/TimeInfoConverterTest.java diff --git a/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/korea/KoreaParkingAdapter.java b/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/korea/KoreaParkingAdapter.java index 07db341a..0be879b7 100644 --- a/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/korea/KoreaParkingAdapter.java +++ b/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/korea/KoreaParkingAdapter.java @@ -1,5 +1,7 @@ package com.parkingcomestrue.external.api.parkingapi.korea; +import static com.parkingcomestrue.common.domain.parking.TimeInfo.MAX_END_TIME; + import com.parkingcomestrue.common.domain.parking.BaseInformation; import com.parkingcomestrue.common.domain.parking.Fee; import com.parkingcomestrue.common.domain.parking.FeePolicy; @@ -114,7 +116,7 @@ private TimeInfo toTimeInfo(String beginTime, String endTime) { private LocalTime parsingOperationTime(String time) { if (time.equals(HOURS_24)) { - return LocalTime.MAX; + return MAX_END_TIME; } try { return LocalTime.parse(time, TIME_FORMATTER); diff --git a/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/pusan/PusanPublicParkingAdapter.java b/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/pusan/PusanPublicParkingAdapter.java index 9881d1fa..f3488f22 100644 --- a/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/pusan/PusanPublicParkingAdapter.java +++ b/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/pusan/PusanPublicParkingAdapter.java @@ -1,5 +1,7 @@ package com.parkingcomestrue.external.api.parkingapi.pusan; +import static com.parkingcomestrue.common.domain.parking.TimeInfo.MAX_END_TIME; + import com.parkingcomestrue.common.domain.parking.BaseInformation; import com.parkingcomestrue.common.domain.parking.Fee; import com.parkingcomestrue.common.domain.parking.FeePolicy; @@ -105,7 +107,7 @@ private TimeInfo toTimeInfo(String beginTime, String endTime) { private LocalTime parsingOperationTime(String time) { if (time.equals(HOURS_24)) { - return LocalTime.MAX; + return MAX_END_TIME; } try { return LocalTime.parse(time, TIME_FORMATTER); diff --git a/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/seoul/SeoulPublicParkingAdapter.java b/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/seoul/SeoulPublicParkingAdapter.java index 127711cb..cb93ed15 100644 --- a/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/seoul/SeoulPublicParkingAdapter.java +++ b/app-scheduler/src/main/java/com/parkingcomestrue/external/api/parkingapi/seoul/SeoulPublicParkingAdapter.java @@ -1,5 +1,7 @@ package com.parkingcomestrue.external.api.parkingapi.seoul; +import static com.parkingcomestrue.common.domain.parking.TimeInfo.MAX_END_TIME; + import com.parkingcomestrue.common.domain.parking.BaseInformation; import com.parkingcomestrue.common.domain.parking.Fee; import com.parkingcomestrue.common.domain.parking.FeePolicy; @@ -126,7 +128,7 @@ private OperatingTime getOperatingTime(final SeoulPublicParkingResponse.ParkingI private LocalTime parsingOperationTime(String time) { if (time.equals(HOURS_24)) { - return LocalTime.MAX; + return MAX_END_TIME; } try { return LocalTime.parse(time, TIME_FORMATTER); diff --git a/app-scheduler/src/main/java/com/parkingcomestrue/external/respository/ParkingBulkRepository.java b/app-scheduler/src/main/java/com/parkingcomestrue/external/respository/ParkingBulkRepository.java index de9e13b4..bdd97795 100644 --- a/app-scheduler/src/main/java/com/parkingcomestrue/external/respository/ParkingBulkRepository.java +++ b/app-scheduler/src/main/java/com/parkingcomestrue/external/respository/ParkingBulkRepository.java @@ -24,31 +24,25 @@ public class ParkingBulkRepository { ps.setInt(6, parking.getSpace().getCapacity()); ps.setInt(7, parking.getSpace().getCurrentParking()); - ps.setObject(8, parking.getOperatingTime().getHolidayBeginTime()); - ps.setObject(9, parking.getOperatingTime().getHolidayEndTime()); - ps.setObject(10, parking.getFreeOperatingTime().getHolidayBeginTime()); - ps.setObject(11, parking.getFreeOperatingTime().getHolidayEndTime()); + ps.setString(8, parking.getOperatingTime().getHolidayOperatingTime().toString()); + ps.setString(9, parking.getFreeOperatingTime().getHolidayFreeOperatingTime().toString()); - ps.setObject(12, parking.getOperatingTime().getSaturdayBeginTime()); - ps.setObject(13, parking.getOperatingTime().getSaturdayEndTime()); - ps.setObject(14, parking.getFreeOperatingTime().getSaturdayBeginTime()); - ps.setObject(15, parking.getFreeOperatingTime().getSaturdayEndTime()); + ps.setString(10, parking.getOperatingTime().getSaturdayOperatingTime().toString()); + ps.setString(11, parking.getFreeOperatingTime().getSaturdayFreeOperatingTime().toString()); - ps.setObject(16, parking.getOperatingTime().getWeekdayBeginTime()); - ps.setObject(17, parking.getOperatingTime().getWeekdayEndTime()); - ps.setObject(18, parking.getFreeOperatingTime().getWeekdayBeginTime()); - ps.setObject(19, parking.getFreeOperatingTime().getWeekdayEndTime()); + ps.setString(12, parking.getOperatingTime().getWeekdayOperatingTime().toString()); + ps.setString(13, parking.getFreeOperatingTime().getWeekdayFreeOperatingTime().toString()); - ps.setObject(20, parking.getCreatedAt()); - ps.setObject(21, parking.getUpdatedAt()); + ps.setObject(14, parking.getCreatedAt()); + ps.setObject(15, parking.getUpdatedAt()); - ps.setString(22, parking.getBaseInformation().getAddress()); - ps.setString(23, parking.getBaseInformation().getName()); - ps.setString(24, parking.getBaseInformation().getTel()); - ps.setString(25, parking.getBaseInformation().getOperationType().name()); - ps.setString(26, parking.getBaseInformation().getParkingType().name()); - ps.setString(27, parking.getBaseInformation().getPayTypesName()); - ps.setString(28, toWKT(parking.getLocation())); + ps.setString(16, parking.getBaseInformation().getAddress()); + ps.setString(17, parking.getBaseInformation().getName()); + ps.setString(18, parking.getBaseInformation().getTel()); + ps.setString(19, parking.getBaseInformation().getOperationType().name()); + ps.setString(20, parking.getBaseInformation().getParkingType().name()); + ps.setString(21, parking.getBaseInformation().getPayTypesName()); + ps.setString(22, toWKT(parking.getLocation())); }; private String toWKT(Location location) { @@ -62,13 +56,13 @@ public void saveAllWithBulk(List parkingLots) { String sql = "INSERT INTO parking " + "(base_fee, base_time_unit, extra_fee, extra_time_unit, day_maximum_fee, " + "capacity, current_parking, " - + "holiday_begin_time, holiday_end_time, holiday_free_begin_time, holiday_free_end_time, " - + "saturday_begin_time, saturday_end_time, saturday_free_begin_time, saturday_free_end_time, " - + "weekday_begin_time, weekday_end_time, weekday_free_begin_time, weekday_free_end_time, " + + "holiday_operating_time, holiday_free_operating_time, " + + "saturday_operating_time, saturday_free_operating_time, " + + "weekday_operating_time, weekday_free_operating_time, " + "created_at, updated_at, " + "address, name, tel, operation_type, parking_type, pay_types, location) " + "VALUES " - + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ST_GeomFromText(?, 4326))"; + + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ST_GeomFromText(?, 4326))"; jdbcTemplate.batchUpdate( sql, diff --git a/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/korea/KoreaParkingAdapterTest.java b/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/korea/KoreaParkingAdapterTest.java index 1bf71163..ca5325da 100644 --- a/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/korea/KoreaParkingAdapterTest.java +++ b/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/korea/KoreaParkingAdapterTest.java @@ -8,8 +8,6 @@ import com.parkingcomestrue.common.domain.parking.PayType; import com.parkingcomestrue.common.domain.parking.TimeInfo; import com.parkingcomestrue.common.domain.parking.TimeUnit; -import com.parkingcomestrue.external.api.parkingapi.korea.KoreaParkingAdapter; -import com.parkingcomestrue.external.api.parkingapi.korea.KoreaParkingResponse; import java.io.File; import java.io.IOException; import org.assertj.core.api.SoftAssertions; @@ -77,9 +75,9 @@ class KoreaParkingAdapterTest { soft.assertThat(parking.getFeePolicy().getExtraTimeUnit()).isEqualTo(TimeUnit.NO_INFO); soft.assertThat(parking.getFeePolicy().getDayMaximumFee()).isEqualTo(Fee.NO_INFO); - soft.assertThat(parking.getOperatingTime().getWeekday()).isEqualTo(TimeInfo.ALL_DAY); - soft.assertThat(parking.getOperatingTime().getSaturday()).isEqualTo(TimeInfo.ALL_DAY); - soft.assertThat(parking.getOperatingTime().getHoliday()).isEqualTo(TimeInfo.ALL_DAY); + soft.assertThat(parking.getOperatingTime().getWeekdayOperatingTime()).isEqualTo(TimeInfo.ALL_DAY); + soft.assertThat(parking.getOperatingTime().getSaturdayOperatingTime()).isEqualTo(TimeInfo.ALL_DAY); + soft.assertThat(parking.getOperatingTime().getHolidayOperatingTime()).isEqualTo(TimeInfo.ALL_DAY); soft.assertThat(parking.getBaseInformation().getPayTypesDescription()).isEqualTo(PayType.CARD.getDescription()); } diff --git a/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/pusan/PusanPublicParkingAdapterTest.java b/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/pusan/PusanPublicParkingAdapterTest.java index 4479a438..317cbae1 100644 --- a/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/pusan/PusanPublicParkingAdapterTest.java +++ b/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/pusan/PusanPublicParkingAdapterTest.java @@ -8,8 +8,6 @@ import com.parkingcomestrue.common.domain.parking.PayType; import com.parkingcomestrue.common.domain.parking.TimeInfo; import com.parkingcomestrue.common.domain.parking.TimeUnit; -import com.parkingcomestrue.external.api.parkingapi.pusan.PusanPublicParkingAdapter; -import com.parkingcomestrue.external.api.parkingapi.pusan.PusanPublicParkingResponse; import java.io.File; import java.io.IOException; import org.assertj.core.api.SoftAssertions; @@ -78,9 +76,9 @@ class PusanPublicParkingAdapterTest { soft.assertThat(parking.getFeePolicy().getExtraTimeUnit()).isEqualTo(TimeUnit.from(10)); soft.assertThat(parking.getFeePolicy().getDayMaximumFee()).isEqualTo(Fee.ZERO); - soft.assertThat(parking.getOperatingTime().getWeekday()).isEqualTo(TimeInfo.ALL_DAY); - soft.assertThat(parking.getOperatingTime().getSaturday()).isEqualTo(TimeInfo.ALL_DAY); - soft.assertThat(parking.getOperatingTime().getHoliday()).isEqualTo(TimeInfo.ALL_DAY); + soft.assertThat(parking.getOperatingTime().getWeekdayOperatingTime()).isEqualTo(TimeInfo.ALL_DAY); + soft.assertThat(parking.getOperatingTime().getSaturdayOperatingTime()).isEqualTo(TimeInfo.ALL_DAY); + soft.assertThat(parking.getOperatingTime().getHolidayOperatingTime()).isEqualTo(TimeInfo.ALL_DAY); soft.assertThat(parking.getBaseInformation().getPayTypesDescription()).isEqualTo(PayType.NO_INFO.getDescription()); } diff --git a/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/seoul/SeoulPublicParkingAdapterTest.java b/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/seoul/SeoulPublicParkingAdapterTest.java index 78459794..fa49f365 100644 --- a/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/seoul/SeoulPublicParkingAdapterTest.java +++ b/app-scheduler/src/test/java/com/parkingcomestrue/external/api/parkingapi/seoul/SeoulPublicParkingAdapterTest.java @@ -8,8 +8,6 @@ import com.parkingcomestrue.common.domain.parking.PayType; import com.parkingcomestrue.common.domain.parking.TimeInfo; import com.parkingcomestrue.common.domain.parking.TimeUnit; -import com.parkingcomestrue.external.api.parkingapi.seoul.SeoulPublicParkingAdapter; -import com.parkingcomestrue.external.api.parkingapi.seoul.SeoulPublicParkingResponse; import java.io.File; import java.io.IOException; import java.time.LocalTime; @@ -78,9 +76,9 @@ class SeoulPublicParkingAdapterTest { soft.assertThat(parking.getFeePolicy().getExtraTimeUnit()).isEqualTo(TimeUnit.from(5)); soft.assertThat(parking.getFeePolicy().getDayMaximumFee()).isEqualTo(Fee.ZERO); - soft.assertThat(parking.getOperatingTime().getWeekday()).isEqualTo(new TimeInfo(LocalTime.of(9, 0), LocalTime.of(19, 0))); - soft.assertThat(parking.getOperatingTime().getSaturday()).isEqualTo(new TimeInfo(LocalTime.of(9, 0), LocalTime.of(15, 0))); - soft.assertThat(parking.getOperatingTime().getHoliday()).isEqualTo(new TimeInfo(LocalTime.of(0, 0), LocalTime.of(0, 0))); + soft.assertThat(parking.getOperatingTime().getWeekdayOperatingTime()).isEqualTo(new TimeInfo(LocalTime.of(9, 0), LocalTime.of(19, 0))); + soft.assertThat(parking.getOperatingTime().getSaturdayOperatingTime()).isEqualTo(new TimeInfo(LocalTime.of(9, 0), LocalTime.of(15, 0))); + soft.assertThat(parking.getOperatingTime().getHolidayOperatingTime()).isEqualTo(new TimeInfo(LocalTime.of(0, 0), LocalTime.of(0, 0))); soft.assertThat(parking.getBaseInformation().getPayTypesDescription()).isEqualTo(PayType.NO_INFO.getDescription()); } diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/FreeOperatingTime.java b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/FreeOperatingTime.java index 44dbd4f0..9b2447a7 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/FreeOperatingTime.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/FreeOperatingTime.java @@ -1,15 +1,18 @@ package com.parkingcomestrue.common.domain.parking; -import jakarta.persistence.AttributeOverride; -import jakarta.persistence.Column; +import static com.parkingcomestrue.common.domain.parking.TimeInfo.MAX_END_TIME; + +import com.parkingcomestrue.common.infra.converter.TimeInfoConverter; +import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; -import jakarta.persistence.Embedded; import java.time.LocalTime; import lombok.AccessLevel; +import lombok.Getter; import lombok.NoArgsConstructor; @NoArgsConstructor(access = AccessLevel.PROTECTED) @Embeddable +@Getter public class FreeOperatingTime { public static final FreeOperatingTime ALWAYS_PAY = new FreeOperatingTime(TimeInfo.CLOSED, TimeInfo.CLOSED, @@ -17,25 +20,19 @@ public class FreeOperatingTime { public static final FreeOperatingTime ALWAYS_FREE = new FreeOperatingTime(TimeInfo.ALL_DAY, TimeInfo.ALL_DAY, TimeInfo.ALL_DAY); - @AttributeOverride(name = "beginTime", column = @Column(name = "weekday_free_begin_time")) - @AttributeOverride(name = "endTime", column = @Column(name = "weekday_free_end_time")) - @Embedded - private TimeInfo weekday; + @Convert(converter = TimeInfoConverter.class) + private TimeInfo weekdayFreeOperatingTime; - @AttributeOverride(name = "beginTime", column = @Column(name = "saturday_free_begin_time")) - @AttributeOverride(name = "endTime", column = @Column(name = "saturday_free_end_time")) - @Embedded - private TimeInfo saturday; + @Convert(converter = TimeInfoConverter.class) + private TimeInfo saturdayFreeOperatingTime; - @AttributeOverride(name = "beginTime", column = @Column(name = "holiday_free_begin_time")) - @AttributeOverride(name = "endTime", column = @Column(name = "holiday_free_end_time")) - @Embedded - private TimeInfo holiday; + @Convert(converter = TimeInfoConverter.class) + private TimeInfo holidayFreeOperatingTime; - public FreeOperatingTime(TimeInfo weekday, TimeInfo saturday, TimeInfo holiday) { - this.weekday = weekday; - this.saturday = saturday; - this.holiday = holiday; + public FreeOperatingTime(TimeInfo weekdayFreeOperatingTime, TimeInfo saturdayFreeOperatingTime, TimeInfo holidayFreeOperatingTime) { + this.weekdayFreeOperatingTime = weekdayFreeOperatingTime; + this.saturdayFreeOperatingTime = saturdayFreeOperatingTime; + this.holidayFreeOperatingTime = holidayFreeOperatingTime; } public int calculateNonFreeUsageMinutes(DayParking dayParking) { @@ -52,12 +49,12 @@ public int calculateNonFreeUsageMinutes(DayParking dayParking) { private TimeInfo getTodayTimeInfo(DayParking dayParking) { if (dayParking.isWeekDay()) { - return weekday; + return weekdayFreeOperatingTime; } if (dayParking.isSaturday()) { - return saturday; + return saturdayFreeOperatingTime; } - return holiday; + return holidayFreeOperatingTime; } private boolean isFreeDay(TimeInfo today) { @@ -65,33 +62,9 @@ private boolean isFreeDay(TimeInfo today) { } private int calculateMinutes(LocalTime localTime) { - if (localTime.equals(LocalTime.MAX)) { + if (localTime.equals(MAX_END_TIME)) { return localTime.getHour() * 60 + localTime.getMinute() + 1; } return localTime.getHour() * 60 + localTime.getMinute(); } - - public LocalTime getWeekdayBeginTime() { - return weekday.getBeginTime(); - } - - public LocalTime getWeekdayEndTime() { - return weekday.getEndTime(); - } - - public LocalTime getSaturdayBeginTime() { - return saturday.getBeginTime(); - } - - public LocalTime getSaturdayEndTime() { - return saturday.getEndTime(); - } - - public LocalTime getHolidayBeginTime() { - return holiday.getBeginTime(); - } - - public LocalTime getHolidayEndTime() { - return holiday.getEndTime(); - } } diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/OperatingTime.java b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/OperatingTime.java index 65cdde82..5d06f9d5 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/OperatingTime.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/OperatingTime.java @@ -1,9 +1,8 @@ package com.parkingcomestrue.common.domain.parking; -import jakarta.persistence.AttributeOverride; -import jakarta.persistence.Column; +import com.parkingcomestrue.common.infra.converter.TimeInfoConverter; +import jakarta.persistence.Convert; import jakarta.persistence.Embeddable; -import jakarta.persistence.Embedded; import java.time.LocalTime; import lombok.AccessLevel; import lombok.Getter; @@ -17,50 +16,44 @@ public class OperatingTime { public static final OperatingTime ALWAYS_OPEN = new OperatingTime(TimeInfo.ALL_DAY, TimeInfo.ALL_DAY, TimeInfo.ALL_DAY); - @AttributeOverride(name = "beginTime", column = @Column(name = "weekday_begin_time")) - @AttributeOverride(name = "endTime", column = @Column(name = "weekday_end_time")) - @Embedded - private TimeInfo weekday; + @Convert(converter = TimeInfoConverter.class) + private TimeInfo weekdayOperatingTime; - @AttributeOverride(name = "beginTime", column = @Column(name = "saturday_begin_time")) - @AttributeOverride(name = "endTime", column = @Column(name = "saturday_end_time")) - @Embedded - private TimeInfo saturday; + @Convert(converter = TimeInfoConverter.class) + private TimeInfo saturdayOperatingTime; - @AttributeOverride(name = "beginTime", column = @Column(name = "holiday_begin_time")) - @AttributeOverride(name = "endTime", column = @Column(name = "holiday_end_time")) - @Embedded - private TimeInfo holiday; + @Convert(converter = TimeInfoConverter.class) + private TimeInfo holidayOperatingTime; - public OperatingTime(TimeInfo weekday, - TimeInfo saturday, - TimeInfo holiday) { - this.weekday = weekday; - this.saturday = saturday; - this.holiday = holiday; + public OperatingTime(TimeInfo weekdayOperatingTime, + TimeInfo saturdayOperatingTime, + TimeInfo holidayOperatingTime) { + this.weekdayOperatingTime = weekdayOperatingTime; + this.saturdayOperatingTime = saturdayOperatingTime; + this.holidayOperatingTime = holidayOperatingTime; } public LocalTime getWeekdayBeginTime() { - return weekday.getBeginTime(); + return weekdayOperatingTime.getBeginTime(); } public LocalTime getWeekdayEndTime() { - return weekday.getEndTime(); + return weekdayOperatingTime.getEndTime(); } public LocalTime getSaturdayBeginTime() { - return saturday.getBeginTime(); + return saturdayOperatingTime.getBeginTime(); } public LocalTime getSaturdayEndTime() { - return saturday.getEndTime(); + return saturdayOperatingTime.getEndTime(); } public LocalTime getHolidayBeginTime() { - return holiday.getBeginTime(); + return holidayOperatingTime.getBeginTime(); } public LocalTime getHolidayEndTime() { - return holiday.getEndTime(); + return holidayOperatingTime.getEndTime(); } } diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/ParkingFeeCalculator.java b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/ParkingFeeCalculator.java index fbf8c8d2..f61f424c 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/ParkingFeeCalculator.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/ParkingFeeCalculator.java @@ -1,5 +1,7 @@ package com.parkingcomestrue.common.domain.parking; +import static com.parkingcomestrue.common.domain.parking.TimeInfo.MAX_END_TIME; + import java.time.LocalDateTime; import java.time.LocalTime; import java.util.ArrayList; @@ -36,7 +38,7 @@ private List separateDate(LocalDateTime beginTime, LocalDateTime end dayParkingDates.add(makeFirstDayParking(beginTime)); beginTime = beginTime.plusDays(1); while (!isSameDate(beginTime, endTime)) { - dayParkingDates.add(new DayParking(Day.from(beginTime.getDayOfWeek()), LocalTime.MIN, LocalTime.MAX)); + dayParkingDates.add(new DayParking(Day.from(beginTime.getDayOfWeek()), LocalTime.MIN, MAX_END_TIME)); beginTime = beginTime.plusDays(1); } dayParkingDates.add(makeLastDayParking(endTime)); @@ -62,7 +64,7 @@ private boolean isSameDayOfMonth(LocalDateTime beginTime, LocalDateTime endTime) } private DayParking makeFirstDayParking(LocalDateTime beginTime) { - return new DayParking(Day.from(beginTime.getDayOfWeek()), beginTime.toLocalTime(), LocalTime.MAX); + return new DayParking(Day.from(beginTime.getDayOfWeek()), beginTime.toLocalTime(), MAX_END_TIME); } private DayParking makeLastDayParking(LocalDateTime endTime) { diff --git a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/TimeInfo.java b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/TimeInfo.java index 5d209a83..be58f636 100644 --- a/domain/src/main/java/com/parkingcomestrue/common/domain/parking/TimeInfo.java +++ b/domain/src/main/java/com/parkingcomestrue/common/domain/parking/TimeInfo.java @@ -2,6 +2,7 @@ import jakarta.persistence.Embeddable; import java.time.LocalTime; +import java.time.format.DateTimeFormatter; import lombok.AccessLevel; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -14,7 +15,10 @@ public class TimeInfo { public static final TimeInfo CLOSED = new TimeInfo(LocalTime.MIN, LocalTime.MIN); - public static final TimeInfo ALL_DAY = new TimeInfo(LocalTime.MIN, LocalTime.MAX); + public static final LocalTime MAX_END_TIME = LocalTime.of(23, 59); + public static final TimeInfo ALL_DAY = new TimeInfo(LocalTime.MIN, MAX_END_TIME); + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); + private static final String DELIMITER = "~"; private LocalTime beginTime; private LocalTime endTime; @@ -26,7 +30,7 @@ public TimeInfo(LocalTime beginTime, LocalTime endTime) { public int calculateOverlapMinutes(LocalTime beginTime, LocalTime endTime) { if (this.endTime.isBefore(this.beginTime)) { - TimeInfo today = new TimeInfo(this.beginTime, LocalTime.MAX); + TimeInfo today = new TimeInfo(this.beginTime, MAX_END_TIME); TimeInfo tomorrow = new TimeInfo(LocalTime.MIN, this.endTime); return today.calculateOverlapMinutes(beginTime, endTime) + tomorrow.calculateOverlapMinutes(beginTime, endTime); @@ -56,9 +60,16 @@ private int calculateBetweenMinutes(LocalTime beginTime, LocalTime endTime) { } private int calculateMinutes(LocalTime localTime) { - if (localTime.equals(LocalTime.MAX)) { + if (localTime.equals(MAX_END_TIME)) { return localTime.getHour() * 60 + localTime.getMinute() + 1; } return localTime.getHour() * 60 + localTime.getMinute(); } + + @Override + public String toString() { + String beginTime = this.beginTime.format(TIME_FORMATTER); + String endTime = this.endTime.format(TIME_FORMATTER); + return beginTime + DELIMITER + endTime; + } } diff --git a/domain/src/main/java/com/parkingcomestrue/common/infra/converter/TimeInfoConverter.java b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/TimeInfoConverter.java new file mode 100644 index 00000000..4a996083 --- /dev/null +++ b/domain/src/main/java/com/parkingcomestrue/common/infra/converter/TimeInfoConverter.java @@ -0,0 +1,25 @@ +package com.parkingcomestrue.common.infra.converter; + +import com.parkingcomestrue.common.domain.parking.TimeInfo; +import jakarta.persistence.AttributeConverter; +import jakarta.persistence.Converter; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +@Converter +public class TimeInfoConverter implements AttributeConverter { + + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); + private static final String DELIMITER = "~"; + + @Override + public String convertToDatabaseColumn(TimeInfo attribute) { + return attribute.toString(); + } + + @Override + public TimeInfo convertToEntityAttribute(String dbData) { + String[] times = dbData.split(DELIMITER); + return new TimeInfo(LocalTime.parse(times[0], TIME_FORMATTER), LocalTime.parse(times[1], TIME_FORMATTER)); + } +} diff --git a/domain/src/main/resources/db/migration/mysql/V5.0.0__change_column_name.sql b/domain/src/main/resources/db/migration/mysql/V5.0.0__change_column_name.sql new file mode 100644 index 00000000..464912cd --- /dev/null +++ b/domain/src/main/resources/db/migration/mysql/V5.0.0__change_column_name.sql @@ -0,0 +1,24 @@ +ALTER TABLE parking + DROP COLUMN holiday_begin_time, + DROP COLUMN holiday_end_time, + DROP COLUMN holiday_free_begin_time, + DROP COLUMN holiday_free_end_time, + DROP COLUMN saturday_begin_time, + DROP COLUMN saturday_end_time, + DROP COLUMN saturday_free_begin_time, + DROP COLUMN saturday_free_end_time, + DROP COLUMN weekday_begin_time, + DROP COLUMN weekday_end_time, + DROP COLUMN weekday_free_begin_time, + DROP COLUMN weekday_free_end_time; + +ALTER TABLE parking + ADD COLUMN holiday_operating_time VARCHAR(20), + ADD COLUMN holiday_free_operating_time VARCHAR(20), + ADD COLUMN saturday_operating_time VARCHAR(20), + ADD COLUMN saturday_free_operating_time VARCHAR(20), + ADD COLUMN weekday_operating_time VARCHAR(20), + ADD COLUMN weekday_free_operating_time VARCHAR(20); + + + diff --git a/domain/src/test/java/com/parkingcomestrue/common/domain/parking/FreeOperatingTimeTest.java b/domain/src/test/java/com/parkingcomestrue/common/domain/parking/FreeOperatingTimeTest.java index 6d34ed68..5c5e40ec 100644 --- a/domain/src/test/java/com/parkingcomestrue/common/domain/parking/FreeOperatingTimeTest.java +++ b/domain/src/test/java/com/parkingcomestrue/common/domain/parking/FreeOperatingTimeTest.java @@ -1,5 +1,7 @@ package com.parkingcomestrue.common.domain.parking; +import static com.parkingcomestrue.common.domain.parking.TimeInfo.MAX_END_TIME; + import com.parkingcomestrue.common.domain.parking.Day; import com.parkingcomestrue.common.domain.parking.DayParking; import com.parkingcomestrue.common.domain.parking.FreeOperatingTime; @@ -36,7 +38,7 @@ static Stream getFreeOperatingTime() { */ Arguments.of( FreeOperatingTime.ALWAYS_FREE, - new DayParking(Day.WEEKDAY, LocalTime.MIN, LocalTime.MAX), + new DayParking(Day.WEEKDAY, LocalTime.MIN, MAX_END_TIME), 0 ), /* @@ -58,7 +60,7 @@ static Stream getFreeOperatingTime() { TimeInfo.ALL_DAY, TimeInfo.ALL_DAY ), - new DayParking(Day.WEEKDAY, LocalTime.MIN, LocalTime.MAX), + new DayParking(Day.WEEKDAY, LocalTime.MIN, MAX_END_TIME), 1200 ), /* diff --git a/domain/src/test/java/com/parkingcomestrue/common/domain/parking/ParkingFeeCalculatorTest.java b/domain/src/test/java/com/parkingcomestrue/common/domain/parking/ParkingFeeCalculatorTest.java index d0cd9544..79e96b33 100644 --- a/domain/src/test/java/com/parkingcomestrue/common/domain/parking/ParkingFeeCalculatorTest.java +++ b/domain/src/test/java/com/parkingcomestrue/common/domain/parking/ParkingFeeCalculatorTest.java @@ -1,5 +1,7 @@ package com.parkingcomestrue.common.domain.parking; +import static com.parkingcomestrue.common.domain.parking.TimeInfo.MAX_END_TIME; + import com.parkingcomestrue.common.domain.parking.BaseInformation; import com.parkingcomestrue.common.domain.parking.Fee; import com.parkingcomestrue.common.domain.parking.FeePolicy; @@ -267,7 +269,7 @@ static Stream getParkingFeeCalculator() { ), new TimeInfo( LocalTime.of(6, 0), - LocalTime.MAX + MAX_END_TIME ), TimeInfo.ALL_DAY ), @@ -325,7 +327,7 @@ static Stream getParkingFeeCalculator() { TimeInfo.ALL_DAY, new TimeInfo( LocalTime.of(4, 0), - LocalTime.MAX + MAX_END_TIME ) ), new OperatingTime(), @@ -384,7 +386,7 @@ static Stream getParkingFeeCalculator() { TimeInfo.ALL_DAY, new TimeInfo( LocalTime.of(4, 0), - LocalTime.MAX + MAX_END_TIME ) ), new OperatingTime(), diff --git a/domain/src/test/java/com/parkingcomestrue/common/domain/parking/TimeInfoTest.java b/domain/src/test/java/com/parkingcomestrue/common/domain/parking/TimeInfoTest.java index ffaefbe0..2814a63c 100644 --- a/domain/src/test/java/com/parkingcomestrue/common/domain/parking/TimeInfoTest.java +++ b/domain/src/test/java/com/parkingcomestrue/common/domain/parking/TimeInfoTest.java @@ -1,6 +1,7 @@ package com.parkingcomestrue.common.domain.parking; -import com.parkingcomestrue.common.domain.parking.TimeInfo; +import static com.parkingcomestrue.common.domain.parking.TimeInfo.MAX_END_TIME; + import java.time.LocalTime; import java.util.stream.Stream; import org.assertj.core.api.Assertions; @@ -26,9 +27,9 @@ static Stream getTimeInfos() { 겹침 시간 : 00:00 ~ 24:00 -> 1440분 */ Arguments.of( - new TimeInfo(LocalTime.MIN, LocalTime.MAX), + new TimeInfo(LocalTime.MIN, MAX_END_TIME), LocalTime.MIN, - LocalTime.MAX, + MAX_END_TIME, 1440), /* 무료 운영 시간 : 00:00 ~ 24:00 @@ -36,7 +37,7 @@ static Stream getTimeInfos() { 겹침 시간 : 01:30 ~ 22:11 -> 1241분 */ Arguments.of( - new TimeInfo(LocalTime.MIN, LocalTime.MAX), + new TimeInfo(LocalTime.MIN, MAX_END_TIME), LocalTime.of(1, 30), LocalTime.of(22, 11), 1241), @@ -118,7 +119,7 @@ static Stream getTimeInfos() { Arguments.of( new TimeInfo(LocalTime.of(21, 0), LocalTime.of(9, 0)), LocalTime.of(21, 0), - LocalTime.MAX, + MAX_END_TIME, 180), /* 무료 운영 시간 : 21:00 ~ 09:00 diff --git a/domain/src/test/java/com/parkingcomestrue/common/infra/converter/TimeInfoConverterTest.java b/domain/src/test/java/com/parkingcomestrue/common/infra/converter/TimeInfoConverterTest.java new file mode 100644 index 00000000..6ec22b72 --- /dev/null +++ b/domain/src/test/java/com/parkingcomestrue/common/infra/converter/TimeInfoConverterTest.java @@ -0,0 +1,36 @@ +package com.parkingcomestrue.common.infra.converter; + +import com.parkingcomestrue.common.domain.parking.TimeInfo; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class TimeInfoConverterTest { + + private TimeInfoConverter converter = new TimeInfoConverter(); + + @Test + void TimeInfo에서_컬럼으로_변경() { + //given + TimeInfo allDay = TimeInfo.ALL_DAY; + String expected = "00:00~23:59"; + + //when + String actual = converter.convertToDatabaseColumn(allDay); + + //then + Assertions.assertThat(actual).isEqualTo(expected); + } + + @Test + void 컬럼에서_TimeInfo로_변경() { + //given + String column = "00:00~23:59"; + TimeInfo expected = TimeInfo.ALL_DAY; + + //when + TimeInfo actual = converter.convertToEntityAttribute(column); + + //then + Assertions.assertThat(actual).isEqualTo(expected); + } +}