diff --git a/docker-compose.yml b/docker-compose.yml index c2bac52..643a6cd 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,20 +10,20 @@ services: networks: - db_network -/*# spring-boot: -# container_name: server-haemil -# build: -# context: . -# dockerfile: Dockerfile-dev -# restart: always -# environment: -# - TZ=Asia/Seoul -# ports: -# - "8080:8080" -# depends_on: -# - redis -# networks: -# - db_network*/ + spring-boot: + container_name: server-haemil + build: + context: . + dockerfile: Dockerfile-dev + restart: always + environment: + - TZ=Asia/Seoul + ports: + - "8080:8080" + depends_on: + - redis + networks: + - db_network networks: db_network: diff --git a/src/main/java/com/haemil/backend/alert/controller/AlertController.java b/src/main/java/com/haemil/backend/alert/controller/AlertController.java index c1c8597..325eebc 100644 --- a/src/main/java/com/haemil/backend/alert/controller/AlertController.java +++ b/src/main/java/com/haemil/backend/alert/controller/AlertController.java @@ -11,6 +11,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import java.util.List; @Slf4j @@ -23,12 +24,12 @@ public class AlertController { private final GetApiDto getApiDto; @PostMapping("/send") - public ResponseEntity sendGetRequest(@RequestBody ReqCoordDto reqCoordDto) { + public ResponseEntity sendGetRequest(HttpServletRequest request) { try { String jsonString = alertService.getAlertInfo(getApiDto); alertService.isJson(jsonString); - List alertApiList = alertService.ParsingJson(jsonString, reqCoordDto); + List alertApiList = alertService.ParsingJson(jsonString, request); return new BaseResponse<>(alertApiList).convert(); } catch (BaseException e){ // 실패시 custom한 status로 code 헤더 설정, body로 메세지 반환 diff --git a/src/main/java/com/haemil/backend/alert/service/AlertService.java b/src/main/java/com/haemil/backend/alert/service/AlertService.java index c1ddf32..d823a47 100644 --- a/src/main/java/com/haemil/backend/alert/service/AlertService.java +++ b/src/main/java/com/haemil/backend/alert/service/AlertService.java @@ -17,6 +17,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; @@ -77,9 +78,9 @@ public String getAlertInfo(GetApiDto reqGetApiDto) throws BaseException { // 임시 private final LocationService locationService; - public List ParsingJson(String responseBody, ReqCoordDto reqCoordDto) throws BaseException { + public List ParsingJson(String responseBody, HttpServletRequest request) throws BaseException { try { - String fullLocationJsonString = locationService.getLocationInfo(reqCoordDto); + String fullLocationJsonString = locationService.getLocationInfo(request); String userLocation = ParsingLocation(fullLocationJsonString); List alertApiList = new ArrayList<>(); diff --git a/src/main/java/com/haemil/backend/global/config/SpringConfig.java b/src/main/java/com/haemil/backend/global/config/SpringConfig.java index e8b3d0d..a613841 100644 --- a/src/main/java/com/haemil/backend/global/config/SpringConfig.java +++ b/src/main/java/com/haemil/backend/global/config/SpringConfig.java @@ -17,4 +17,4 @@ public ScheduleService scheduleService(){ } -} +} \ No newline at end of file diff --git a/src/main/java/com/haemil/backend/map/service/MapService.java b/src/main/java/com/haemil/backend/map/service/MapService.java index d8ac10a..8f8d4ba 100644 --- a/src/main/java/com/haemil/backend/map/service/MapService.java +++ b/src/main/java/com/haemil/backend/map/service/MapService.java @@ -30,13 +30,13 @@ public String getMapUrl(String reqLocation) throws BaseException { String address = reqLocation; String addr = URLEncoder.encode(address, "UTF-8"); - log.debug("address = {}", address); +// log.debug("address = {}", address); // Geocoding 개요에 나와있는 API URL 입력. String apiURL = "https://dapi.kakao.com/v2/local/search/keyword.json?page=1&size=1&sort=accuracy&query="+addr; URL url = new URL(apiURL); - log.debug("url = {}", url); +// log.debug("url = {}", url); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); diff --git a/src/main/java/com/haemil/backend/prepare/controller/PrepareController.java b/src/main/java/com/haemil/backend/prepare/controller/PrepareController.java index 5c5298f..97f26af 100644 --- a/src/main/java/com/haemil/backend/prepare/controller/PrepareController.java +++ b/src/main/java/com/haemil/backend/prepare/controller/PrepareController.java @@ -5,7 +5,7 @@ import com.haemil.backend.global.config.BaseException; import com.haemil.backend.global.config.BaseResponse; import com.haemil.backend.global.config.ResponseStatus; -import com.haemil.backend.prepare.dto.PrepareDto; +import com.haemil.backend.prepare.dto.*; import com.haemil.backend.prepare.service.PrepareService; import com.haemil.backend.weather.controller.AirController; import com.haemil.backend.weather.controller.LivingController; @@ -19,9 +19,11 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.servlet.http.HttpServletRequest; import java.util.ArrayList; import java.util.List; +import java.util.Map; @Slf4j @RestController @@ -32,46 +34,77 @@ public class PrepareController { private final WeatherController weatherController; private final LivingController livingController; private final AirController airController; - private final ObjectMapper objectMapper; // ObjectMapper 주입 - @GetMapping("/send") - public ResponseEntity sendGetRequest() { - try { - // Call /weather/send to get weather data - ResponseEntity weatherResponse = weatherController.sendGetRequest(); - List todayTemps = weatherController.currentTimeData; + private PrepareDto fetchDataAndProcess(HttpServletRequest request) throws BaseException { + String latitude = request.getParameter("latitude"); + String longitude = request.getParameter("longitude"); - // Call /air/send to get air data - ResponseEntity airResponse = airController.sendGetRequest(); - List todayAirs = airController.infoList; + ResponseEntity weatherResponse = weatherController.sendGetRequest(request); - ResponseEntity livingResponse = livingController.sendGetRequest(); - List todayLivings = livingController.infoList; + List todayTemps = weatherController.currentTimeData; + Map temps = weatherController.transformedData; // 최고 최저 온도 - List temps = weatherController.tmnAndTmxData; -// log.info("minmax = {}", temps.get(0)); + ResponseEntity airResponse = airController.sendGetRequest(request); + List todayAirs = airController.infoList; - PrepareDto prepareDto = new PrepareDto(todayTemps, todayAirs, temps, todayLivings); - prepareService.filterWeatherData(todayTemps, prepareDto); -// log.info("tmp = {}", prepareDto.getTmp()); + ResponseEntity livingResponse = livingController.sendGetRequest(request); + List todayLivings = livingController.infoList; - prepareService.filterAirData(todayAirs, prepareDto); + PrepareDto prepareDto = new PrepareDto(todayTemps, todayAirs, temps, todayLivings); + prepareService.filterWeatherData(todayTemps, prepareDto); + prepareService.filterAirData(todayAirs, prepareDto); + + return prepareDto; + } + + @GetMapping("/send") + public ResponseEntity sendGetRequest(HttpServletRequest request) { + try { + PrepareDto prepareDto = fetchDataAndProcess(request); List prepareDtoList = new ArrayList<>(); prepareDtoList.add(prepareDto); - String resultString = prepareService.ParsingJson(prepareDtoList); - log.info("prePare_result = {}", resultString); + List resultString = prepareService.ParsingJson(prepareDtoList); +// log.info("prePare_result = {}", resultString); // 외출 적합도 결과 log + + return new BaseResponse<>(resultString).convert(); + } catch(BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + } + } + + @GetMapping("/weather") + public ResponseEntity sendWeatherInfo(HttpServletRequest request) { + try { + PrepareDto prepareDto = fetchDataAndProcess(request); + + List prepareDtoList = new ArrayList<>(); + prepareDtoList.add(prepareDto); - Object jsonResult = objectMapper.readValue(resultString, Object.class); - String prettyJsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonResult); + List resultString = prepareService.ParsingWeather(prepareDtoList); +// log.info("prePare_weather_result = {}", resultString); // 외출 - 날씨 관련 정보 - return new BaseResponse<>(prettyJsonString).convert(); + return new BaseResponse<>(resultString).convert(); } catch(BaseException e) { return new BaseResponse<>(e.getStatus()).convert(); - } catch (JsonProcessingException e) { - return new BaseResponse<>(ResponseStatus.CANNOT_CONVERT_JSON).convert(); } } -} + @GetMapping("/need") + public ResponseEntity sendNeedInfo(HttpServletRequest request) { + try { + PrepareDto prepareDto = fetchDataAndProcess(request); + + List prepareDtoList = new ArrayList<>(); + prepareDtoList.add(prepareDto); + + List resultString = prepareService.ParsingNeed(prepareDtoList); +// log.info("prePare_need_result = {}", resultString); // 외출 물품 정보 + + return new BaseResponse<>(resultString).convert(); + } catch(BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + } + } +} diff --git a/src/main/java/com/haemil/backend/prepare/dto/PrePareInfoDto.java b/src/main/java/com/haemil/backend/prepare/dto/PrePareInfoDto.java index fb3dc16..960a5bf 100644 --- a/src/main/java/com/haemil/backend/prepare/dto/PrePareInfoDto.java +++ b/src/main/java/com/haemil/backend/prepare/dto/PrePareInfoDto.java @@ -3,10 +3,10 @@ @Data public class PrePareInfoDto { - private String mask; // 미세먼지 농도 값에 따른 마스크 착용 -> 옵션 ) 자율, 권고, 필수 + private String pm10value; // 가장 최근꺼로 오늘꺼 미세먼지 수치 private String clothes; // 기온별 옷차림 -> 옵션 ) ex. "민소매, 반팔, 반바지, 원피스" - private boolean umbrella; // 강수량에 따른 우선 여부 private String feel_like; // 체감 온도 + private String uv; // 자외선 + private String result; // 외출 적합도 문장 -> 옵션 ) ex. "외출하기 좋은 날이네요" private int percent; // 외출 적합도 퍼센트 - private String result; // 외출 적합도 문장 -> 옵션 ) ex. "외출하기 좋은 날이네요"ㅇ } diff --git a/src/main/java/com/haemil/backend/prepare/dto/PrepareDto.java b/src/main/java/com/haemil/backend/prepare/dto/PrepareDto.java index 0df59d6..e6bc74e 100644 --- a/src/main/java/com/haemil/backend/prepare/dto/PrepareDto.java +++ b/src/main/java/com/haemil/backend/prepare/dto/PrepareDto.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Component; import java.util.List; +import java.util.Map; @Data @Component @@ -26,25 +27,28 @@ public class PrepareDto { private String pcp; // 1시간 강수량 private String reh; // 습도 private String sky; // 하늘 상태 + private String wsd; // 풍속(m/s) // 대기질 private String pm10grade; // 가장 최근꺼로 오늘꺼 미세먼지 등급 + private String pm10value; // 가장 최근꺼로 오늘꺼 미세먼지 수치 private String pm25grade; // 가장 최근꺼로 오늘꺼 초미세먼지 등급 + private String pm25value; // 가장 최근꺼로 오늘꺼 미세먼지 수치 // living private String feelLike; // 체감 온도 private String uv; // 자외선 - // 기본 생성자 public PrepareDto() { } - // 필요한 데이터를 주입받는 생성자 - public PrepareDto(List todayTemps, List todayAirs, List temps, List livings) { + public PrepareDto(List todayTemps, List todayAirs, Map temps, List livings) { this.todayTemps = todayTemps; this.todayAirs = todayAirs; - this.maxTemp = temps.get(1); - this.minTemp = temps.get(0); + String maxTemp = temps.get("max"); + String minTemp = temps.get("min"); + this.maxTemp = maxTemp; + this.minTemp = minTemp; if (!livings.isEmpty()) { this.feelLike = livings.get(0).getFeels_like(); diff --git a/src/main/java/com/haemil/backend/prepare/dto/PrepareNeedInfoDto.java b/src/main/java/com/haemil/backend/prepare/dto/PrepareNeedInfoDto.java new file mode 100644 index 0000000..bffd642 --- /dev/null +++ b/src/main/java/com/haemil/backend/prepare/dto/PrepareNeedInfoDto.java @@ -0,0 +1,11 @@ +package com.haemil.backend.prepare.dto; +import lombok.Data; +import org.springframework.stereotype.Component; + +@Data +@Component +public class PrepareNeedInfoDto { + private String mask; // 미세먼지 농도 값에 따른 마스크 착용 -> 옵션 ) 자율, 권고, 필수 + private String umbrella; // 강수량에 따른 우선 여부 + private String clothes; // 기온별 옷차림 -> 옵션 ) ex. "민소매, 반팔, 반바지, 원피스" +} diff --git a/src/main/java/com/haemil/backend/prepare/dto/PrepareWeatherDto.java b/src/main/java/com/haemil/backend/prepare/dto/PrepareWeatherDto.java new file mode 100644 index 0000000..3db79d4 --- /dev/null +++ b/src/main/java/com/haemil/backend/prepare/dto/PrepareWeatherDto.java @@ -0,0 +1,17 @@ +package com.haemil.backend.prepare.dto; + +import lombok.Data; +import org.springframework.stereotype.Component; + +@Data +@Component +public class PrepareWeatherDto { + private String pm10value; // 가장 최근꺼로 오늘꺼 미세먼지 수치 + private String pm25value; // 가장 최근꺼로 오늘꺼 미세먼지 수치 + + private String pop; // 강수 확률 + private String pcp; // 1시간 강수량 + + private String wsd; // 풍속(m/s) + private String uv; // 자외선 +} diff --git a/src/main/java/com/haemil/backend/prepare/service/PrepareService.java b/src/main/java/com/haemil/backend/prepare/service/PrepareService.java index 26749b3..1cf3205 100644 --- a/src/main/java/com/haemil/backend/prepare/service/PrepareService.java +++ b/src/main/java/com/haemil/backend/prepare/service/PrepareService.java @@ -6,6 +6,8 @@ import com.haemil.backend.global.config.ResponseStatus; import com.haemil.backend.prepare.dto.PrePareInfoDto; import com.haemil.backend.prepare.dto.PrepareDto; +import com.haemil.backend.prepare.dto.PrepareNeedInfoDto; +import com.haemil.backend.prepare.dto.PrepareWeatherDto; import com.haemil.backend.weather.dto.AirInfoDto; import com.haemil.backend.weather.dto.WeatherInfoDto; import lombok.RequiredArgsConstructor; @@ -39,6 +41,8 @@ public void filterWeatherData(List weatherInfoDtoList, PrepareDt prepareDto.setReh(weatherInfoDto.getFcstValue()); } else if (category.equals("SKY")) { prepareDto.setSky(weatherInfoDto.getFcstValue()); + } else if (category.equals("WSD")) { + prepareDto.setWsd(weatherInfoDto.getFcstValue()); } } } @@ -47,31 +51,71 @@ public void filterAirData(List airInfoDto, PrepareDto prepareDto) { AirInfoDto resultDto = airInfoDto.get(0); prepareDto.setPm10grade(resultDto.getPm10Grade()); prepareDto.setPm25grade(resultDto.getPm25Grade()); + prepareDto.setPm10value(resultDto.getPm10Value()); + prepareDto.setPm25value(resultDto.getPm25Value()); } - public String ParsingJson(List prepareDtoList) throws BaseException { + public List ParsingJson(List prepareDtoList) throws BaseException { List prePareInfoDtoList = new ArrayList<>(); - try { - for (PrepareDto prepareDto : prepareDtoList) { - PrePareInfoDto prePareInfoDto = new PrePareInfoDto(); - // PrepareDto의 필드 값을 PrePareInfoDto에 설정 - prePareInfoDto.setMask(getMaskValue(prepareDto.getPm10grade(), prepareDto.getPm25grade())); - prePareInfoDto.setClothes(getClothesValue(prepareDto.getMaxTemp(), prepareDto.getMinTemp(), prepareDto.getTmp())); - prePareInfoDto.setUmbrella(needUmbrella(prepareDto.getPop(), prepareDto.getPty())); - prePareInfoDto.setFeel_like(prepareDto.getFeelLike()); - int percent = getPercentValue(prepareDto); - prePareInfoDto.setPercent(percent); - - String result = getResultValue(percent); - prePareInfoDto.setResult(result); - - prePareInfoDtoList.add(prePareInfoDto); - } - return convertObjectToJson(prePareInfoDtoList); - } catch (JsonProcessingException e) { - throw new BaseException(ResponseStatus.CANNOT_CONVERT_JSON); + for (PrepareDto prepareDto : prepareDtoList) { + PrePareInfoDto prePareInfoDto = new PrePareInfoDto(); + + prePareInfoDto.setPm10value(prepareDto.getPm10value()); +// log.info("pm10value = {}", prepareDto.getPm10value()); + + prePareInfoDto.setClothes(getClothesValue(prepareDto.getMaxTemp(), prepareDto.getMinTemp(), prepareDto.getTmp())); +// log.info("clothes = {}", getClothesValue(prepareDto.getMaxTemp(), prepareDto.getMinTemp(), prepareDto.getTmp())); + + prePareInfoDto.setFeel_like(prepareDto.getFeelLike()); +// log.info("feellike = {}", prepareDto.getFeelLike()); + prePareInfoDto.setUv(getUvStatus(prepareDto)); +// log.info("uv = {}", getUvStatus(prepareDto)); + + int percent = getPercentValue(prepareDto); + prePareInfoDto.setPercent(percent); +// log.info("percent = {}", percent); + + String result = getResultValue(percent); + prePareInfoDto.setResult(result); +// log.info("result = {}", result); + + prePareInfoDtoList.add(prePareInfoDto); + } + return prePareInfoDtoList; + } + + public List ParsingNeed(List prepareDtoList) throws BaseException { + List prePareInfoDtoList = new ArrayList<>(); + + for (PrepareDto prepareDto : prepareDtoList) { + PrepareNeedInfoDto prePareInfoDto = new PrepareNeedInfoDto(); + + prePareInfoDto.setMask(getMaskValue(prepareDto.getPm10grade(), prepareDto.getPm25grade())); + prePareInfoDto.setUmbrella(needUmbrella(prepareDto.getPop(), prepareDto.getPty())); + prePareInfoDto.setClothes(getClothesValue(prepareDto.getMaxTemp(), prepareDto.getMinTemp(), prepareDto.getTmp())); + + prePareInfoDtoList.add(prePareInfoDto); + } + + return prePareInfoDtoList; + } + + public List ParsingWeather(List prepareDtoList) throws BaseException { + List prePareInfoDtoList = new ArrayList<>(); + + for (PrepareDto prepareDto : prepareDtoList) { + PrepareWeatherDto prePareInfoDto = new PrepareWeatherDto(); + prePareInfoDto.setPm10value(prepareDto.getPm10value()); + prePareInfoDto.setPm25value(prepareDto.getPm25value()); + prePareInfoDto.setPop(prepareDto.getPop()); + prePareInfoDto.setWsd(prepareDto.getWsd()); + prePareInfoDto.setPcp(prepareDto.getPcp()); + prePareInfoDto.setUv(prepareDto.getUv()); + + prePareInfoDtoList.add(prePareInfoDto); } + return prePareInfoDtoList; } private String convertObjectToJson(Object object) throws JsonProcessingException { @@ -81,10 +125,22 @@ private String convertObjectToJson(Object object) throws JsonProcessingException // 마스크 착용 여부를 판단하는 메서드 private String getMaskValue(String pm10grade, String pm25grade) { - // 미세먼지 + 초미세먼지 의 평균으로 비교 - int pm10gradeInt = Integer.parseInt(pm10grade); - int pm25gradeInt = Integer.parseInt(pm25grade); - double result = (pm10gradeInt + pm25gradeInt) / 2; + double result = 0.0; + + if (pm10grade != "null" && pm25grade != "null") { + // 미세먼지 + 초미세먼지 의 평균으로 비교 + int pm10gradeInt = Integer.parseInt(pm10grade); + int pm25gradeInt = Integer.parseInt(pm25grade); + result = (pm10gradeInt + pm25gradeInt) / 2; + } + else if (pm10grade == "null" && pm25grade != "null") { + int pm25gradeInt = Integer.parseInt(pm25grade); + result = pm25gradeInt; + } + else if (pm25grade == "null" && pm10grade != "null") { + int pm10gradeInt = Integer.parseInt(pm10grade); + result = pm10gradeInt; + } if (result < 2) return "자율"; @@ -94,6 +150,22 @@ else if (result < 3) return "필수"; } + private String getUvStatus(PrepareDto prepareDto) { + int uvIndex = Integer.parseInt(prepareDto.getUv()); // 자외선 지수 + + if (uvIndex <= 2) { + return "아주 좋음"; + } else if (uvIndex >= 3 && uvIndex <= 5) { + return "좋음"; + } else if (uvIndex >= 6 && uvIndex <= 7) { + return "보통"; + } else if (uvIndex >= 8 && uvIndex <= 10) { + return "나쁨"; + } else { + return "아주 나쁨"; + } + } + // 기온에 따른 옷차림을 판단하는 메서드 //평균온도로 private String getClothesValue(String maxTemp, String minTemp, String temp) { @@ -122,12 +194,12 @@ private String getClothesValue(String maxTemp, String minTemp, String temp) { } // 강수 확률과 형태에 따른 우산 우선 여부를 판단하는 메서드 - private boolean needUmbrella(String pop, String pty) { - if (pop == "0" && pty == "0") { - return false; // 눈이나 비가 안옴 + private String needUmbrella(String pop, String pty) { + if (pop.equals("0") && pty.equals("0")) { + return "우산 필요 없음"; // 눈이나 비가 안옴 } else { - return true; // 눈이나 비가 옴 + return "우산 필요"; // 눈이나 비가 옴 } } @@ -140,9 +212,7 @@ public int getPercentValue(PrepareDto prepareDto) throws BaseException { int temperature = Integer.parseInt(prepareDto.getTmp()); // 기온 int precipitationProbability = Integer.parseInt(prepareDto.getPop()); // 강수확률 int humidity = Integer.parseInt(prepareDto.getReh()); // 습도 - int pm10 = Integer.parseInt(prepareDto.getPm10grade()); // 미세먼지 등급 - int pm25 = Integer.parseInt(prepareDto.getPm25grade()); // 초미세먼지 등급 - String airQuality = airQualityScore(pm10, pm25); // 대기질 등급 계산 + String airQuality = airQualityScore(prepareDto.getPm10grade(), prepareDto.getPm25grade()); // 대기질 등급 계산 // Temperature calculation if (temperature >= 20 && temperature <= 25) { @@ -226,29 +296,35 @@ public int getPercentValue(PrepareDto prepareDto) throws BaseException { return percentValue; } - private String airQualityScore(int pm10, int pm25) { + private String airQualityScore(String pm10S, String pm25S) { int pmScore = 0; - // PM10 점수 계산 - if (pm10 >= 0 && pm10 <= 30) { - pmScore += 10; - } else if (pm10 >= 31 && pm10 <= 80) { - pmScore += 0; - } else if (pm10 >= 81 && pm10 <= 150) { - pmScore -= 5; - } else if (pm10 >= 151) { - pmScore -= 10; + if (pm10S != "null") { + int pm10 = Integer.parseInt(pm10S); + // PM10 점수 계산 + if (pm10 >= 0 && pm10 <= 30) { + pmScore += 10; + } else if (pm10 >= 31 && pm10 <= 80) { + pmScore += 0; + } else if (pm10 >= 81 && pm10 <= 150) { + pmScore -= 5; + } else if (pm10 >= 151) { + pmScore -= 10; + } } - // PM2.5 점수 계산 - if (pm25 >= 0 && pm25 <= 15) { - pmScore += 10; - } else if (pm25 >= 16 && pm25 <= 35) { - pmScore += 0; - } else if (pm25 >= 36 && pm25 <= 75) { - pmScore -= 5; - } else if (pm25 >= 76) { - pmScore -= 10; + if (pm25S != "null") { + int pm25 = Integer.parseInt(pm25S); + // PM2.5 점수 계산 + if (pm25 >= 0 && pm25 <= 15) { + pmScore += 10; + } else if (pm25 >= 16 && pm25 <= 35) { + pmScore += 0; + } else if (pm25 >= 36 && pm25 <= 75) { + pmScore -= 5; + } else if (pm25 >= 76) { + pmScore -= 10; + } } // 대기질 점수 계산 diff --git a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java index a2c35d9..d28dcf3 100644 --- a/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java +++ b/src/main/java/com/haemil/backend/schedule/controller/ScheduleController.java @@ -98,7 +98,7 @@ public ResponseEntity deleteSchedule(@PathVariable Long scheduleId public ResponseEntity updateSchedule(@PathVariable Long scheduleId, @RequestBody ScheduleRequestDto requestDto) { try { Schedule updateSchedule = scheduleService.updateSchedule(scheduleId, requestDto); - log.debug("requestDto.getPlace() = {}",requestDto.getPlace()); +// log.debug("requestDto.getPlace() = {}",requestDto.getPlace()); // 맵 API 호출하여 맵 URL 얻어오는 부분 String mapUrl = mapService.getMapUrl(requestDto.getPlace()); diff --git a/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java b/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java index d3cf5cf..04bcce2 100644 --- a/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java +++ b/src/main/java/com/haemil/backend/schedule/repository/ScheduleRepository.java @@ -22,4 +22,4 @@ public interface ScheduleRepository extends JpaRepository { List findByLocalDate(LocalDate localDate); -} +} \ No newline at end of file diff --git a/src/main/java/com/haemil/backend/weather/controller/AirController.java b/src/main/java/com/haemil/backend/weather/controller/AirController.java index 8836998..e663b0f 100644 --- a/src/main/java/com/haemil/backend/weather/controller/AirController.java +++ b/src/main/java/com/haemil/backend/weather/controller/AirController.java @@ -4,6 +4,7 @@ import com.haemil.backend.global.config.BaseResponse; import com.haemil.backend.weather.dto.AirDto; import com.haemil.backend.weather.dto.AirInfoDto; +import com.haemil.backend.weather.dto.TransferDto; import com.haemil.backend.weather.service.AirService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; import java.util.List; @Slf4j @@ -24,11 +27,24 @@ public class AirController { private final AirService airService; public List infoList = null; + + public TransferDto fetchDataAndProcess(HttpServletRequest request) throws BaseException { + String latitude = request.getParameter("latitude"); + String longitude = request.getParameter("longitude"); + + TransferDto transferDto = new TransferDto(); + transferDto.setX(latitude); + transferDto.setY(longitude); + + return transferDto; + } + @GetMapping("/send") - public ResponseEntity sendGetRequest() { + public ResponseEntity sendGetRequest(HttpServletRequest request) { try { - String jsonString = airService.getAirInfo(airdto); -// log.debug("Air - jsonString : " + jsonString); + TransferDto transferDto = fetchDataAndProcess(request); + String jsonString = airService.getAirInfo(airdto, transferDto); + airService.isJson(jsonString); infoList = airService.ParsingJson(jsonString); diff --git a/src/main/java/com/haemil/backend/weather/controller/LivingController.java b/src/main/java/com/haemil/backend/weather/controller/LivingController.java index 980234a..766848f 100644 --- a/src/main/java/com/haemil/backend/weather/controller/LivingController.java +++ b/src/main/java/com/haemil/backend/weather/controller/LivingController.java @@ -12,6 +12,8 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; import java.util.List; @Slf4j @@ -20,20 +22,41 @@ @RequiredArgsConstructor @RequestMapping("/living") public class LivingController { - private final LivingDto livingDto; private final LivingService livingService; public List infoList = null; +// public LocationDto locationDto; + + private LivingDto fetchDataAndProcess(HttpServletRequest request) throws BaseException { + String latitude = request.getParameter("latitude"); + String longitude = request.getParameter("longitude"); + + double lat = Double.parseDouble(latitude); + double lon = Double.parseDouble(longitude); + + latitude = String.format("%.0f", lat); + longitude = String.format("%.0f", lon); + + LivingDto livingDto = new LivingDto(); + livingDto.setLon(longitude); + livingDto.setLat(latitude); + + return livingDto; + } + @GetMapping("/send") - public ResponseEntity sendGetRequest() { + public ResponseEntity sendGetRequest(HttpServletRequest request) { try { +// this.locationDto = locationDto; + LivingDto livingDto = fetchDataAndProcess(request); + // feel like temp String jsonString1 = livingService.getLivingTempInfo(livingDto); // log.debug("jsonString : " + jsonString1); livingService.isJson(jsonString1); // uv - String jsonString2 = livingService.getUVInfo(livingDto); + String jsonString2 = livingService.getUVInfo(livingDto, request); // log.debug("jsonString : " + jsonString2); livingService.isJson(jsonString2); diff --git a/src/main/java/com/haemil/backend/weather/controller/WeatherController.java b/src/main/java/com/haemil/backend/weather/controller/WeatherController.java index cbde429..9206059 100644 --- a/src/main/java/com/haemil/backend/weather/controller/WeatherController.java +++ b/src/main/java/com/haemil/backend/weather/controller/WeatherController.java @@ -13,8 +13,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; -import java.util.HashMap; +import javax.servlet.http.HttpServletRequest; +import java.time.LocalDate; +import java.time.LocalTime; import java.util.List; import java.util.Map; @@ -24,14 +25,33 @@ @RequiredArgsConstructor @RequestMapping("/weather") public class WeatherController { - private final WeatherDto weatherDto; private final WeatherService weatherService; - public List tmnAndTmxData; + public Map transformedData; public List currentTimeData; + + private WeatherDto fetchDataAndProcess(HttpServletRequest request) throws BaseException { + String latitude = request.getParameter("latitude"); + String longitude = request.getParameter("longitude"); + + double lat = Double.parseDouble(latitude); + double lon = Double.parseDouble(longitude); + + latitude = String.format("%.0f", lat); + longitude = String.format("%.0f", lon); + + WeatherDto weatherDto = new WeatherDto(); + weatherDto.setNx(latitude); + weatherDto.setNy(longitude); + + return weatherDto; + } + @GetMapping("/today") - public ResponseEntity getTodayWeather() { // 오늘 현재 시간대 + public ResponseEntity getTodayWeather(HttpServletRequest request) { // 오늘 현재 시간대 try { + WeatherDto weatherDto = fetchDataAndProcess(request); + String jsonString = weatherService.getWeatherInfo(weatherDto); weatherService.isJson(jsonString); List infoList = weatherService.ParsingJson(jsonString); @@ -43,13 +63,16 @@ public ResponseEntity getTodayWeather() { // 오늘 현재 시간 } @GetMapping("/send") - public ResponseEntity sendGetRequest() { // 모든 날씨 정보 + public ResponseEntity sendGetRequest(HttpServletRequest request) { // 모든 날씨 정보 try { + WeatherDto weatherDto = fetchDataAndProcess(request); + String jsonString = weatherService.getWeatherInfo(weatherDto); weatherService.isJson(jsonString); List infoList = weatherService.ParsingJson(jsonString); + currentTimeData = weatherService.filterCurrentTimeData(infoList, weatherDto); - tmnAndTmxData = weatherService.filterTMNandTMXData(infoList, weatherDto); + transformedData = weatherService.transformWeatherData(infoList, currentTimeData, weatherDto); return new BaseResponse<>(infoList).convert(); } catch (BaseException e) { @@ -57,13 +80,33 @@ public ResponseEntity sendGetRequest() { // 모든 날씨 정보 } } + @GetMapping("/data") + public ResponseEntity getTMNandTMXData(HttpServletRequest request) { + try { + WeatherDto weatherDto = fetchDataAndProcess(request); + + String jsonString = weatherService.getWeatherInfo(weatherDto); + weatherService.isJson(jsonString); + List infoList = weatherService.ParsingJson(jsonString); + List todayData = weatherService.filterCurrentTimeData(infoList, weatherDto); + + transformedData = weatherService.transformWeatherData(infoList, todayData, weatherDto); + + return new BaseResponse<>(transformedData).convert(); + } catch (BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + } + } + @GetMapping("/tmps") - public ResponseEntity getTemperatures() { + public ResponseEntity getTemperatures(HttpServletRequest request) { // 3일치 온도&하늘상태 가져오기 try { + WeatherDto weatherDto = fetchDataAndProcess(request); + String jsonString = weatherService.getWeatherInfo(weatherDto); weatherService.isJson(jsonString); List infoList = weatherService.ParsingJson(jsonString); - List temperatureData = weatherService.filterCurrentTimeAndSpecifiedDateData(infoList, "1500"); + List> temperatureData = weatherService.filterCurrentTimeAndSpecifiedDateData(infoList, "1500"); return new BaseResponse<>(temperatureData).convert(); } catch (BaseException e) { @@ -71,6 +114,28 @@ public ResponseEntity getTemperatures() { } } + @GetMapping("/times") + public ResponseEntity getNextHoursWeather(HttpServletRequest request) { // 시간대별 온도&하늘상태 가져오기 + try { + WeatherDto weatherDto = fetchDataAndProcess(request); + + String jsonString = weatherService.getWeatherInfo(weatherDto); + weatherService.isJson(jsonString); + List infoList = weatherService.ParsingJson(jsonString); + + // 현재 날짜를 기준으로 시작 시간 설정 + LocalDate currentDate = LocalDate.now(); + LocalTime startTime = LocalTime.of(8, 0); // 시작 시간을 8시로 설정 + + // 오늘의 데이터를 가져오도록 설정 + List> filteredData = weatherService.filterNextData(infoList, startTime, 15); + + return new BaseResponse<>(filteredData).convert(); + } catch (BaseException e) { + return new BaseResponse<>(e.getStatus()).convert(); + } + } + } diff --git a/src/main/java/com/haemil/backend/weather/dto/LivingDto.java b/src/main/java/com/haemil/backend/weather/dto/LivingDto.java index 14db7ac..1c4dadb 100644 --- a/src/main/java/com/haemil/backend/weather/dto/LivingDto.java +++ b/src/main/java/com/haemil/backend/weather/dto/LivingDto.java @@ -10,8 +10,8 @@ public class LivingDto { // 체감 온도 private final String apiUrl = "https://api.openweathermap.org/data/2.5/weather"; - private final String lat = "55"; - private final String lon = "127"; + private String lat; + private String lon; private final String lang = "kr"; private final String units = "metric"; diff --git a/src/main/java/com/haemil/backend/weather/dto/TransferDto.java b/src/main/java/com/haemil/backend/weather/dto/TransferDto.java new file mode 100644 index 0000000..cc1fa2e --- /dev/null +++ b/src/main/java/com/haemil/backend/weather/dto/TransferDto.java @@ -0,0 +1,11 @@ +package com.haemil.backend.weather.dto; + +import lombok.Data; +import org.springframework.stereotype.Component; + +@Data +@Component +public class TransferDto { + private String x; + private String y; +} diff --git a/src/main/java/com/haemil/backend/weather/dto/WeatherDto.java b/src/main/java/com/haemil/backend/weather/dto/WeatherDto.java index f131ca9..cfd9dc2 100644 --- a/src/main/java/com/haemil/backend/weather/dto/WeatherDto.java +++ b/src/main/java/com/haemil/backend/weather/dto/WeatherDto.java @@ -18,8 +18,8 @@ public class WeatherDto { private final String base_date; private final String base_time = "0200"; private final String current_time; - private final String nx = "55"; - private final String ny = "127"; + private String nx; + private String ny; public WeatherDto() { LocalDate today = LocalDate.now(); diff --git a/src/main/java/com/haemil/backend/weather/service/AirService.java b/src/main/java/com/haemil/backend/weather/service/AirService.java index d90eef7..61fc3b4 100644 --- a/src/main/java/com/haemil/backend/weather/service/AirService.java +++ b/src/main/java/com/haemil/backend/weather/service/AirService.java @@ -7,6 +7,7 @@ import com.haemil.backend.global.config.ResponseStatus; import com.haemil.backend.weather.dto.AirDto; import com.haemil.backend.weather.dto.AirInfoDto; +import com.haemil.backend.weather.dto.TransferDto; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import lombok.extern.slf4j.Slf4j; @@ -14,6 +15,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; @@ -28,14 +30,15 @@ public class AirService { @Value("${api.hj-secret-key}") String serviceKey; - public String getAirInfo(AirDto airDto) throws BaseException { + public String getAirInfo(AirDto airDto, TransferDto transferDto) throws BaseException { String responseBody; try { String apiUrl = airDto.getApiUrl(); String returnType = airDto.getReturnType(); String numOfRows = airDto.getNumOfRows(); String pageNo = airDto.getPageNo(); - String stationName = stationService.getStationName(stationService.getStationInfo()); + String stationName = stationService.getStationName(stationService.getStationInfo(transferDto)); +// log.info("air - stationName = {}", stationName); String dataTerm = airDto.getDataTerm(); String ver = airDto.getVer(); diff --git a/src/main/java/com/haemil/backend/weather/service/LivingService.java b/src/main/java/com/haemil/backend/weather/service/LivingService.java index a0bae40..e980e82 100644 --- a/src/main/java/com/haemil/backend/weather/service/LivingService.java +++ b/src/main/java/com/haemil/backend/weather/service/LivingService.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.haemil.backend.alert.dto.ReqCoordDto; import com.haemil.backend.global.config.BaseException; import com.haemil.backend.global.config.ResponseStatus; import com.haemil.backend.weather.dto.AirDto; @@ -16,6 +17,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; @@ -53,8 +55,6 @@ public String getLivingTempInfo(LivingDto livingDto) throws BaseException { responseBody = response.getBody(); -// log.info("Living _ urlBuilder: " + urlBuilder); -// log.info("Living _ responseBody: " + responseBody); } catch (UnsupportedEncodingException e) { log.debug("UnsupportedEncodingException 발생 "); throw new BaseException(ResponseStatus.UNSUPPORTED_ENCODING); @@ -64,13 +64,18 @@ public String getLivingTempInfo(LivingDto livingDto) throws BaseException { private final LocationService locationService; // 자외선 - public String getUVInfo(LivingDto livingDto) throws BaseException { + public String getUVInfo(LivingDto livingDto, HttpServletRequest request) throws BaseException { String responseBody; try { String apiUrl = livingDto.getApiUrlUV(); String dataType = livingDto.getDataType(); -// String areaNo = locationService.getLocation(locationService.getLocationInfo()).getAreaNo(); - String areaNo = "1100000000"; + String areaNo = locationService.getLocation(locationService.getLocationInfo(request)).getAreaNo(); + + if (areaNo.length() >= 2) { + String modifiedAreaNo = areaNo.substring(0, areaNo.length() - 5) + "00000"; +// locationService.getLocation(locationService.getLocationInfo(request)).setAreaNo(modifiedAreaNo); + areaNo = modifiedAreaNo; + } String numOfRows = livingDto.getNumOfRows(); String pageNo = livingDto.getPageNo(); String time = livingDto.getTime(); diff --git a/src/main/java/com/haemil/backend/weather/service/LocationService.java b/src/main/java/com/haemil/backend/weather/service/LocationService.java index c17fad3..ed20ddc 100644 --- a/src/main/java/com/haemil/backend/weather/service/LocationService.java +++ b/src/main/java/com/haemil/backend/weather/service/LocationService.java @@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.client.RestTemplate; +import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLEncoder; @@ -31,20 +32,20 @@ public class LocationService { @Value("${api.hj-kakao-key}") String serviceKey; - public String getLocationInfo(@RequestBody ReqCoordDto reqCoordDto) throws BaseException { + public String getLocationInfo(HttpServletRequest request) throws BaseException { String responseBody; try { - String latitude = reqCoordDto.getLatitude(); - String longitude = reqCoordDto.getLongitude(); + String latitude = request.getParameter("latitude"); + String longitude = request.getParameter("longitude"); +// log.info("location - latitude = {}", latitude); +// log.info("location - longitude = {}", longitude); HttpHeaders headers = new HttpHeaders(); headers.add("Authorization", "KakaoAK " + serviceKey); -// log.debug("serviceKey: " + serviceKey); - StringBuilder urlBuilder = new StringBuilder("https://dapi.kakao.com/v2/local/geo/coord2regioncode.json"); - urlBuilder.append("?"+ URLEncoder.encode("x", "UTF-8")+"="+URLEncoder.encode(latitude, "UTF-8")); - urlBuilder.append("&"+ URLEncoder.encode("y", "UTF-8")+"="+URLEncoder.encode(longitude, "UTF-8")); + urlBuilder.append("?"+ URLEncoder.encode("x", "UTF-8")+"="+URLEncoder.encode(longitude, "UTF-8")); + urlBuilder.append("&"+ URLEncoder.encode("y", "UTF-8")+"="+URLEncoder.encode(latitude, "UTF-8")); URI url = new URI(urlBuilder.toString()); RequestEntity requestEntity = new RequestEntity<>(headers, HttpMethod.GET, url); diff --git a/src/main/java/com/haemil/backend/weather/service/StationService.java b/src/main/java/com/haemil/backend/weather/service/StationService.java index 6ac1fab..092cd51 100644 --- a/src/main/java/com/haemil/backend/weather/service/StationService.java +++ b/src/main/java/com/haemil/backend/weather/service/StationService.java @@ -6,6 +6,7 @@ import com.haemil.backend.global.config.BaseException; import com.haemil.backend.global.config.ResponseStatus; import com.haemil.backend.weather.dto.StationDto; +import com.haemil.backend.weather.dto.TransferDto; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import lombok.extern.slf4j.Slf4j; @@ -13,6 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; @@ -28,13 +30,13 @@ public class StationService { private final StationDto stationDto; - public String getStationInfo() throws BaseException { + public String getStationInfo(TransferDto transferDto) throws BaseException { String responseBody; try { String apiUrl = stationDto.getApiUrl(); String returnType = stationDto.getReturnType(); - String tmX = transferService.getTmInfo(transferService.getTransferInfo()).getTmX(); // 받아오기 by TransferService - String tmY = transferService.getTmInfo(transferService.getTransferInfo()).getTmY(); // 받아오기 by TransferService + String tmX = transferService.getTmInfo(transferService.getTransferInfo(transferDto)).getTmX(); // 받아오기 by TransferService + String tmY = transferService.getTmInfo(transferService.getTransferInfo(transferDto)).getTmY(); // 받아오기 by TransferService StringBuilder urlBuilder = new StringBuilder(apiUrl); urlBuilder.append("?"+ URLEncoder.encode("serviceKey", "UTF-8")+"="+serviceKey); diff --git a/src/main/java/com/haemil/backend/weather/service/TransferService.java b/src/main/java/com/haemil/backend/weather/service/TransferService.java index 02feb9f..4bfec69 100644 --- a/src/main/java/com/haemil/backend/weather/service/TransferService.java +++ b/src/main/java/com/haemil/backend/weather/service/TransferService.java @@ -5,7 +5,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.haemil.backend.global.config.BaseException; import com.haemil.backend.global.config.ResponseStatus; +import com.haemil.backend.weather.controller.AirController; import com.haemil.backend.weather.dto.StationDto; +import com.haemil.backend.weather.dto.TransferDto; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import lombok.extern.slf4j.Slf4j; @@ -16,6 +18,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; +import javax.servlet.http.HttpServletRequest; import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URLEncoder; @@ -27,12 +30,16 @@ public class TransferService { private final RestTemplate restTemplate; @Value("${api.hj-kakao-key}") String serviceKey; + AirController airController; - public String getTransferInfo() throws BaseException { + public String getTransferInfo(TransferDto transferDto2) throws BaseException { String responseBody; + + TransferDto transferDto = transferDto2; + try { - String x = "126.57740680000002"; // 임의 nx - String y = "33.453357700000005"; // 임의 ny + String x = transferDto.getY(); + String y = transferDto.getX(); String input_coord = "WGS84"; String output_coord = "TM"; @@ -68,6 +75,7 @@ public String getTransferInfo() throws BaseException { // tmX , tmY -> Station 으로 넘기기 public StationDto getTmInfo(String responseBody) throws BaseException { try { +// log.debug("transfer - tminfo = {}", responseBody); StationDto stationDto = new StationDto(); ObjectMapper objectMapper = new ObjectMapper(); @@ -85,14 +93,4 @@ public StationDto getTmInfo(String responseBody) throws BaseException { throw new BaseException(ResponseStatus.CANNOT_CONVERT_JSON); } } - - public boolean isJson(String jsonString) throws BaseException { - boolean isJson = jsonString.startsWith("{") && jsonString.endsWith("}"); - - if (!isJson) { - throw new BaseException(ResponseStatus.INVALID_XML_FORMAT); - } else { - return true; - } - } } diff --git a/src/main/java/com/haemil/backend/weather/service/WeatherService.java b/src/main/java/com/haemil/backend/weather/service/WeatherService.java index d28f1b3..327894c 100644 --- a/src/main/java/com/haemil/backend/weather/service/WeatherService.java +++ b/src/main/java/com/haemil/backend/weather/service/WeatherService.java @@ -17,9 +17,9 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.time.LocalDate; +import java.time.LocalTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; +import java.util.*; @Slf4j @Service @@ -119,52 +119,71 @@ public List filterCurrentTimeData(List weatherIn return filteredList; } - public List filterTMNandTMXData(List weatherInfoDtoList, WeatherDto weatherDto) { - List TMNList = new ArrayList<>(); - List TMXList = new ArrayList<>(); - List TMNXList = new ArrayList<>(); + public Map transformWeatherData(List weatherInfoDtoList, List todayData, WeatherDto weatherDto) { + List Result = new ArrayList<>(); + Map resultData = new HashMap<>(); + + for (WeatherInfoDto today : todayData) { + String fcstValue = today.getFcstValue(); + String category = today.getCategory(); + + if (category.equals("TMP")) { + resultData.put("current", fcstValue); + break; + } + } for (WeatherInfoDto weatherInfoDto : weatherInfoDtoList) { String fcstDate = weatherInfoDto.getFcstDate(); + String fcstValue = weatherInfoDto.getFcstValue(); if (fcstDate.equals(weatherDto.getBase_date())) { String category = weatherInfoDto.getCategory(); if (category.equals("TMN")) { - TMNList.add(weatherInfoDto); + resultData.put("min", fcstValue); } else if (category.equals("TMX")) { - TMXList.add(weatherInfoDto); + resultData.put("max", fcstValue); } } } - for (WeatherInfoDto weatherInfoDto : TMNList) { - String fcstValue = weatherInfoDto.getFcstValue(); - TMNXList.add(fcstValue); - } - for (WeatherInfoDto weatherInfoDto : TMXList) { - String fcstValue = weatherInfoDto.getFcstValue(); - TMNXList.add(fcstValue); - } - - return TMNXList; + return resultData; } - public List filterCurrentTimeAndSpecifiedDateData(List weatherInfoDtoList, String specifiedTime) { - List filteredList = new ArrayList<>(); + public List> filterCurrentTimeAndSpecifiedDateData(List weatherInfoDtoList, String specifiedTime) { + Map> groupedData = new HashMap<>(); for (WeatherInfoDto weatherInfoDto : weatherInfoDtoList) { - String fcstTime = weatherInfoDto.getFcstTime(); String fcstDate = weatherInfoDto.getFcstDate(); + String fcstTime = weatherInfoDto.getFcstTime(); + String fcstValue = weatherInfoDto.getFcstValue(); + String category = weatherInfoDto.getCategory(); + + // "fcstTime"이 "1500"이고 오늘, 내일 또는 모레인 데이터만 필터링 + if (fcstTime.equals(specifiedTime) && isSpecifiedDate(fcstDate) && (category.equals("TMP") || category.equals("SKY"))) { + // 날짜별로 데이터 그룹화 + String key = fcstDate + fcstTime; + groupedData.putIfAbsent(key, new HashMap<>()); + Map dataPoint = groupedData.get(key); + + dataPoint.put("fcstDate", fcstDate); + dataPoint.put("fcstTime", fcstTime); + + if (category.equals("TMP")) { + dataPoint.put("TMP", fcstValue); + } - // 지정한 시간과 지정한 날짜에 해당하는 데이터만 필터링 (오늘, 내일, 모레) - if (fcstTime.equals(specifiedTime) && isSpecifiedDate(fcstDate)) { - if (weatherInfoDto.getCategory().equals("TMP")) { - filteredList.add(weatherInfoDto); + if (category.equals("SKY")) { + dataPoint.put("SKY", fcstValue); } } } - return filteredList; + + List> resultList = new ArrayList<>(groupedData.values()); + resultList.sort(Comparator.comparing(dataPoint -> dataPoint.get("fcstDate"))); + + return resultList; } private boolean isSpecifiedDate(String fcstDate) { @@ -175,8 +194,50 @@ private boolean isSpecifiedDate(String fcstDate) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); LocalDate parsedFcstDate = LocalDate.parse(fcstDate, formatter); - return parsedFcstDate.equals(today) || - parsedFcstDate.equals(tomorrow) || - parsedFcstDate.equals(dayAfterTomorrow); + return parsedFcstDate.equals(today) || parsedFcstDate.equals(tomorrow) || parsedFcstDate.equals(dayAfterTomorrow); + } + + + public List> filterNextData(List weatherInfoDtoList, LocalTime startTime, int numDataPoints) { + List> filteredList = new ArrayList<>(); + + DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH00"); + + for (int i = 0; i < numDataPoints; i++) { + LocalTime nextTime = startTime.plusHours(i); + String formattedNextTime = nextTime.format(timeFormatter); + + Map dataPoint = new HashMap<>(); + boolean hasTmp = false; + boolean hasSky = false; + + String fcstDate = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); // 현재 날짜를 사용 + String fcstTime = formattedNextTime; + + for (WeatherInfoDto weatherInfoDto : weatherInfoDtoList) { + String category = weatherInfoDto.getCategory(); + String fcstValue = weatherInfoDto.getFcstValue(); + + if (weatherInfoDto.getFcstDate().equals(fcstDate) && weatherInfoDto.getFcstTime().equals(fcstTime) && (category.equals("TMP") || category.equals("SKY"))) { + if (category.equals("TMP")) { + dataPoint.put("TMP", fcstValue); + hasTmp = true; + } else if (category.equals("SKY")) { + dataPoint.put("SKY", fcstValue); + hasSky = true; + } + + if (hasTmp && hasSky) { + dataPoint.put("FCST_DATE", fcstDate); + dataPoint.put("FCST_TIME", fcstTime); + filteredList.add(dataPoint); + break; + } + } + } + } + + return filteredList; } + }