Skip to content

Commit

Permalink
[CHORE] weather/prepare code refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
hyun-jung-joo authored and devyubin committed Sep 4, 2023
1 parent c7a41d7 commit 6c39957
Show file tree
Hide file tree
Showing 8 changed files with 241 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
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.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.prepare.service.PrepareService;
import com.haemil.backend.weather.controller.AirController;
import com.haemil.backend.weather.controller.LivingController;
Expand All @@ -22,6 +25,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@Slf4j
@RestController
Expand All @@ -34,44 +38,73 @@ public class PrepareController {
private final AirController airController;
private final ObjectMapper objectMapper; // ObjectMapper 주입

private PrepareDto fetchDataAndProcess() throws BaseException {
ResponseEntity<BaseResponse> weatherResponse = weatherController.sendGetRequest();
List<WeatherInfoDto> todayTemps = weatherController.currentTimeData;

ResponseEntity<BaseResponse> airResponse = airController.sendGetRequest();
List<AirInfoDto> todayAirs = airController.infoList;

ResponseEntity<BaseResponse> livingResponse = livingController.sendGetRequest();
List<LivingInfoDto> todayLivings = livingController.infoList;

Map<String, String> temps = weatherController.transformedData; // 최고 최저 온도

PrepareDto prepareDto = new PrepareDto(todayTemps, todayAirs, temps, todayLivings);
prepareService.filterWeatherData(todayTemps, prepareDto);
prepareService.filterAirData(todayAirs, prepareDto);

return prepareDto;
}

@GetMapping("/send")
public ResponseEntity<BaseResponse> sendGetRequest() {
try {
// Call /weather/send to get weather data
ResponseEntity<BaseResponse> weatherResponse = weatherController.sendGetRequest();
List<WeatherInfoDto> todayTemps = weatherController.currentTimeData;
PrepareDto prepareDto = fetchDataAndProcess();

// Call /air/send to get air data
ResponseEntity<BaseResponse> airResponse = airController.sendGetRequest();
List<AirInfoDto> todayAirs = airController.infoList;

ResponseEntity<BaseResponse> livingResponse = livingController.sendGetRequest();
List<LivingInfoDto> todayLivings = livingController.infoList;
List<PrepareDto> prepareDtoList = new ArrayList<>();
prepareDtoList.add(prepareDto);

List<String> temps = weatherController.tmnAndTmxData;
// log.info("minmax = {}", temps.get(0));
List<PrePareInfoDto> resultString = prepareService.ParsingJson(prepareDtoList);
// log.info("prePare_result = {}", resultString); // 외출 적합도 결과 log

PrepareDto prepareDto = new PrepareDto(todayTemps, todayAirs, temps, todayLivings);
prepareService.filterWeatherData(todayTemps, prepareDto);
// log.info("tmp = {}", prepareDto.getTmp());
return new BaseResponse<>(resultString).convert();
} catch(BaseException e) {
return new BaseResponse<>(e.getStatus()).convert();
}
}

prepareService.filterAirData(todayAirs, prepareDto);
@GetMapping("/weather")
public ResponseEntity<BaseResponse> sendWeatherInfo() {
try {
PrepareDto prepareDto = fetchDataAndProcess();

List<PrepareDto> prepareDtoList = new ArrayList<>();
prepareDtoList.add(prepareDto);

String resultString = prepareService.ParsingJson(prepareDtoList);
log.info("prePare_result = {}", resultString);
List<PrepareWeatherDto> resultString = prepareService.ParsingWeather(prepareDtoList);
// log.info("prePare_weather_result = {}", resultString); // 외출 - 날씨 관련 정보

Object jsonResult = objectMapper.readValue(resultString, Object.class);
String prettyJsonString = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonResult);
return new BaseResponse<>(resultString).convert();
} catch(BaseException e) {
return new BaseResponse<>(e.getStatus()).convert();
}
}

return new BaseResponse<>(prettyJsonString).convert();
@GetMapping("/need")
public ResponseEntity<BaseResponse> sendNeedInfo() {
try {
PrepareDto prepareDto = fetchDataAndProcess();

List<PrepareDto> prepareDtoList = new ArrayList<>();
prepareDtoList.add(prepareDto);

List<PrepareNeedInfoDto> resultString = prepareService.ParsingNeed(prepareDtoList);
// log.info("prePare_need_result = {}", resultString); // 외출 물품 정보

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();
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -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. "외출하기 좋은 날이네요"ㅇ
}
14 changes: 9 additions & 5 deletions src/main/java/com/haemil/backend/prepare/dto/PrepareDto.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Data
@Component
Expand All @@ -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<WeatherInfoDto> todayTemps, List<AirInfoDto> todayAirs, List<String> temps, List<LivingInfoDto> livings) {
public PrepareDto(List<WeatherInfoDto> todayTemps, List<AirInfoDto> todayAirs, Map<String, String> temps, List<LivingInfoDto> 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();
Expand Down
Original file line number Diff line number Diff line change
@@ -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. "민소매, 반팔, 반바지, 원피스"
}
Original file line number Diff line number Diff line change
@@ -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; // 자외선
}
100 changes: 76 additions & 24 deletions src/main/java/com/haemil/backend/prepare/service/PrepareService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -39,6 +41,8 @@ public void filterWeatherData(List<WeatherInfoDto> weatherInfoDtoList, PrepareDt
prepareDto.setReh(weatherInfoDto.getFcstValue());
} else if (category.equals("SKY")) {
prepareDto.setSky(weatherInfoDto.getFcstValue());
} else if (category.equals("WSD")) {
prepareDto.setWsd(weatherInfoDto.getFcstValue());
}
}
}
Expand All @@ -47,31 +51,63 @@ public void filterAirData(List<AirInfoDto> 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<PrepareDto> prepareDtoList) throws BaseException {
public List<PrePareInfoDto> ParsingJson(List<PrepareDto> prepareDtoList) throws BaseException {
List<PrePareInfoDto> 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());
prePareInfoDto.setClothes(getClothesValue(prepareDto.getMaxTemp(), prepareDto.getMinTemp(), prepareDto.getTmp()));
prePareInfoDto.setFeel_like(prepareDto.getFeelLike());
prePareInfoDto.setUv(getUvStatus(prepareDto));

int percent = getPercentValue(prepareDto);
prePareInfoDto.setPercent(percent);

String result = getResultValue(percent);
prePareInfoDto.setResult(result);

prePareInfoDtoList.add(prePareInfoDto);
}
return prePareInfoDtoList;
}

public List<PrepareNeedInfoDto> ParsingNeed(List<PrepareDto> prepareDtoList) throws BaseException {
List<PrepareNeedInfoDto> 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<PrepareWeatherDto> ParsingWeather(List<PrepareDto> prepareDtoList) throws BaseException {
List<PrepareWeatherDto> 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 {
Expand All @@ -94,6 +130,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) {
Expand Down Expand Up @@ -122,12 +174,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 "우산 필요"; // 눈이나 비가 옴
}
}

Expand Down
Loading

0 comments on commit 6c39957

Please sign in to comment.