Skip to content
Open
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
bd61714
feat: 미세먼지 기능 구현
limseohyeon Apr 17, 2025
4e9c435
test: 미세먼지 service test
limseohyeon Apr 17, 2025
c4f58c4
test: 미세먼지 service Test 추가
limseohyeon Apr 18, 2025
616da91
feat:Object 타입으로 변경
limseohyeon Apr 18, 2025
157d16b
feat: 미세먼지 기능 구현
limseohyeon Apr 17, 2025
8058da5
feat:Object 타입으로 변경
limseohyeon Apr 18, 2025
8c38a5e
feat: 미세먼지 권한 수정
limseohyeon Apr 23, 2025
02bba86
feat: 사용자 위치 기반 미세먼지 조회 기능 추가
limseohyeon May 12, 2025
bade1db
refactor: 불필요한 코드 제거
limseohyeon May 13, 2025
939c3a0
refactor: 변수명 변경 및 불필요한 코드 제거
limseohyeon May 13, 2025
a8eddcf
feat: 측정소 null 반환시 예외 발생 추가
limseohyeon May 13, 2025
4f5b6fb
test: 측성소 null 반환시 예외 발생 테스트 추가
limseohyeon May 13, 2025
58c7182
refactor: key+지역코드 함수 분리
limseohyeon May 14, 2025
143efd4
refactor: key값 변환 위임 숨기기
limseohyeon May 14, 2025
79d7c74
refactor: 미세먼지 캐싱 Class 분리
limseohyeon May 14, 2025
d70d7e9
refactor: 위치별 미세먼지 구분로직 분리를 위한 interface 추가
limseohyeon May 14, 2025
044f3af
refactor: 서울 외 지역 미세먼지 Class 분리
limseohyeon May 14, 2025
7cdb4b8
refactor: 서울 미세먼지 Class 분리
limseohyeon May 14, 2025
c1cf980
refactor: 분리한 Class를 호출 Service에 적용
limseohyeon May 14, 2025
d931279
refactor : 스케줄러 분리한 Class 적용
limseohyeon May 14, 2025
f49b1b1
refacter: 분리한 Class test적용
limseohyeon May 14, 2025
fc780b2
refactor: 불필요한 import 삭제
limseohyeon May 14, 2025
3f91e91
refactor: 함수명 변경
limseohyeon May 14, 2025
ca34278
refactor: 불필요한 코드 제거
limseohyeon May 15, 2025
729edf9
refactor: 불필요한 interface 제거
limseohyeon May 22, 2025
e5b3095
refactor: 명확한 분리를 위한 구현체 이름 변경
limseohyeon May 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,9 @@ dependencies {
// Xml
implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.19.0-rc2"

// 좌표
implementation 'org.locationtech.proj4j:proj4j:1.1.1'

}

// JaCoCo 버전 설정
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,17 +7,21 @@
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/air-quality")
@RequiredArgsConstructor
public class AirQualityController {

private final AirQualityService airQualityService;
private final AirQualityService airQualityService;

@GetMapping
public ResponseEntity<ApiResponse<AirQualityResponse>> getAirQuality() {
return ResponseEntity.ok(ApiResponse.createSuccess(airQualityService.getAirQuality()));
}
@GetMapping
public ResponseEntity<ApiResponse<AirQualityResponse>> getAirQuality(
@RequestParam double lat,
@RequestParam double lng
) {
return ResponseEntity.ok(ApiResponse.createSuccess(airQualityService.getAirQuality(lat, lng)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@

import lombok.RequiredArgsConstructor;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.programmers.signalbuddyfinal.domain.air_quality.service.AirQualityService;
import org.springframework.context.annotation.Configuration;
import org.programmers.signalbuddyfinal.domain.air_quality.dto.ObservatoryResponse;
import org.programmers.signalbuddyfinal.domain.air_quality.service.SeoulAirQualityService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class AirQualityScheduler {
private final AirQualityService airQualityService;
private final SeoulAirQualityService seoulAirQualityService;
private ObservatoryResponse observatoryResponse;

@Scheduled(cron = "${schedule.air-quality-api.cron:0 0/1 * * * ?}")
@SchedulerLock(
Expand All @@ -19,6 +20,6 @@ public class AirQualityScheduler {
lockAtLeastFor = "${schedule.air-quality-api.lockAtLeastFor:50m}"
)
public void updateAirQuality(){
airQualityService.updateAriQuality();
seoulAirQualityService.update();
}
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AirQualityResponse implements Serializable {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.programmers.signalbuddyfinal.domain.air_quality.dto;

import lombok.Data;
import java.util.List;


public class Observatory {

@Data
public static class Response {
private Body body;
private Header header;
}

@Data
public static class Body {
private int totalCount;
private List<Item> items;
private int pageNo;
private int numOfRows;
}

@Data
public static class Item {
private String stationCode;
private double tm;
private String addr;
private String stationName;
}

@Data
public static class Header {
private String resultMsg;
private String resultCode;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.programmers.signalbuddyfinal.domain.air_quality.dto;

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class ObservatoryResponse {

private String addr;

private String stationName;

private String stationCode;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package org.programmers.signalbuddyfinal.domain.air_quality.dto;

import lombok.Builder;
import java.util.List;
import lombok.Getter;

@Builder
@Getter
public class RegionAirQuality {
private Response response;

@Builder
@Getter
public static class Response {
private Body body;
private Header header;
}

@Builder
@Getter
public static class Body {
private int totalCount;
private List<Item> items;
private int pageNo;
private int numOfRows;
}

@Builder
@Getter
public static class Item {
private String so2Grade;
private String coFlag;
private String khaiValue;
private String so2Value;
private String coValue;
private String pm25Flag;
private String pm10Flag;
private String pm10Value;
private String o3Grade;
private String khaiGrade;
private String pm25Value;
private String no2Flag;
private String no2Grade;
private String o3Flag;
private String pm25Grade;
private String so2Flag;
private String dataTime;
private String coGrade;
private String no2Value;
private String pm10Grade;
private String o3Value;
}

@Builder
@Getter
public static class Header {
private String resultMsg;
private String resultCode;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package org.programmers.signalbuddyfinal.domain.air_quality.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import java.util.List;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class SeoulAirQuality {

@JsonProperty("list_total_count")
private int totalCount;

@JsonProperty("RESULT")
private Result result;

private List<Item> row;

@Getter
@Builder
@JacksonXmlRootElement(localName = "RESULT")
public static class Result {

@JsonProperty("CODE")
@JacksonXmlProperty(localName = "CODE")
private String code;

@JsonProperty("MESSAGE")
@JacksonXmlProperty(localName = "MESSAGE")
private String message;
}

@Getter
@Builder
public static class Item{

@JsonProperty("GRADE")
private String grade;

@JsonProperty("IDEX_MVL")
private String mvl;

@JsonProperty("POLLUTANT")
private String pollutant;

@JsonProperty("NITROGEN")
private String nitrogen;

@JsonProperty("OZONE")
private String ozone;

@JsonProperty("CARBON")
private String carbon;

@JsonProperty("SULFUROUS")
private String sulfurous;

@JsonProperty("PM10")
private String pm10;

@JsonProperty("PM25")
private String pm25;

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ public enum AirQualityErrorCode implements ErrorCode {

AIR_QUALITY_SERVICE_UNAVAILABLE(HttpStatus.SERVICE_UNAVAILABLE, "20000",
"일시적인 문제로 데이터를 불러올 수 없습니다. 잠시 후 다시 시도해 주세요."),
AIR_QUALITY_DATA_NOT_READ(HttpStatus.INTERNAL_SERVER_ERROR, "20001", "미세먼지 API 데이터 파싱 에러");
AIR_QUALITY_DATA_NOT_READ(HttpStatus.INTERNAL_SERVER_ERROR, "20001", "미세먼지 API 데이터 파싱 에러"),
ALL_AIR_QUALITY_DATA_NOT_READ(HttpStatus.INTERNAL_SERVER_ERROR, "20002", "측정소별 미세먼지 API 데이터 파싱 에러"),
OBSERVATORY_DATA_NOT_READ(HttpStatus.INTERNAL_SERVER_ERROR, "20003", "관측소 API 데이터 파싱 에러");

private HttpStatus httpStatus;
private String code;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.programmers.signalbuddyfinal.domain.air_quality.service;

import org.programmers.signalbuddyfinal.domain.air_quality.dto.AirQualityResponse;
import org.programmers.signalbuddyfinal.domain.air_quality.dto.CachedAirQuality;

public interface AirQualityCache {

CachedAirQuality get(String regionCode);
void save(String key, AirQualityResponse response, boolean fresh);
AirQualityResponse failBackOrThrow(String key);

}
Loading