diff --git a/src/main/java/com/fc/toy_project2/domain/itinerary/service/ItineraryService.java b/src/main/java/com/fc/toy_project2/domain/itinerary/service/ItineraryService.java index cad547c..92ad3ac 100644 --- a/src/main/java/com/fc/toy_project2/domain/itinerary/service/ItineraryService.java +++ b/src/main/java/com/fc/toy_project2/domain/itinerary/service/ItineraryService.java @@ -97,21 +97,22 @@ public List getPlaceByKeyword(String query) throws E /** * 숙박과 관련된 여정을 생성합니다. * - * @param itineraryAccommodationCreateDTO 숙박 여정 생성 요청 DTO + * @param accommodationCreateRequestDTO 숙박 여정 생성 요청 DTO * @return 생성된 숙박 여정 응답 DTO */ public AccommodationResponseDTO createAccommodation( - AccommodationCreateRequestDTO itineraryAccommodationCreateDTO) { - Trip trip = tripService.getTrip(itineraryAccommodationCreateDTO.getTripId()); + AccommodationCreateRequestDTO accommodationCreateRequestDTO) { + Trip trip = tripService.getTrip(accommodationCreateRequestDTO.getTripId()); LocalDateTime checkIn = DateTypeFormatterUtil.dateTimeFormatter( - itineraryAccommodationCreateDTO.getCheckIn()); + accommodationCreateRequestDTO.getCheckIn()); LocalDateTime checkOut = DateTypeFormatterUtil.dateTimeFormatter( - itineraryAccommodationCreateDTO.getCheckOut()); + accommodationCreateRequestDTO.getCheckOut()); checkAccommodationDate(trip, checkIn, checkOut); - return itineraryRepository.save(Itinerary.builder().trip(trip).type(0) // 숙박 여정 유형 - .accommodationName(itineraryAccommodationCreateDTO.getAccommodationName()) + return itineraryRepository.save(Itinerary.builder().trip(trip).type(0) + .itineraryName(accommodationCreateRequestDTO.getItineraryName()) + .accommodationName(accommodationCreateRequestDTO.getAccommodationName()) .accommodationRoadAddressName( - itineraryAccommodationCreateDTO.getAccommodationRoadAddressName()).checkIn(checkIn) + accommodationCreateRequestDTO.getAccommodationRoadAddressName()).checkIn(checkIn) .checkOut(checkOut).build()).toAccommodationResponseDTO(); } @@ -128,8 +129,9 @@ public TransportationResponseDTO createTransportation( transportationCreateRequestDTO.getDepartureTime()); LocalDateTime arrivalTime = DateTypeFormatterUtil.dateTimeFormatter( transportationCreateRequestDTO.getArrivalTime()); - checkTransportationVisitDate(trip, departureTime, arrivalTime); + checkTransportationDate(trip, departureTime, arrivalTime); return itineraryRepository.save(Itinerary.builder().trip(trip).type(1) + .itineraryName(transportationCreateRequestDTO.getItineraryName()) .transportation(transportationCreateRequestDTO.getTransportation()) .departurePlace(transportationCreateRequestDTO.getDeparturePlace()) .departurePlaceRoadAddressName( @@ -149,15 +151,16 @@ public TransportationResponseDTO createTransportation( */ public VisitResponseDTO createVisit(VisitCreateRequestDTO visitCreateRequestDTO) { Trip trip = tripService.getTrip(visitCreateRequestDTO.getTripId()); - LocalDateTime visitDepartureTime = DateTypeFormatterUtil.dateTimeFormatter( + LocalDateTime departureTime = DateTypeFormatterUtil.dateTimeFormatter( visitCreateRequestDTO.getDepartureTime()); - LocalDateTime visitArrivalTime = DateTypeFormatterUtil.dateTimeFormatter( + LocalDateTime arrivalTime = DateTypeFormatterUtil.dateTimeFormatter( visitCreateRequestDTO.getArrivalTime()); - checkTransportationVisitDate(trip, visitDepartureTime, visitArrivalTime); - return itineraryRepository.save( - Itinerary.builder().trip(trip).type(1).placeName(visitCreateRequestDTO.getPlaceName()) - .placeRoadAddressName(visitCreateRequestDTO.getPlaceRoadAddressName()) - .arrivalTime(visitArrivalTime).departureTime(visitDepartureTime).build()) + checkVisitDate(trip, departureTime, arrivalTime); + return itineraryRepository.save(Itinerary.builder().trip(trip).type(1) + .itineraryName(visitCreateRequestDTO.getItineraryName()) + .placeName(visitCreateRequestDTO.getPlaceName()) + .placeRoadAddressName(visitCreateRequestDTO.getPlaceRoadAddressName()) + .arrivalTime(arrivalTime).departureTime(departureTime).build()) .toVisitResponseDTO(); } @@ -169,7 +172,7 @@ public VisitResponseDTO createVisit(VisitCreateRequestDTO visitCreateRequestDTO) */ public List getItineraryByTripId(Long tripId) { List itineraryResponseList = new ArrayList<>(); - List itineraryList = itineraryRepository.findAllByTripId(tripId); + List itineraryList = tripService.getTrip(tripId).getItineraries(); for (Itinerary itinerary : itineraryList) { if (itinerary.getType() == 0) { itineraryResponseList.add( @@ -246,7 +249,7 @@ public TransportationResponseDTO updateTransportation( transportationUpdateRequestDTO.getDepartureTime()); LocalDateTime arrivalTime = DateTypeFormatterUtil.dateTimeFormatter( transportationUpdateRequestDTO.getArrivalTime()); - checkTransportationVisitDate(itinerary.getTrip(), departureTime, arrivalTime); + checkTransportationDate(itinerary.getTrip(), departureTime, arrivalTime); itinerary.updateTransportationInfo(transportationUpdateRequestDTO.getItineraryName(), transportationUpdateRequestDTO.getTransportation(), transportationUpdateRequestDTO.getDeparturePlace(), @@ -269,7 +272,7 @@ public VisitResponseDTO updateVisit(VisitUpdateRequestDTO visitUpdateRequestDTO) visitUpdateRequestDTO.getDepartureTime()); LocalDateTime arrivalTime = DateTypeFormatterUtil.dateTimeFormatter( visitUpdateRequestDTO.getArrivalTime()); - checkTransportationVisitDate(itinerary.getTrip(), departureTime, arrivalTime); + checkVisitDate(itinerary.getTrip(), departureTime, arrivalTime); itinerary.updateVisitInfo(visitUpdateRequestDTO.getItineraryName(), visitUpdateRequestDTO.getPlaceName(), visitUpdateRequestDTO.getPlaceRoadAddressName(), departureTime, arrivalTime); @@ -296,47 +299,79 @@ private Itinerary getItinerary(Long itineraryId) { } /** - * 체류 및 이동에 관한 날짜 유효성 검사 + * 숙박 여정의 날짜 유효성 검사 + * + * @param trip 여정이 속한 여행 + * @param checkIn 숙박 시작일 + * @param checkOut 숙박 종료일 + * @throws InvalidItineraryException 날짜 유효성 검사 실패 시 발생 + */ + private void checkAccommodationDate(Trip trip, LocalDateTime checkIn, LocalDateTime checkOut) { + LocalDateTime tripStartDateTime = trip.getStartDate().atStartOfDay(); + LocalDateTime tripEndDateTime = trip.getEndDate().atTime(LocalTime.MAX); + if (checkIn.isAfter(checkOut)) { + throw new InvalidItineraryException("체크인 시간은 체크아웃 시간보다 이른 시간이어야 합니다."); + } + if (checkIn.isBefore(tripStartDateTime)) { + throw new InvalidItineraryException("체크인 시간은 여행 시작일 이후여야 합니다."); + } + if (checkIn.isAfter(tripEndDateTime)) { + throw new InvalidItineraryException("체크인 시간은 여행 종료일보다 빠른 시간이어야 합니다."); + } + if (checkOut.isAfter(tripEndDateTime)) { + throw new InvalidItineraryException("체크아웃 시간은 여행 종료일보다 빠른 시간이어야 합니다."); + } + } + + /** + * 이동에 관한 날짜 유효성 검사 * * @param trip 여정이 속한 여행 * @param departureTime 출발 시간 * @param arrivalTime 도착 시간 * @throws InvalidItineraryException 날짜 유효성 검사 실패 시 발생 */ - private void checkTransportationVisitDate(Trip trip, LocalDateTime departureTime, + private void checkTransportationDate(Trip trip, LocalDateTime departureTime, LocalDateTime arrivalTime) { LocalDateTime tripStartDateTime = trip.getStartDate().atStartOfDay(); LocalDateTime tripEndDateTime = trip.getEndDate().atTime(LocalTime.MAX); if (departureTime.isAfter(arrivalTime)) { throw new InvalidItineraryException("출발 시간은 도착 시간보다 이른 시간이어야 합니다."); } + if(departureTime.isBefore(tripStartDateTime)){ + throw new InvalidItineraryException("출발 시간은 여행 시작일 이후여야 합니다."); + } if (departureTime.isAfter(tripEndDateTime)) { throw new InvalidItineraryException("출발 시간은 여행 종료일보다 빠른 시간이어야 합니다."); } - if (arrivalTime.isBefore(tripStartDateTime)) { - throw new InvalidItineraryException("도착 시간은 여행 시작일보다 빠른 시간이어야 합니다."); + if(arrivalTime.isAfter(tripEndDateTime)){ + throw new InvalidItineraryException("도착 시간은 여행 종료일보다 빠른 시간이어야 합니다."); } } /** - * 숙박 여정의 날짜 유효성 검사 + * 체류에 관한 날짜 유효성 검사 * - * @param trip 여정이 속한 여행 - * @param checkIn 숙박 시작일 - * @param checkOut 숙박 종료일 + * @param trip 여정이 속한 여행 + * @param departureTime 출발 시간 + * @param arrivalTime 도착 시간 * @throws InvalidItineraryException 날짜 유효성 검사 실패 시 발생 */ - private void checkAccommodationDate(Trip trip, LocalDateTime checkIn, LocalDateTime checkOut) { + private void checkVisitDate(Trip trip, LocalDateTime departureTime, + LocalDateTime arrivalTime) { LocalDateTime tripStartDateTime = trip.getStartDate().atStartOfDay(); LocalDateTime tripEndDateTime = trip.getEndDate().atTime(LocalTime.MAX); - if (checkIn.isAfter(checkOut)) { - throw new InvalidItineraryException("체크인 시간은 체크아웃 시간보다 이른 시간이어야 합니다."); + if (arrivalTime.isAfter(departureTime)) { + throw new InvalidItineraryException("도착 시간은 출발 시간보다 이른 시간이어야 합니다."); } - if (checkIn.isAfter(tripEndDateTime)) { - throw new InvalidItineraryException("체크인 시간은 여행 종료일보다 빠른 시간이어야 합니다."); + if (arrivalTime.isBefore(tripStartDateTime)) { + throw new InvalidItineraryException("도착 시간은 여행 시작일 이후여야 합니다."); + } + if(arrivalTime.isAfter(tripEndDateTime)){ + throw new InvalidItineraryException("도착 시간은 여행 종료일보다 빠른 시간이어야 합니다."); } - if (checkOut.isBefore(tripStartDateTime)) { - throw new InvalidItineraryException("체크아웃 시간은 여헹 시작일보다 빠른 시간이어야 합니다."); + if (departureTime.isAfter(tripEndDateTime)) { + throw new InvalidItineraryException("출발 시간은 여행 종료일보다 빠른 시간이어야 합니다."); } } } diff --git a/src/test/java/com/fc/toy_project2/itinerary/docs/ItineraryRestControllerDocsTest.java b/src/test/java/com/fc/toy_project2/itinerary/docs/ItineraryRestControllerDocsTest.java index ed1e0d0..190b4d2 100644 --- a/src/test/java/com/fc/toy_project2/itinerary/docs/ItineraryRestControllerDocsTest.java +++ b/src/test/java/com/fc/toy_project2/itinerary/docs/ItineraryRestControllerDocsTest.java @@ -176,10 +176,10 @@ void createVisit() throws Exception { // given VisitCreateRequestDTO request = VisitCreateRequestDTO.builder().tripId(1L) .itineraryName("제주여정3").placeName("카멜리아힐").placeRoadAddressName("제주 서귀포시 안덕면 병악로 166") - .departureTime("2023-10-26 14:00").arrivalTime("2023-10-26 16:00").build(); + .arrivalTime("2023-10-26 14:00").departureTime("2023-10-26 16:00").build(); VisitResponseDTO visitResponseDTO = VisitResponseDTO.builder().itineraryId(1L) .itineraryName("제주여정3").placeName("카멜리아힐").placeRoadAddressName("제주 서귀포시 안덕면 병악로 166") - .departureTime("2023-10-26 14:00").arrivalTime("2023-10-26 16:00").build(); + .arrivalTime("2023-10-26 14:00").departureTime("2023-10-26 16:00").build(); given(itineraryService.createVisit(any(VisitCreateRequestDTO.class))).willReturn( visitResponseDTO); @@ -222,8 +222,8 @@ void getItineraryByTripId() throws Exception { .departureTime("2023-10-26 12:00").arrivalTime("2023-10-26 13:00").build()); itinerarys.add( VisitResponseDTO.builder().itineraryId(3L).itineraryName("제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build()); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build()); given(itineraryService.getItineraryByTripId(any(Long.TYPE))).willReturn(itinerarys); @@ -364,12 +364,12 @@ void updateTransportation() throws Exception { void updateVisit() throws Exception { VisitUpdateRequestDTO request = VisitUpdateRequestDTO.builder().itineraryId(1L) .itineraryName("즐거운 제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build(); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build(); VisitResponseDTO visitResponseDTO = VisitResponseDTO.builder().itineraryId(1L) .itineraryName("즐거운 제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build(); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build(); given(itineraryService.updateVisit(any(VisitUpdateRequestDTO.class))).willReturn( visitResponseDTO); diff --git a/src/test/java/com/fc/toy_project2/itinerary/unit/controller/ItineraryRestControllerTest.java b/src/test/java/com/fc/toy_project2/itinerary/unit/controller/ItineraryRestControllerTest.java index 137c684..82af466 100644 --- a/src/test/java/com/fc/toy_project2/itinerary/unit/controller/ItineraryRestControllerTest.java +++ b/src/test/java/com/fc/toy_project2/itinerary/unit/controller/ItineraryRestControllerTest.java @@ -167,12 +167,12 @@ void _willSuccess() throws Exception { // given VisitCreateRequestDTO request = VisitCreateRequestDTO.builder().tripId(1L) .itineraryName("제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build(); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build(); VisitResponseDTO visitResponseDTO = VisitResponseDTO.builder().itineraryId(1L) .itineraryName("제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build(); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build(); given(itineraryService.createVisit(any(VisitCreateRequestDTO.class))).willReturn( visitResponseDTO); @@ -212,8 +212,8 @@ void _willSuccess() throws Exception { .departureTime("2023-10-26 12:00").arrivalTime("2023-10-26 13:00").build()); itinerarys.add( VisitResponseDTO.builder().itineraryId(3L).itineraryName("제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build()); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build()); given(itineraryService.getItineraryByTripId(any(Long.TYPE))).willReturn(itinerarys); @@ -312,12 +312,12 @@ class Context_updateVisit { void _willSuccess() throws Exception { VisitUpdateRequestDTO request = VisitUpdateRequestDTO.builder().itineraryId(1L) .itineraryName("즐거운 제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build(); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build(); VisitResponseDTO visitResponseDTO = VisitResponseDTO.builder().itineraryId(1L) .itineraryName("즐거운 제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build(); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build(); given(itineraryService.updateVisit(any(VisitUpdateRequestDTO.class))).willReturn( visitResponseDTO); diff --git a/src/test/java/com/fc/toy_project2/itinerary/unit/service/ItineraryServiceTest.java b/src/test/java/com/fc/toy_project2/itinerary/unit/service/ItineraryServiceTest.java index 256440b..54c9156 100644 --- a/src/test/java/com/fc/toy_project2/itinerary/unit/service/ItineraryServiceTest.java +++ b/src/test/java/com/fc/toy_project2/itinerary/unit/service/ItineraryServiceTest.java @@ -133,8 +133,8 @@ void _willSuccess() { // given VisitCreateRequestDTO visitCreateRequestDTO = VisitCreateRequestDTO.builder().tripId(1L) .itineraryName("제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build(); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build(); given(tripService.getTrip(any(Long.TYPE))).willReturn( Trip.builder().id(1L).name("제주도 여행").startDate(LocalDate.of(2023, 10, 25)) .endDate(LocalDate.of(2023, 10, 26)).isDomestic(true) @@ -142,15 +142,15 @@ void _willSuccess() { given(itineraryRepository.save(any(Itinerary.class))).willReturn( Itinerary.builder().id(3L).itineraryName("제주여정3").placeName("카멜리아힐") .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166") - .departureTime(LocalDateTime.of(2023, 10, 26, 14, 0)) - .arrivalTime(LocalDateTime.of(2023, 10, 26, 16, 0)).build()); + .arrivalTime(LocalDateTime.of(2023, 10, 26, 14, 0)) + .departureTime(LocalDateTime.of(2023, 10, 26, 16, 0)).build()); // when VisitResponseDTO result = itineraryService.createVisit(visitCreateRequestDTO); // then assertThat(result).extracting("itineraryName", "placeName", "placeRoadAddressName", - "departureTime", "arrivalTime") + "arrivalTime", "departureTime") .containsExactly("제주여정3", "카멜리아힐", "제주 서귀포시 안덕면 병악로 166", "2023-10-26 14:00", "2023-10-26 16:00"); verify(itineraryRepository, times(1)).save(any(Itinerary.class)); @@ -179,29 +179,15 @@ void _willSuccess() throws TripNotFoundException { Itinerary visit = Itinerary.builder().id(3L).type(2).itineraryName("제주여정2") .placeName("카멜리아힐").placeRoadAddressName("제주 서귀포시 안덕면 병악로 166") - .departureTime(LocalDateTime.of(2023, 10, 26, 14, 0)) - .arrivalTime(LocalDateTime.of(2023, 10, 26, 16, 0)).build(); + .arrivalTime(LocalDateTime.of(2023, 10, 26, 14, 0)) + .departureTime(LocalDateTime.of(2023, 10, 26, 16, 0)).build(); List itineraryList = new ArrayList<>(); itineraryList.add(accommodation); itineraryList.add(transportation); itineraryList.add(visit); - - List itinerarys = new ArrayList<>(); - itinerarys.add(AccommodationResponseDTO.builder().itineraryId(1L).itineraryName("제주여정1") - .accommodationName("제주신라호텔").accommodationRoadAddressName("제주 서귀포시 중문관광로72번길 75") - .checkIn("2023-10-25 15:00").checkOut("2023-10-26 11:00").build()); - itinerarys.add( - TransportationResponseDTO.builder().itineraryId(2L).itineraryName("제주여정2") - .transportation("카카오택시").departurePlace("제주신라호텔") - .departurePlaceRoadAddressName("제주 서귀포시 중문관광로72번길 75").destination("오설록 티 뮤지엄") - .destinationRoadAddressName("제주 서귀포시 안덕면 신화역사로 15 오설록") - .departureTime("2023-10-26 12:00").arrivalTime("2023-10-26 13:00").build()); - itinerarys.add( - VisitResponseDTO.builder().itineraryId(3L).itineraryName("제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build()); - given(itineraryRepository.findAllByTripId(any(Long.TYPE))).willReturn(itineraryList); + Trip trip = Trip.builder().itineraries(itineraryList).build(); + given(tripService.getTrip(any(Long.TYPE))).willReturn(trip); // when List itineraryResponseList = itineraryService.getItineraryByTripId(1L); @@ -292,13 +278,13 @@ void patchVisit_willSuccess() { // given VisitUpdateRequestDTO visitUpdateRequestDTO = VisitUpdateRequestDTO.builder() .itineraryId(1L).itineraryName("즐거운 제주여정3").placeName("카멜리아힐") - .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").departureTime("2023-10-26 14:00") - .arrivalTime("2023-10-26 16:00").build(); + .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166").arrivalTime("2023-10-26 14:00") + .departureTime("2023-10-26 16:00").build(); given(itineraryRepository.findById(any(Long.TYPE))).willReturn(Optional.of( Itinerary.builder().id(3L).itineraryName("제주여정3").placeName("카멜리아힐") .placeRoadAddressName("제주 서귀포시 안덕면 병악로 166") - .departureTime(LocalDateTime.of(2023, 10, 26, 14, 0)) - .arrivalTime(LocalDateTime.of(2023, 10, 26, 16, 0)).trip( + .arrivalTime(LocalDateTime.of(2023, 10, 26, 14, 0)) + .departureTime(LocalDateTime.of(2023, 10, 26, 16, 0)).trip( Trip.builder().id(1L).startDate(LocalDate.of(2023, 10, 25)) .endDate(LocalDate.of(2023, 10, 26)).build()).build())); @@ -307,7 +293,7 @@ void patchVisit_willSuccess() { // then assertThat(result).extracting("itineraryName", "placeName", "placeRoadAddressName", - "departureTime", "arrivalTime") + "arrivalTime", "departureTime") .containsExactly("즐거운 제주여정3", "카멜리아힐", "제주 서귀포시 안덕면 병악로 166", "2023-10-26 14:00", "2023-10-26 16:00"); }