diff --git a/src/main/java/site/campingon/campingon/camp/controller/CampSiteController.java b/src/main/java/site/campingon/campingon/camp/controller/CampSiteController.java index 737fa11..4b69316 100644 --- a/src/main/java/site/campingon/campingon/camp/controller/CampSiteController.java +++ b/src/main/java/site/campingon/campingon/camp/controller/CampSiteController.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import site.campingon.campingon.camp.dto.CampSiteListResponseDto; @@ -10,7 +11,7 @@ import site.campingon.campingon.camp.service.CampSiteReserveService; import site.campingon.campingon.camp.service.CampSiteService; -import java.time.LocalDateTime; +import java.time.LocalDate; import java.util.List; @@ -27,11 +28,11 @@ public class CampSiteController { @GetMapping("/{campId}/available") public ResponseEntity> getAvailableCampSites(@PathVariable("campId") Long campId, @RequestParam(value = "checkin") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") - LocalDateTime checkin, + @DateTimeFormat(pattern = "yyyy-MM-dd") + LocalDate checkin, @RequestParam(value = "checkout") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") - LocalDateTime checkout) { + @DateTimeFormat(pattern = "yyyy-MM-dd") + LocalDate checkout) { return ResponseEntity.ok(campSiteReserveService.getAvailableCampSites(campId, checkin, checkout)); } @@ -41,11 +42,11 @@ public ResponseEntity> getAvailableCampSites(@Path public ResponseEntity getCampSite(@PathVariable("campId") Long campId, @PathVariable("siteId") Long siteId, @RequestParam(value = "checkin") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") - LocalDateTime checkin, + @DateTimeFormat(pattern = "yyyy-MM-dd") + LocalDate checkin, @RequestParam(value = "checkout") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") - LocalDateTime checkout) { + @DateTimeFormat(pattern = "yyyy-MM-dd") + LocalDate checkout) { return ResponseEntity.ok(campSiteService.getCampSite(campId, siteId, checkin, checkout)); } diff --git a/src/main/java/site/campingon/campingon/camp/dto/CampSiteListResponseDto.java b/src/main/java/site/campingon/campingon/camp/dto/CampSiteListResponseDto.java index 360cf03..7ee4ddc 100644 --- a/src/main/java/site/campingon/campingon/camp/dto/CampSiteListResponseDto.java +++ b/src/main/java/site/campingon/campingon/camp/dto/CampSiteListResponseDto.java @@ -1,11 +1,10 @@ package site.campingon.campingon.camp.dto; - import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; import site.campingon.campingon.camp.entity.Induty; -import java.time.LocalDateTime; +import java.time.LocalTime; @ToString @Getter @@ -18,9 +17,12 @@ public class CampSiteListResponseDto { private Integer price; private Induty siteType; private String indoorFacility; + + @Builder.Default @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") - private LocalDateTime checkinTime; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") - private LocalDateTime checkoutTime; + private LocalTime checkinTime = LocalTime.of(15, 0); + @Builder.Default + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") + private LocalTime checkoutTime = LocalTime.of(11, 0); } \ No newline at end of file diff --git a/src/main/java/site/campingon/campingon/camp/dto/CampSiteResponseDto.java b/src/main/java/site/campingon/campingon/camp/dto/CampSiteResponseDto.java index 4b121cd..aa62898 100644 --- a/src/main/java/site/campingon/campingon/camp/dto/CampSiteResponseDto.java +++ b/src/main/java/site/campingon/campingon/camp/dto/CampSiteResponseDto.java @@ -4,11 +4,11 @@ import lombok.*; import site.campingon.campingon.camp.entity.Induty; +import java.time.LocalTime; import java.time.LocalDateTime; @ToString @Getter -@NoArgsConstructor @AllArgsConstructor @Builder public class CampSiteResponseDto { @@ -17,10 +17,15 @@ public class CampSiteResponseDto { private Integer price; private Induty siteType; private String indoorFacility; + + @Builder.Default @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") - private LocalDateTime checkinTime; + private LocalTime checkinTime = LocalTime.of(15, 0); + + @Builder.Default @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm") - private LocalDateTime checkoutTime; + private LocalTime checkoutTime = LocalTime.of(11, 0); CampSimpleDto campSimpleDto; + } \ No newline at end of file diff --git a/src/main/java/site/campingon/campingon/camp/service/CampSiteReserveService.java b/src/main/java/site/campingon/campingon/camp/service/CampSiteReserveService.java index 93391ee..eb82604 100644 --- a/src/main/java/site/campingon/campingon/camp/service/CampSiteReserveService.java +++ b/src/main/java/site/campingon/campingon/camp/service/CampSiteReserveService.java @@ -13,6 +13,7 @@ import site.campingon.campingon.common.exception.GlobalException; import java.time.LocalDateTime; +import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; @@ -28,12 +29,16 @@ public class CampSiteReserveService { // 캠핑장의 예약 가능한 SiteType 별 캠핑지 조회 @Transactional(readOnly = true) - public List getAvailableCampSites(Long campId, LocalDateTime checkin, LocalDateTime checkout) { + public List getAvailableCampSites(Long campId, LocalDate checkinDate, LocalDate checkoutDate) { - if (checkin == null || checkout == null) { + if (checkinDate == null || checkoutDate == null) { throw new GlobalException(ErrorCode.REQUIRED_RESERVATION_DATE); } + // LocalDate(JSON) -> LocalDateTime(DB) + LocalDateTime checkin = checkinDate.atTime(15, 0); + LocalDateTime checkout = checkoutDate.atTime(11, 0); + campRepository.findById(campId) .orElseThrow(() -> new GlobalException(ErrorCode.CAMP_NOT_FOUND_BY_ID)); diff --git a/src/main/java/site/campingon/campingon/camp/service/CampSiteService.java b/src/main/java/site/campingon/campingon/camp/service/CampSiteService.java index 81cee72..319bd35 100644 --- a/src/main/java/site/campingon/campingon/camp/service/CampSiteService.java +++ b/src/main/java/site/campingon/campingon/camp/service/CampSiteService.java @@ -15,7 +15,7 @@ import site.campingon.campingon.common.exception.ErrorCode; import site.campingon.campingon.common.exception.GlobalException; -import java.time.LocalDateTime; +import java.time.LocalDate; import java.util.List; @Service @@ -84,7 +84,7 @@ public CampSiteResponseDto getCampSite(Long campId, Long siteId) { // 예약가능한 특정 캠핑지 조회 @Transactional(readOnly = true) - public CampSiteResponseDto getCampSite(Long campId, Long siteId, LocalDateTime checkin, LocalDateTime checkout) { + public CampSiteResponseDto getCampSite(Long campId, Long siteId, LocalDate checkin, LocalDate checkout) { if (checkin == null || checkout == null) { throw new GlobalException(ErrorCode.REQUIRED_RESERVATION_DATE); diff --git a/src/main/java/site/campingon/campingon/reservation/dto/ReservationCreateRequestDto.java b/src/main/java/site/campingon/campingon/reservation/dto/ReservationCreateRequestDto.java index 54ee53c..5c09c10 100644 --- a/src/main/java/site/campingon/campingon/reservation/dto/ReservationCreateRequestDto.java +++ b/src/main/java/site/campingon/campingon/reservation/dto/ReservationCreateRequestDto.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; +import java.time.LocalDate; import java.time.LocalDateTime; @Getter @@ -15,11 +16,9 @@ public class ReservationCreateRequestDto { private Long campSiteId; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") - private LocalDateTime checkin; + private LocalDate checkin; - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul") - private LocalDateTime checkout; + private LocalDate checkout; private int guestCnt; diff --git a/src/main/java/site/campingon/campingon/reservation/dto/ReservationResponseDto.java b/src/main/java/site/campingon/campingon/reservation/dto/ReservationResponseDto.java index 1a7d37a..b79860e 100644 --- a/src/main/java/site/campingon/campingon/reservation/dto/ReservationResponseDto.java +++ b/src/main/java/site/campingon/campingon/reservation/dto/ReservationResponseDto.java @@ -1,5 +1,6 @@ package site.campingon.campingon.reservation.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.*; import site.campingon.campingon.reservation.entity.ReservationStatus; @@ -14,8 +15,10 @@ public class ReservationResponseDto { private Long id; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime checkin; + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime checkout; private int guestCnt; diff --git a/src/main/java/site/campingon/campingon/reservation/entity/Reservation.java b/src/main/java/site/campingon/campingon/reservation/entity/Reservation.java index 8d94a87..6322731 100644 --- a/src/main/java/site/campingon/campingon/reservation/entity/Reservation.java +++ b/src/main/java/site/campingon/campingon/reservation/entity/Reservation.java @@ -8,7 +8,9 @@ import site.campingon.campingon.review.entity.Review; import site.campingon.campingon.user.entity.User; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; @Entity @@ -62,9 +64,20 @@ public void cancel(String reason) { this.cancelReason = reason; } - public void setDefaultCheckTime(LocalDateTime checkinDate, LocalDateTime checkoutDate) { - this.checkin = checkinDate.withHour(15).truncatedTo(ChronoUnit.HOURS); - this.checkout = checkoutDate.withHour(11).truncatedTo(ChronoUnit.HOURS); + // 체크인 체크아웃 시간 고정 설정 + public void setDefaultCheckTime(LocalDateTime checkin, LocalDateTime checkout) { + this.checkin = checkin.withHour(15).truncatedTo(ChronoUnit.HOURS); + this.checkout = checkout.withHour(11).truncatedTo(ChronoUnit.HOURS); + } + + + // json 반환 시 파싱해서 반환 + public String[] parseDateTime(LocalDateTime checkin, LocalDateTime checkout) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + return new String[] { + checkin.format(formatter), + checkout.format(formatter) + }; } } diff --git a/src/main/java/site/campingon/campingon/reservation/service/ReservationServiceImpl.java b/src/main/java/site/campingon/campingon/reservation/service/ReservationServiceImpl.java index cf3a61a..b676144 100644 --- a/src/main/java/site/campingon/campingon/reservation/service/ReservationServiceImpl.java +++ b/src/main/java/site/campingon/campingon/reservation/service/ReservationServiceImpl.java @@ -16,6 +16,8 @@ import site.campingon.campingon.reservation.utils.ReservationValidate; import site.campingon.campingon.user.entity.User; +import java.time.LocalDateTime; + @Service @RequiredArgsConstructor public class ReservationServiceImpl implements ReservationService { @@ -67,16 +69,20 @@ public void createReservation(Long userId, ReservationCreateRequestDto requestDt Camp camp = reservationValidate.validateCampById(requestDto.getCampId()); + // LocalDate(JSON) -> LocalDateTime(DB) + LocalDateTime checkin = requestDto.getCheckin().atTime(15, 0); + LocalDateTime checkout = requestDto.getCheckout().atTime(11, 0); + Reservation reservation = reservationMapper.toEntity(requestDto) .toBuilder() .user(user) .camp(camp) .campSite(campSite) + .checkin(checkin) + .checkout(checkout) .status(ReservationStatus.RESERVED) .build(); - reservation.setDefaultCheckTime(requestDto.getCheckin(), requestDto.getCheckout()); - reservationRepository.save(reservation); }