Skip to content

Commit 68845ed

Browse files
committed
[fix] 요청한 날짜와 시간에 맞는 조석 정보 반환하도록 수정
1 parent 237da49 commit 68845ed

File tree

5 files changed

+39
-29
lines changed

5 files changed

+39
-29
lines changed

src/main/java/nambang_swag/bada_on/controller/GlobalExceptionHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public ResponseEntity<ErrorResponse> badaOnExceptionHandler(BadaOnException e) {
5252

5353
@ExceptionHandler(Exception.class)
5454
public ResponseEntity<ErrorResponse> exceptionHandler(Exception e) {
55-
log.error(e.toString());
55+
log.error("internal server error", e);
5656
ErrorResponse body = ErrorResponse.builder()
5757
.code("500")
5858
.message("Internal Server Error")

src/main/java/nambang_swag/bada_on/repository/TideRepository.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@ public interface TideRepository extends JpaRepository<TideRecord, Long> {
1616
Optional<TideRecord> findByDateAndTideObservatoryAndTidalTime(int date, TideObservatory tideObservatory,
1717
LocalDateTime time);
1818

19-
List<TideRecord> findAllByDateAndTideObservatory(int date, TideObservatory tideObservatory);
20-
21-
@Query("SELECT t FROM TideRecord t WHERE t.date IN :dates AND t.tideObservatory = :tideObservatory")
22-
List<TideRecord> findAllByDatesAndTideObservatory(@Param("dates") List<Integer> dates,
19+
@Query("SELECT t FROM TideRecord t WHERE t.date >= :first AND t.date <= :last AND t.tideObservatory = :tideObservatory")
20+
List<TideRecord> findAllByDatesAndTideObservatory(@Param("first") int first, @Param("last") int last,
2321
@Param("tideObservatory") TideObservatory tideObservatory);
2422
}

src/main/java/nambang_swag/bada_on/repository/WeatherRepository.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ public interface WeatherRepository extends JpaRepository<Weather, Integer> {
1414

1515
Optional<Weather> findByDateAndTimeAndPlace(int date, int time, Place place);
1616

17-
@Query("SELECT w FROM Weather w WHERE w.place.id = :placeId AND w.date >= :date")
18-
List<Weather> findWeatherByPlaceIdWithDateGreaterThan(@Param("placeId") Long placeId, @Param("date") int date);
19-
20-
@Query("SELECT w FROM Weather w WHERE w.date > :date OR (w.date = :date AND w.time >= :time) AND w.isUpdated = true")
17+
@Query("SELECT w FROM Weather w WHERE w.date >= :date AND w.isUpdated = true")
2118
List<Weather> getWeatherIsUpdated(@Param("date") int date, @Param("time") int time);
19+
2220
}

src/main/java/nambang_swag/bada_on/service/ExternalApiService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public void getUltraShortTermNowCast() {
105105
public void getTidalForecast() {
106106
log.info("조석예보 정보 수집 시작");
107107
LocalDateTime now = LocalDateTime.now();
108-
for (int i = 0; i < 3; i++) {
108+
for (int i = -1; i < 6; i++) {
109109
LocalDateTime time = now.plusDays(i);
110110
for (TideObservatory tideObservatory : TideObservatory.values()) {
111111
try {

src/main/java/nambang_swag/bada_on/service/WeatherService.java

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,12 @@ public WeatherSummary getWeatherSummary(Long id, int date, int hour) {
5050
Weather weather = weatherRepository.findByDateAndTimeAndPlace(date, hour * 100, place)
5151
.orElseThrow(WeatherNotFound::new);
5252

53-
List<Integer> relevantDates = calculateRelevantDates();
53+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
54+
LocalDateTime requestTime = toLocalDateTime(date, hour);
55+
int first = Integer.parseInt(requestTime.minusDays(1).format(formatter));
56+
int last = Integer.parseInt(requestTime.plusDays(1).format(formatter));
5457
TideObservatory tideObservatory = TideObservatory.findNearest(place.getLatitude(), place.getLongitude());
55-
List<TideRecord> tideRecords = tideRepository.findAllByDatesAndTideObservatory(relevantDates, tideObservatory);
58+
List<TideRecord> tideRecords = tideRepository.findAllByDatesAndTideObservatory(first, last, tideObservatory);
5659

5760
int tidePercentage = calculateTidePercentage(tideRecords);
5861
return WeatherSummary.of(
@@ -67,21 +70,31 @@ public WeatherDetail getWeatherDetail(Long placeId, int date, int hour) {
6770
Place place = placeRepository.findById(placeId).orElseThrow(PlaceNotFound::new);
6871
Weather weather = weatherRepository.findByDateAndTimeAndPlace(date, hour * 100, place)
6972
.orElseThrow(WeatherNotFound::new);
70-
71-
List<Integer> relevantDates = calculateRelevantDates();
73+
74+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
75+
LocalDateTime requestTime = toLocalDateTime(date, hour);
76+
int first = Integer.parseInt(requestTime.minusDays(1).format(formatter));
77+
int last = Integer.parseInt(requestTime.plusDays(1).format(formatter));
7278
TideObservatory tideObservatory = TideObservatory.findNearest(place.getLatitude(), place.getLongitude());
73-
List<TideRecord> tideRecords = tideRepository.findAllByDatesAndTideObservatory(relevantDates, tideObservatory);
79+
List<TideRecord> tideRecords = tideRepository.findAllByDatesAndTideObservatory(first, last, tideObservatory);
7480

75-
LocalDateTime now = LocalDateTime.now();
76-
TideInfo closestPreviousTideRecord = findClosestPreviousTideRecord(tideRecords, now);
77-
TideInfo closestNextTideRecord = findClosestNextTideRecord(tideRecords, now);
81+
TideInfo closestPreviousTideRecord = findClosestPreviousTideRecord(tideRecords, requestTime);
82+
TideInfo closestNextTideRecord = findClosestNextTideRecord(tideRecords, requestTime);
83+
84+
List<TideInfo> tideInfoList = new ArrayList<>();
85+
if (closestPreviousTideRecord != null) {
86+
tideInfoList.add(closestPreviousTideRecord);
87+
}
88+
if (closestNextTideRecord != null) {
89+
tideInfoList.add(closestNextTideRecord);
90+
}
7891

7992
getAllScores(weather, tideRecords);
8093
int tidePercentage = calculateTidePercentage(tideRecords);
8194
return WeatherDetail.of(
8295
weather,
8396
new ArrayList<>(),
84-
List.of(closestPreviousTideRecord, closestNextTideRecord),
97+
tideInfoList,
8598
getAllScores(weather, tideRecords),
8699
tidePercentage
87100
);
@@ -580,16 +593,6 @@ public List<AvailableTime> getAvailableTime(Integer date, Integer hour) {
580593
.toList();
581594
}
582595

583-
private List<Integer> calculateRelevantDates() {
584-
LocalDateTime now = LocalDateTime.now();
585-
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
586-
return List.of(
587-
Integer.parseInt(now.minusDays(1).format(formatter)), // 어제
588-
Integer.parseInt(now.format(formatter)), // 오늘
589-
Integer.parseInt(now.plusDays(1).format(formatter)) // 내일
590-
);
591-
}
592-
593596
private List<ActivityScore> getAllScores(Weather weather, List<TideRecord> tideRecords) {
594597
List<ActivityScore> scores = new ArrayList<>();
595598
scores.add(new ActivityScore(SNORKELING.getValue(), calculateSnorkelingScore(weather, tideRecords)));
@@ -616,5 +619,16 @@ private TideInfo findClosestNextTideRecord(List<TideRecord> tideRecords, LocalDa
616619
.map(record -> new TideInfo(record.getTidalLevel(), record.getTidalTime(), record.getCode()))
617620
.orElse(null); // Optional에서 직접 null 반환
618621
}
622+
623+
private LocalDateTime toLocalDateTime(int date, int hour) {
624+
String dateTimeString = "";
625+
if (hour == 0) {
626+
dateTimeString = String.format("%08d0000", date);
627+
} else {
628+
dateTimeString = String.format("%08d%02d", date, hour);
629+
}
630+
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmm");
631+
return LocalDateTime.parse(dateTimeString, formatter);
632+
}
619633
}
620634

0 commit comments

Comments
 (0)