shjung hace 3 años
padre
commit
124e9a3afb
Se han modificado 21 ficheros con 1155 adiciones y 6 borrados
  1. 4 0
      src/main/java/com/its/api/bis/model/dto/wall/DrawBusMarkerDto.java
  2. 4 4
      src/main/java/com/its/api/its/controller/common/CommonController.java
  3. 1 1
      src/main/java/com/its/api/its/controller/common/CommonSttsController.java
  4. 53 0
      src/main/java/com/its/api/its/controller/weather/WeatherController.java
  5. 13 0
      src/main/java/com/its/api/its/global/CodeManager.java
  6. 169 0
      src/main/java/com/its/api/its/model/dto/weather/TbAtmpPltnRtPnstDto.java
  7. 65 0
      src/main/java/com/its/api/its/model/dto/weather/TbAtmpPltnSttnDto.java
  8. 117 0
      src/main/java/com/its/api/its/model/dto/weather/TbVilgFrcsDto.java
  9. 38 0
      src/main/java/com/its/api/its/model/dto/weather/TbVilgFrcsZoneDto.java
  10. 156 0
      src/main/java/com/its/api/its/model/entity/weather/TbAtmpPltnRtPnst.java
  11. 92 0
      src/main/java/com/its/api/its/model/entity/weather/TbAtmpPltnSttn.java
  12. 157 0
      src/main/java/com/its/api/its/model/entity/weather/TbVilgFrcs.java
  13. 28 0
      src/main/java/com/its/api/its/model/entity/weather/TbVilgFrcsKey.java
  14. 57 0
      src/main/java/com/its/api/its/model/entity/weather/TbVilgFrcsZone.java
  15. 16 0
      src/main/java/com/its/api/its/repository/weather/TbAtmpPltnRtPnstRepository.java
  16. 11 0
      src/main/java/com/its/api/its/repository/weather/TbAtmpPltnSttnRepository.java
  17. 23 0
      src/main/java/com/its/api/its/repository/weather/TbVilgFrcsRepository.java
  18. 11 0
      src/main/java/com/its/api/its/repository/weather/TbVilgFrcsZoneRepository.java
  19. 73 0
      src/main/java/com/its/api/its/service/weather/TbAtmpPltnSttnService.java
  20. 64 0
      src/main/java/com/its/api/its/service/weather/TbVilgFrcsZoneService.java
  21. 3 1
      src/main/resources/mybatis/mapper/bis/BisWallMapper.xml

+ 4 - 0
src/main/java/com/its/api/bis/model/dto/wall/DrawBusMarkerDto.java

@@ -49,6 +49,10 @@ public class DrawBusMarkerDto implements Serializable {
     @JsonProperty("eventcode")
     private String eventcode;
 
+    @ApiModelProperty("")  // Y NUMBER(3)
+    @JsonProperty("eventcodename")
+    private String eventcodename;
+
     @ApiModelProperty("")  // Y NUMBER(0)
     @JsonProperty("coordx")
     private Double coordx;

+ 4 - 4
src/main/java/com/its/api/its/controller/common/CommonController.java

@@ -8,18 +8,18 @@ import com.its.api.its.service.common.CommonService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Slf4j
-@RequiredArgsConstructor
+@Api(tags = "00.공통")
+@Validated
 @RestController
+@RequiredArgsConstructor
 @RequestMapping("/api/its/common")
-@Api(tags = "00.공통")
 public class CommonController {
 
     private final TbClctSystStupService clctSystStupService;

+ 1 - 1
src/main/java/com/its/api/its/controller/common/CommonSttsController.java

@@ -23,7 +23,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.List;
 
-@Api(tags = "00.공통-1.상태조회")
+@Api(tags = "00.공통-01.상태조회")
 @Validated
 @RestController
 @RequiredArgsConstructor

+ 53 - 0
src/main/java/com/its/api/its/controller/weather/WeatherController.java

@@ -0,0 +1,53 @@
+package com.its.api.its.controller.weather;
+
+import com.its.api.its.model.dto.weather.TbAtmpPltnRtPnstDto;
+import com.its.api.its.model.dto.weather.TbAtmpPltnSttnDto;
+import com.its.api.its.model.dto.weather.TbVilgFrcsDto;
+import com.its.api.its.model.dto.weather.TbVilgFrcsZoneDto;
+import com.its.api.its.service.weather.TbAtmpPltnSttnService;
+import com.its.api.its.service.weather.TbVilgFrcsZoneService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "00.공통-02.기상정보")
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api/its/common/weather")
+public class WeatherController {
+
+    private final TbAtmpPltnSttnService atmpService;
+    private final TbVilgFrcsZoneService frcsService;
+
+    @ApiOperation(value = "대기 오염 측정소 정보", response = TbAtmpPltnSttnDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/atmp/list", produces = {"application/json; charset=utf8"})
+    public List<TbAtmpPltnSttnDto> findAllListAtmp() {
+        return this.atmpService.findAllList();
+    }
+
+    @ApiOperation(value = "대기 오염 실시간 현황", response = TbAtmpPltnRtPnstDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/atmp/status", produces = {"application/json; charset=utf8"})
+    public List<TbAtmpPltnRtPnstDto> findAllRealtimeStatusAtmp() {
+        return this.atmpService.findAllRealtimeStatus();
+    }
+
+    @ApiOperation(value = "동네 예보 구역 정보", response = TbVilgFrcsZoneDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/frcs/list", produces = {"application/json; charset=utf8"})
+    public List<TbVilgFrcsZoneDto> findAllListFrcs() {
+        return this.frcsService.findAllList();
+    }
+
+    @ApiOperation(value = "동네 예보 실시간 현황", response = TbVilgFrcsDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/frcs/status", produces = {"application/json; charset=utf8"})
+    public List<TbVilgFrcsDto> findAllRealtimeStatusFrcs() {
+        return this.frcsService.findAllRealtimeStatus();
+    }
+
+}

+ 13 - 0
src/main/java/com/its/api/its/global/CodeManager.java

@@ -8,6 +8,7 @@ import com.its.api.its.service.code.TbCmmnCdService;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.PostConstruct;
@@ -177,4 +178,16 @@ public class CodeManager {
         }
         return defUnknownDesc;
     }
+    public static String getWeatherCode(String CMMN_CD_KOR_NM) {
+        HashMap<String, Code> codeMap = codes.get("DFW");
+        if (codeMap != null) {
+            for (String key : codeMap.keySet()) {
+                Code code = codeMap.get(key);
+                if (StringUtils.equals(code.getDesc(), CMMN_CD_KOR_NM)) {
+                    return code.getCode();
+                }
+            }
+        }
+        return "NB0";
+    }
 }

+ 169 - 0
src/main/java/com/its/api/its/model/dto/weather/TbAtmpPltnRtPnstDto.java

@@ -0,0 +1,169 @@
+package com.its.api.its.model.dto.weather;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+import org.apache.commons.lang.StringUtils;
+
+import javax.persistence.Column;
+import java.io.Serializable;
+
+/**
+ * 대기 오염 실시간 현황 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbAtmpPltnRtPnstDto(대기 오염 실시간 현황)")
+public class TbAtmpPltnRtPnstDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("측정소 번호")  // N NUMBER(10)
+    @JsonProperty("atmp_sttn_nmbr")
+    private Long atmpSttnNmbr;
+
+    @ApiModelProperty("측정 일시")  // Y VARCHAR(14)
+    @JsonProperty("msrm_dt")
+    private String msrmDt;
+
+    @ApiModelProperty("측정 시스템 명")  // Y VARCHAR(10)
+    @JsonProperty("msrm_syst_nm")
+    private String msrmSystNm;
+
+    @ApiModelProperty("CO 값")  // Y VARCHAR(10)
+    @JsonProperty("co_val")
+    private String coVal;
+
+    @ApiModelProperty("SO2 값")  // Y VARCHAR(10)
+    @JsonProperty("so2_val")
+    private String so2Val;
+
+    @ApiModelProperty("NO2 값")  // Y VARCHAR(10)
+    @JsonProperty("no2_val")
+    private String no2Val;
+
+    @ApiModelProperty("O3 값")  // Y VARCHAR(10)
+    @JsonProperty("o3_val")
+    private String o3Val;
+
+    @ApiModelProperty("PM10 값")  // Y VARCHAR(10)
+    @JsonProperty("pm10_val")
+    private String pm10Val;
+
+    @ApiModelProperty("PM10 24시간 값")  // Y VARCHAR(10)
+    @JsonProperty("pm10_24hh_val")
+    private String pm1024hhVal;
+
+    @ApiModelProperty("PM25 값")  // Y VARCHAR(10)
+    @JsonProperty("pm25_val")
+    private String pm25Val;
+
+    @ApiModelProperty("PM25 24시간 값")  // Y VARCHAR(10)
+    @JsonProperty("pm25_24hh_val")
+    private String pm2524hhVal;
+
+    @ApiModelProperty("통합 대기 값")  // Y VARCHAR(10)
+    @JsonProperty("intg_atmp_val")
+    private String intgAtmpVal;
+
+    @ApiModelProperty("통합 대기 등급")  // Y VARCHAR(10)
+    @JsonProperty("intg_atmp_grad")
+    private String intgAtmpGrad;
+
+    @ApiModelProperty("SO2 등급")  // Y VARCHAR(10)
+    @JsonProperty("so2_grad")
+    private String so2Grad;
+
+    @ApiModelProperty("CO 등급")  // Y VARCHAR(10)
+    @JsonProperty("co_grad")
+    private String coGrad;
+
+    @ApiModelProperty("O3 등급")  // Y VARCHAR(10)
+    @JsonProperty("o3_grad")
+    private String o3Grad;
+
+    @ApiModelProperty("NO2 등급")  // Y VARCHAR(10)
+    @JsonProperty("no2_grad")
+    private String no2Grad;
+
+    @ApiModelProperty("PM10 24시간 등급")  // Y VARCHAR(10)
+    @JsonProperty("pm10_24hh_grad")
+    private String pm1024hhGrad;
+
+    @ApiModelProperty("PM25 24시간 등급")  // Y VARCHAR(10)
+    @JsonProperty("pm25_24hh_grad")
+    private String pm2524hhGrad;
+
+    @ApiModelProperty("PM10 1시간 등급")  // Y VARCHAR(10)
+    @JsonProperty("pm10_1hh_grad")
+    private String pm101hhGrad;
+
+    @ApiModelProperty("PM25 1시간 등급")  // Y VARCHAR(10)
+    @JsonProperty("pm25_1hh_grad")
+    private String pm251hhGrad;
+
+    @ApiModelProperty("갱신 일시")  // Y VARCHAR(14)
+    @JsonProperty("updt_dt")
+    private String updtDt;
+
+    // Code Description Field
+    @ApiModelProperty("측정소 명")  // N VARCHAR(30)
+    @Column(name = "ATMP_STTN_NM", nullable = false, length = 30)
+    private String atmpSttnNm;
+
+    @ApiModelProperty("통합 대기 등급 설명")
+    @JsonProperty("intg_atmp_grad_desc")
+    private String intgAtmpGradDesc;
+
+    @ApiModelProperty("SO2 등급 설명")
+    @JsonProperty("so2_grad_desc")
+    private String so2GradDesc;
+
+    @ApiModelProperty("CO 등급 설명")
+    @JsonProperty("co_grad_desc")
+    private String coGradDesc;
+
+    @ApiModelProperty("O3 등급 설명")
+    @JsonProperty("o3_grad_desc")
+    private String o3GradDesc;
+
+    @ApiModelProperty("NO2 등급 설명")
+    @JsonProperty("no2_grad_desc")
+    private String no2GradDesc;
+
+    @ApiModelProperty("PM10 24시간 등급 설명")
+    @JsonProperty("pm10_24hh_grad_desc")
+    private String pm1024hhGradDesc;
+
+    @ApiModelProperty("PM25 24시간 등급 설명")
+    @JsonProperty("pm25_24hh_grad_desc")
+    private String pm2524hhGradDesc;
+
+    @ApiModelProperty("PM10 1시간 등급 설명")
+    @JsonProperty("pm10_1hh_grad_desc")
+    private String pm101hhGradDesc;
+
+    @ApiModelProperty("PM25 1시간 등급 설명")
+    @JsonProperty("pm25_1hh_grad_desc")
+    private String pm251hhGradDesc;
+
+    public String getGradDesc(String grad) {
+        if (StringUtils.equals("1", grad)) return "좋음";
+        if (StringUtils.equals("2", grad)) return "보통";
+        if (StringUtils.equals("3", grad)) return "나쁨";
+        if (StringUtils.equals("4", grad)) return "매우나쁨";
+        return "진행중";
+    }
+    public void setGradDesc() {
+        this.intgAtmpGradDesc = getGradDesc(this.intgAtmpGrad);
+        this.so2GradDesc = getGradDesc(this.so2Grad);
+        this.coGradDesc = getGradDesc(this.coGrad);
+        this.o3GradDesc = getGradDesc(this.o3Grad);
+        this.no2GradDesc = getGradDesc(this.no2Grad);
+        this.pm1024hhGradDesc = getGradDesc(this.pm1024hhGrad);
+        this.pm2524hhGradDesc = getGradDesc(this.pm2524hhGrad);
+        this.pm101hhGradDesc = getGradDesc(this.pm101hhGrad);
+        this.pm251hhGradDesc = getGradDesc(this.pm251hhGrad);
+    }
+}

+ 65 - 0
src/main/java/com/its/api/its/model/dto/weather/TbAtmpPltnSttnDto.java

@@ -0,0 +1,65 @@
+package com.its.api.its.model.dto.weather;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 대기 오염 측정소 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbAtmpPltnSttnDto(대기 오염 측정소)")
+public class TbAtmpPltnSttnDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("측정소 번호")  // N NUMBER(10)
+    @JsonProperty("atmp_sttn_nmbr")
+    private Long atmpSttnNmbr;
+
+    @ApiModelProperty("측정소 명")  // N VARCHAR(30)
+    @JsonProperty("atmp_sttn_nm")
+    private String atmpSttnNm;
+
+    @ApiModelProperty("VMS 표출명")  // N VARCHAR(30)
+    @JsonProperty("vms_disp_nm")
+    private String vmsDispNm;
+
+    @ApiModelProperty("측정소 주소")  // Y VARCHAR(200)
+    @JsonProperty("atmp_sttn_addr")
+    private String atmpSttnAddr;
+
+    @ApiModelProperty("설치 년도")  // Y VARCHAR(4)
+    @JsonProperty("istl_yy")
+    private String istlYy;
+
+    @ApiModelProperty("관리 기관 명")  // Y VARCHAR(100)
+    @JsonProperty("mngm_intn_nm")
+    private String mngmIntnNm;
+
+    @ApiModelProperty("측정 시스템 명")  // Y VARCHAR(10)
+    @JsonProperty("msrm_syst_nm")
+    private String msrmSystNm;
+
+    @ApiModelProperty("측정 항목")  // Y VARCHAR(100)
+    @JsonProperty("msrm_item")
+    private String msrmItem;
+
+    @ApiModelProperty("X 좌표")  // Y NUMBER(11,8)
+    @JsonProperty("x_crdn")
+    private Double xCrdn;
+
+    @ApiModelProperty("Y 좌표")  // Y NUMBER(10,8)
+    @JsonProperty("y_crdn")
+    private Double yCrdn;
+
+    @ApiModelProperty("삭제 여부")  // Y CHAR(1)
+    @JsonProperty("del_yn")
+    private String delYn;
+
+    // Code Description Field
+}

+ 117 - 0
src/main/java/com/its/api/its/model/dto/weather/TbVilgFrcsDto.java

@@ -0,0 +1,117 @@
+package com.its.api.its.model.dto.weather;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 동네 예보 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVilgFrcsDto(동네 예보)")
+public class TbVilgFrcsDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("동네 예보 구역 코드")  // N NUMBER(14)
+    @JsonProperty("vilg_frcs_zone_cd")
+    private Long vilgFrcsZoneCd;
+
+    @ApiModelProperty("발표 일시")  // N VARCHAR(14)
+    @JsonProperty("annc_dt")
+    private String anncDt;
+
+    @ApiModelProperty("순서")  // N NUMBER(3)
+    @JsonProperty("ord")
+    private Integer ord;
+
+    @ApiModelProperty("시간")  // Y NUMBER(3)
+    @JsonProperty("hh")
+    private Integer hh;
+
+    @ApiModelProperty("일")  // Y NUMBER(3)
+    @JsonProperty("dd")
+    private Integer dd;
+
+    @ApiModelProperty("현재 온도")  // Y NUMBER(6,3)
+    @JsonProperty("prst_tmpr")
+    private Double prstTmpr;
+
+    @ApiModelProperty("최고 온도")  // Y NUMBER(6,3)
+    @JsonProperty("hghs_tmpr")
+    private Double hghsTmpr;
+
+    @ApiModelProperty("최저 온도")  // Y NUMBER(6,3)
+    @JsonProperty("lwst_tmpr")
+    private Double lwstTmpr;
+
+    @ApiModelProperty("대기 상태")  // Y NUMBER(2)
+    @JsonProperty("atmp_stts")
+    private Integer atmpStts;
+
+    @ApiModelProperty("날씨 한글 명")  // Y VARCHAR(20)
+    @JsonProperty("wtcd_kor_nm")
+    private String wtcdKorNm;
+
+    @ApiModelProperty("강수 상태")  // Y NUMBER(3)
+    @JsonProperty("prcp_stts")
+    private Integer prcpStts;
+
+    @ApiModelProperty("날씨 영문 명")  // Y VARCHAR(20)
+    @JsonProperty("wtcd_engl_nm")
+    private String wtcdEnglNm;
+
+    @ApiModelProperty("강수 확률")  // Y NUMBER(5,2)
+    @JsonProperty("prcp_pr")
+    private Double prcpPr;
+
+    @ApiModelProperty("예상 강수량 12시간")  // Y NUMBER(5,2)
+    @JsonProperty("estm_pram_12hh")
+    private Double estmPram12hh;
+
+    @ApiModelProperty("예상 눈 량 12시간")  // Y NUMBER(5,2)
+    @JsonProperty("estm_snow_amut_12hh")
+    private Double estmSnowAmut12hh;
+
+    @ApiModelProperty("풍속")  // Y NUMBER(5,2)
+    @JsonProperty("wnsp")
+    private Double wnsp;
+
+    @ApiModelProperty("풍향")  // Y NUMBER(2)
+    @JsonProperty("wndr")
+    private Integer wndr;
+
+    @ApiModelProperty("풍향 한글 명")  // Y VARCHAR(20)
+    @JsonProperty("wndr_kor_nm")
+    private String wndrKorNm;
+
+    @ApiModelProperty("풍향 영문 명")  // Y VARCHAR(20)
+    @JsonProperty("wndr_engl_nm")
+    private String wndrEnglNm;
+
+    @ApiModelProperty("습도")  // Y NUMBER(5,2)
+    @JsonProperty("hmdt")
+    private Double hmdt;
+
+    @ApiModelProperty("예상 강수 량 6시간")  // Y NUMBER(5,2)
+    @JsonProperty("estm_prcp_amut_6hh")
+    private Double estmPrcpAmut6hh;
+
+    @ApiModelProperty("예상 눈 량 6시간")  // Y NUMBER(5,2)
+    @JsonProperty("estm_snow_amut_6hh")
+    private Double estmSnowAmut6hh;
+
+    // Code Description Field
+    @ApiModelProperty("동네 예보 구역 명")  // Y VARCHAR(40)
+    @JsonProperty("vilg_frcs_zone_nm")
+    private String vilgFrcsZoneNm;
+
+    @ApiModelProperty("날씨 한글 명 코드")
+    @JsonProperty("wtcd_kor_cd")
+    private String wtcdKorCd;
+
+}

+ 38 - 0
src/main/java/com/its/api/its/model/dto/weather/TbVilgFrcsZoneDto.java

@@ -0,0 +1,38 @@
+package com.its.api.its.model.dto.weather;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 동네 예보 구역 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbVilgFrcsZoneDto(동네 예보 구역)")
+public class TbVilgFrcsZoneDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("동네 예보 구역 코드")  // N NUMBER(14)
+    @JsonProperty("vilg_frcs_zone_cd")
+    private Long vilgFrcsZoneCd;
+
+    @ApiModelProperty("동네 예보 구역 명")  // Y VARCHAR(40)
+    @JsonProperty("vilg_frcs_zone_nm")
+    private String vilgFrcsZoneNm;
+
+    @ApiModelProperty("")  // Y NUMBER(3)
+    @JsonProperty("gridx")
+    private Integer gridx;
+
+    @ApiModelProperty("")  // Y NUMBER(3)
+    @JsonProperty("gridy")
+    private Integer gridy;
+
+    // Code Description Field
+
+}

+ 156 - 0
src/main/java/com/its/api/its/model/entity/weather/TbAtmpPltnRtPnst.java

@@ -0,0 +1,156 @@
+package com.its.api.its.model.entity.weather;
+
+import com.its.api.its.model.dto.weather.TbAtmpPltnRtPnstDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 대기 오염 실시간 현황 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("대기 오염 실시간 현황")
+@Entity
+@Table(name = "TB_ATMP_PLTN_RT_PNST")
+public class TbAtmpPltnRtPnst implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("측정소 번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "ATMP_STTN_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long atmpSttnNmbr;
+
+    @ApiModelProperty("측정 일시")  // Y VARCHAR(14)
+    @Column(name = "MSRM_DT", length = 14)
+    private String msrmDt;
+
+    @ApiModelProperty("측정 시스템 명")  // Y VARCHAR(10)
+    @Column(name = "MSRM_SYST_NM", length = 10)
+    private String msrmSystNm;
+
+    @ApiModelProperty("CO 값")  // Y VARCHAR(10)
+    @Column(name = "CO_VAL", length = 10)
+    private String coVal;
+
+    @ApiModelProperty("SO2 값")  // Y VARCHAR(10)
+    @Column(name = "SO2_VAL", length = 10)
+    private String so2Val;
+
+    @ApiModelProperty("NO2 값")  // Y VARCHAR(10)
+    @Column(name = "NO2_VAL", length = 10)
+    private String no2Val;
+
+    @ApiModelProperty("O3 값")  // Y VARCHAR(10)
+    @Column(name = "O3_VAL", length = 10)
+    private String o3Val;
+
+    @ApiModelProperty("PM10 값")  // Y VARCHAR(10)
+    @Column(name = "PM10_VAL", length = 10)
+    private String pm10Val;
+
+    @ApiModelProperty("PM10 24시간 값")  // Y VARCHAR(10)
+    @Column(name = "PM10_24HH_VAL", length = 10)
+    private String pm1024hhVal;
+
+    @ApiModelProperty("PM25 값")  // Y VARCHAR(10)
+    @Column(name = "PM25_VAL", length = 10)
+    private String pm25Val;
+
+    @ApiModelProperty("PM25 24시간 값")  // Y VARCHAR(10)
+    @Column(name = "PM25_24HH_VAL", length = 10)
+    private String pm2524hhVal;
+
+    @ApiModelProperty("통합 대기 값")  // Y VARCHAR(10)
+    @Column(name = "INTG_ATMP_VAL", length = 10)
+    private String intgAtmpVal;
+
+    @ApiModelProperty("통합 대기 등급")  // Y VARCHAR(10)
+    @Column(name = "INTG_ATMP_GRAD", length = 10)
+    private String intgAtmpGrad;
+
+    @ApiModelProperty("SO2 등급")  // Y VARCHAR(10)
+    @Column(name = "SO2_GRAD", length = 10)
+    private String so2Grad;
+
+    @ApiModelProperty("CO 등급")  // Y VARCHAR(10)
+    @Column(name = "CO_GRAD", length = 10)
+    private String coGrad;
+
+    @ApiModelProperty("O3 드급")  // Y VARCHAR(10)
+    @Column(name = "O3_GRAD", length = 10)
+    private String o3Grad;
+
+    @ApiModelProperty("NO2 등급")  // Y VARCHAR(10)
+    @Column(name = "NO2_GRAD", length = 10)
+    private String no2Grad;
+
+    @ApiModelProperty("PM10 24시간 등급")  // Y VARCHAR(10)
+    @Column(name = "PM10_24HH_GRAD", length = 10)
+    private String pm1024hhGrad;
+
+    @ApiModelProperty("PM25 24시간 등급")  // Y VARCHAR(10)
+    @Column(name = "PM25_24HH_GRAD", length = 10)
+    private String pm2524hhGrad;
+
+    @ApiModelProperty("PM10 1시간 등급")  // Y VARCHAR(10)
+    @Column(name = "PM10_1HH_GRAD", length = 10)
+    private String pm101hhGrad;
+
+    @ApiModelProperty("PM25 1시간 등급")  // Y VARCHAR(10)
+    @Column(name = "PM25_1HH_GRAD", length = 10)
+    private String pm251hhGrad;
+
+    @ApiModelProperty("갱신 일시")  // Y VARCHAR(14)
+    @Column(name = "UPDT_DT", length = 14)
+    private String updtDt;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="ATMP_STTN_NMBR", referencedColumnName = "ATMP_STTN_NMBR")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbAtmpPltnSttn atmp = new TbAtmpPltnSttn();
+
+    public TbAtmpPltnRtPnstDto toDto() {
+        TbAtmpPltnRtPnstDto dto = TbAtmpPltnRtPnstDto.builder()
+                .atmpSttnNmbr(this.atmpSttnNmbr)
+                .msrmDt(this.msrmDt)
+                .msrmSystNm(this.msrmSystNm)
+                .coVal(this.coVal)
+                .so2Val(this.so2Val)
+                .no2Val(this.no2Val)
+                .o3Val(this.o3Val)
+                .pm10Val(this.pm10Val)
+                .pm1024hhVal(this.pm1024hhVal)
+                .pm25Val(this.pm25Val)
+                .pm2524hhVal(this.pm2524hhVal)
+                .intgAtmpVal(this.intgAtmpVal)
+                .intgAtmpGrad(this.intgAtmpGrad)
+                .so2Grad(this.so2Grad)
+                .coGrad(this.coGrad)
+                .o3Grad(this.o3Grad)
+                .no2Grad(this.no2Grad)
+                .pm1024hhGrad(this.pm1024hhGrad)
+                .pm2524hhGrad(this.pm2524hhGrad)
+                .pm101hhGrad(this.pm101hhGrad)
+                .pm251hhGrad(this.pm251hhGrad)
+                .updtDt(this.updtDt)
+                .build();
+        if (this.atmp != null) {
+            dto.setAtmpSttnNm(this.atmp.getAtmpSttnNm());
+        }
+        dto.setGradDesc();
+        return dto;
+    }
+
+    public TbAtmpPltnRtPnst(Long atmpSttnNmbr) {
+        this.atmpSttnNmbr = atmpSttnNmbr;
+    }
+
+}

+ 92 - 0
src/main/java/com/its/api/its/model/entity/weather/TbAtmpPltnSttn.java

@@ -0,0 +1,92 @@
+package com.its.api.its.model.entity.weather;
+
+import com.its.api.its.model.dto.weather.TbAtmpPltnSttnDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * 대기 오염 측정소 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("대기 오염 측정소")
+@Entity
+@Table(name = "TB_ATMP_PLTN_STTN")
+public class TbAtmpPltnSttn implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("측정소 번호")  // N NUMBER(10)
+    @Id
+    @Column(name = "ATMP_STTN_NMBR", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long atmpSttnNmbr;
+
+    @ApiModelProperty("측정소 명")  // N VARCHAR(30)
+    @Column(name = "ATMP_STTN_NM", nullable = false, length = 30)
+    private String atmpSttnNm;
+
+    @ApiModelProperty("VMS 표출명")  // N VARCHAR(30)
+    @Column(name = "VMS_DISP_NM", nullable = false, length = 30)
+    private String vmsDispNm;
+
+    @ApiModelProperty("측정소 주소")  // Y VARCHAR(200)
+    @Column(name = "ATMP_STTN_ADDR", length = 200)
+    private String atmpSttnAddr;
+
+    @ApiModelProperty("설치 년도")  // Y VARCHAR(4)
+    @Column(name = "ISTL_YY", length = 4)
+    private String istlYy;
+
+    @ApiModelProperty("관리 기관 명")  // Y VARCHAR(100)
+    @Column(name = "MNGM_INTN_NM", length = 100)
+    private String mngmIntnNm;
+
+    @ApiModelProperty("측정 시스템 명")  // Y VARCHAR(10)
+    @Column(name = "MSRM_SYST_NM", length = 10)
+    private String msrmSystNm;
+
+    @ApiModelProperty("측정 항목")  // Y VARCHAR(100)
+    @Column(name = "MSRM_ITEM", length = 100)
+    private String msrmItem;
+
+    @ApiModelProperty("X 좌표")  // Y NUMBER(11,8)
+    @Column(name = "X_CRDN", columnDefinition = "NUMBER", length = 11, precision = 8)
+    private Double xCrdn;
+
+    @ApiModelProperty("Y 좌표")  // Y NUMBER(10,8)
+    @Column(name = "Y_CRDN", columnDefinition = "NUMBER", length = 10, precision = 8)
+    private Double yCrdn;
+
+    @ApiModelProperty("삭제 여부")  // Y CHAR(1)
+    @Column(name = "DEL_YN", columnDefinition = "CHAR", length = 1)
+    private String delYn;
+
+    public TbAtmpPltnSttnDto toDto() {
+        return TbAtmpPltnSttnDto.builder()
+                .atmpSttnNmbr(this.atmpSttnNmbr)
+                .atmpSttnNm(this.atmpSttnNm)
+                .vmsDispNm(this.vmsDispNm)
+                .atmpSttnAddr(this.atmpSttnAddr)
+                .istlYy(this.istlYy)
+                .mngmIntnNm(this.mngmIntnNm)
+                .msrmSystNm(this.msrmSystNm)
+                .msrmItem(this.msrmItem)
+                .xCrdn(this.xCrdn)
+                .yCrdn(this.yCrdn)
+                .delYn(this.delYn)
+                .build();
+    }
+
+    public TbAtmpPltnSttn(Long atmpSttnNmbr) {
+        this.atmpSttnNmbr = atmpSttnNmbr;
+    }
+
+}

+ 157 - 0
src/main/java/com/its/api/its/model/entity/weather/TbVilgFrcs.java

@@ -0,0 +1,157 @@
+package com.its.api.its.model.entity.weather;
+
+import com.its.api.its.global.CodeManager;
+import com.its.api.its.model.dto.weather.TbVilgFrcsDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 동네 예보 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("동네 예보")
+@Entity
+@Table(name = "TB_VILG_FRCS")
+@IdClass(TbVilgFrcsKey.class)
+public class TbVilgFrcs implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("동네 예보 구역 코드")  // N NUMBER(14)
+    @Id
+    @Column(name = "VILG_FRCS_ZONE_CD", nullable = false, columnDefinition = "NUMBER", length = 14)
+    private Long vilgFrcsZoneCd;
+
+    @ApiModelProperty("발표 일시")  // N VARCHAR(14)
+    @Id
+    @Column(name = "ANNC_DT", nullable = false, length = 14)
+    private String anncDt;
+
+    @ApiModelProperty("순서")  // N NUMBER(3)
+    @Id
+    @Column(name = "ORD", nullable = false, columnDefinition = "NUMBER", length = 3)
+    private Integer ord;
+
+    @ApiModelProperty("시간")  // Y NUMBER(3)
+    @Column(name = "HH", columnDefinition = "NUMBER", length = 3)
+    private Integer hh;
+
+    @ApiModelProperty("일")  // Y NUMBER(3)
+    @Column(name = "DD", columnDefinition = "NUMBER", length = 3)
+    private Integer dd;
+
+    @ApiModelProperty("현재 온도")  // Y NUMBER(6,3)
+    @Column(name = "PRST_TMPR", columnDefinition = "NUMBER", length = 6, precision = 3)
+    private Double prstTmpr;
+
+    @ApiModelProperty("최고 온도")  // Y NUMBER(6,3)
+    @Column(name = "HGHS_TMPR", columnDefinition = "NUMBER", length = 6, precision = 3)
+    private Double hghsTmpr;
+
+    @ApiModelProperty("최저 온도")  // Y NUMBER(6,3)
+    @Column(name = "LWST_TMPR", columnDefinition = "NUMBER", length = 6, precision = 3)
+    private Double lwstTmpr;
+
+    @ApiModelProperty("대기 상태")  // Y NUMBER(2)
+    @Column(name = "ATMP_STTS", columnDefinition = "NUMBER", length = 2)
+    private Integer atmpStts;
+
+    @ApiModelProperty("날씨 한글 명")  // Y VARCHAR(20)
+    @Column(name = "WTCD_KOR_NM", length = 20)
+    private String wtcdKorNm;
+
+    @ApiModelProperty("강수 상태")  // Y NUMBER(3)
+    @Column(name = "PRCP_STTS", columnDefinition = "NUMBER", length = 3)
+    private Integer prcpStts;
+
+    @ApiModelProperty("날씨 영문 명")  // Y VARCHAR(20)
+    @Column(name = "WTCD_ENGL_NM", length = 20)
+    private String wtcdEnglNm;
+
+    @ApiModelProperty("강수 확률")  // Y NUMBER(5,2)
+    @Column(name = "PRCP_PR", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double prcpPr;
+
+    @ApiModelProperty("예상 강수량 12시간")  // Y NUMBER(5,2)
+    @Column(name = "ESTM_PRAM_12HH", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double estmPram12hh;
+
+    @ApiModelProperty("예상 눈 량 12시간")  // Y NUMBER(5,2)
+    @Column(name = "ESTM_SNOW_AMUT_12HH", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double estmSnowAmut12hh;
+
+    @ApiModelProperty("풍속")  // Y NUMBER(5,2)
+    @Column(name = "WNSP", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double wnsp;
+
+    @ApiModelProperty("풍향")  // Y NUMBER(2)
+    @Column(name = "WNDR", columnDefinition = "NUMBER", length = 2)
+    private Integer wndr;
+
+    @ApiModelProperty("풍향 한글 명")  // Y VARCHAR(20)
+    @Column(name = "WNDR_KOR_NM", length = 20)
+    private String wndrKorNm;
+
+    @ApiModelProperty("풍향 영문 명")  // Y VARCHAR(20)
+    @Column(name = "WNDR_ENGL_NM", length = 20)
+    private String wndrEnglNm;
+
+    @ApiModelProperty("습도")  // Y NUMBER(5,2)
+    @Column(name = "HMDT", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double hmdt;
+
+    @ApiModelProperty("예상 강수 량 6시간")  // Y NUMBER(5,2)
+    @Column(name = "ESTM_PRCP_AMUT_6HH", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double estmPrcpAmut6hh;
+
+    @ApiModelProperty("예상 눈 량 6시간")  // Y NUMBER(5,2)
+    @Column(name = "ESTM_SNOW_AMUT_6HH", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double estmSnowAmut6hh;
+
+    @OneToOne
+    @JoinColumn(insertable=false, updatable=false, name="VILG_FRCS_ZONE_CD", referencedColumnName = "VILG_FRCS_ZONE_CD")
+    @NotFound(action = NotFoundAction.IGNORE)
+    private TbVilgFrcsZone frcs = new TbVilgFrcsZone();
+
+    public TbVilgFrcsDto toDto() {
+        TbVilgFrcsDto dto = TbVilgFrcsDto.builder()
+                .vilgFrcsZoneCd(this.vilgFrcsZoneCd)
+                .anncDt(this.anncDt)
+                .ord(this.ord)
+                .hh(this.hh)
+                .dd(this.dd)
+                .prstTmpr(this.prstTmpr)
+                .hghsTmpr(this.hghsTmpr)
+                .lwstTmpr(this.lwstTmpr)
+                .atmpStts(this.atmpStts)
+                .wtcdKorNm(this.wtcdKorNm)
+                .prcpStts(this.prcpStts)
+                .wtcdEnglNm(this.wtcdEnglNm)
+                .prcpPr(this.prcpPr)
+                .estmPram12hh(this.estmPram12hh)
+                .estmSnowAmut12hh(this.estmSnowAmut12hh)
+                .wnsp(this.wnsp)
+                .wndr(this.wndr)
+                .wndrKorNm(this.wndrKorNm)
+                .wndrEnglNm(this.wndrEnglNm)
+                .hmdt(this.hmdt)
+                .estmPrcpAmut6hh(this.estmPrcpAmut6hh)
+                .estmSnowAmut6hh(this.estmSnowAmut6hh)
+                .build();
+
+        if (this.frcs != null) {
+            dto.setVilgFrcsZoneNm(this.frcs.getVilgFrcsZoneNm());
+        }
+        dto.setWtcdKorCd(CodeManager.getWeatherCode(this.wtcdKorNm));
+        return dto;
+    }
+
+}

+ 28 - 0
src/main/java/com/its/api/its/model/entity/weather/TbVilgFrcsKey.java

@@ -0,0 +1,28 @@
+package com.its.api.its.model.entity.weather;
+
+import lombok.Data;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 동네 예보 Key Class
+ */
+@Data
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbVilgFrcsKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // VILG_FRCS_ZONE_CD, 동네 예보 구역 코드  // N NUMBER(14)
+    private Long vilgFrcsZoneCd;
+
+    // ANNC_DT, 발표 일시  // N VARCHAR(14)
+    private String anncDt;
+
+    // ORD, 순서  // N NUMBER(3)
+    private Integer ord;
+
+}

+ 57 - 0
src/main/java/com/its/api/its/model/entity/weather/TbVilgFrcsZone.java

@@ -0,0 +1,57 @@
+package com.its.api.its.model.entity.weather;
+
+import com.its.api.its.model.dto.weather.TbVilgFrcsZoneDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import java.io.Serializable;
+
+/**
+ * 동네 예보 구역 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("동네 예보 구역")
+@Entity
+@Table(name = "TB_VILG_FRCS_ZONE")
+public class TbVilgFrcsZone implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("동네 예보 구역 코드")  // N NUMBER(14)
+    @Id
+    @Column(name = "VILG_FRCS_ZONE_CD", nullable = false, columnDefinition = "NUMBER", length = 14)
+    private Long vilgFrcsZoneCd;
+
+    @ApiModelProperty("동네 예보 구역 명")  // Y VARCHAR(40)
+    @Column(name = "VILG_FRCS_ZONE_NM", length = 40)
+    private String vilgFrcsZoneNm;
+
+    @ApiModelProperty("")  // Y NUMBER(3)
+    @Column(name = "gridx", columnDefinition = "NUMBER", length = 3)
+    private Integer gridx;
+
+    @ApiModelProperty("")  // Y NUMBER(3)
+    @Column(name = "gridy", columnDefinition = "NUMBER", length = 3)
+    private Integer gridy;
+
+    public TbVilgFrcsZoneDto toDto() {
+        return TbVilgFrcsZoneDto.builder()
+                .vilgFrcsZoneCd(this.vilgFrcsZoneCd)
+                .vilgFrcsZoneNm(this.vilgFrcsZoneNm)
+                .gridx(this.gridx)
+                .gridy(this.gridy)
+                .build();
+    }
+
+    public TbVilgFrcsZone(Long vilgFrcsZoneCd) {
+        this.vilgFrcsZoneCd = vilgFrcsZoneCd;
+    }
+
+}

+ 16 - 0
src/main/java/com/its/api/its/repository/weather/TbAtmpPltnRtPnstRepository.java

@@ -0,0 +1,16 @@
+package com.its.api.its.repository.weather;
+
+import com.its.api.its.model.entity.weather.TbAtmpPltnRtPnst;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbAtmpPltnRtPnstRepository extends JpaRepository<TbAtmpPltnRtPnst, Long>, JpaSpecificationExecutor<TbAtmpPltnRtPnst> {
+
+    @Query("select p from TbAtmpPltnRtPnst p inner join fetch p.atmp m where m.delYn = 'N' and p.msrmDt >= to_char(sysdate-120/1440, 'YYYYMMDDHH24MISS')")
+    List<TbAtmpPltnRtPnst> findAllList();
+}

+ 11 - 0
src/main/java/com/its/api/its/repository/weather/TbAtmpPltnSttnRepository.java

@@ -0,0 +1,11 @@
+package com.its.api.its.repository.weather;
+
+import com.its.api.its.model.entity.weather.TbAtmpPltnSttn;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TbAtmpPltnSttnRepository extends JpaRepository<TbAtmpPltnSttn, Long>, JpaSpecificationExecutor<TbAtmpPltnSttn> {
+
+}

+ 23 - 0
src/main/java/com/its/api/its/repository/weather/TbVilgFrcsRepository.java

@@ -0,0 +1,23 @@
+package com.its.api.its.repository.weather;
+
+import com.its.api.its.model.entity.weather.TbVilgFrcs;
+import com.its.api.its.model.entity.weather.TbVilgFrcsKey;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface TbVilgFrcsRepository extends JpaRepository<TbVilgFrcs, TbVilgFrcsKey>, JpaSpecificationExecutor<TbVilgFrcs> {
+    
+    @Query("SELECT p FROM TbVilgFrcs p inner join fetch p.frcs m                                                          " +
+            " WHERE (p.vilgFrcsZoneCd, p.anncDt) IN (SELECT h.vilgFrcsZoneCd, MAX(h.anncDt)                               " +
+            "                                              FROM TbVilgFrcs h                                              " +
+            "                                             WHERE h.anncDt >= TO_CHAR(SYSDATE-240/1440,'YYYYMMDDHH24MISS')  " +
+            "                                               AND h.ord = 0                                                 " +
+            "                                             GROUP BY h.vilgFrcsZoneCd)                                      " +
+            "   AND p.ord = 0")
+    List<TbVilgFrcs> findAllList();
+}

+ 11 - 0
src/main/java/com/its/api/its/repository/weather/TbVilgFrcsZoneRepository.java

@@ -0,0 +1,11 @@
+package com.its.api.its.repository.weather;
+
+import com.its.api.its.model.entity.weather.TbVilgFrcsZone;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TbVilgFrcsZoneRepository extends JpaRepository<TbVilgFrcsZone, Long>, JpaSpecificationExecutor<TbVilgFrcsZone> {
+
+}

+ 73 - 0
src/main/java/com/its/api/its/service/weather/TbAtmpPltnSttnService.java

@@ -0,0 +1,73 @@
+package com.its.api.its.service.weather;
+
+import com.its.api.its.model.dto.weather.TbAtmpPltnRtPnstDto;
+import com.its.api.its.model.dto.weather.TbAtmpPltnSttnDto;
+import com.its.api.its.model.entity.weather.TbAtmpPltnRtPnst;
+import com.its.api.its.model.entity.weather.TbAtmpPltnSttn;
+import com.its.api.its.repository.weather.TbAtmpPltnRtPnstRepository;
+import com.its.api.its.repository.weather.TbAtmpPltnSttnRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbAtmpPltnSttnService {
+
+    private final TbAtmpPltnSttnRepository repo;
+    private final TbAtmpPltnRtPnstRepository pnstRepo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbAtmpPltnSttn requireOne(Long id) {
+        return this.repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbAtmpPltnSttnDto> findAll() {
+        List<TbAtmpPltnSttnDto> result = new ArrayList<>();
+        List<TbAtmpPltnSttn> data = this.repo.findAll();
+        for (TbAtmpPltnSttn entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    /**
+     * 대기오염측정소 전체 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbAtmpPltnSttnDto> findAllList() {
+        List<TbAtmpPltnSttnDto> result = new ArrayList<>();
+        List<TbAtmpPltnSttn> data = this.repo.findAll();
+        data.forEach(obj -> {
+            if (StringUtils.equalsIgnoreCase("N", obj.getDelYn())) {
+                result.add(obj.toDto());
+            }
+        });
+        return result;
+    }
+
+    /**
+     * 대기오염 실시간 현황
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbAtmpPltnRtPnstDto> findAllRealtimeStatus() {
+        List<TbAtmpPltnRtPnst> data = this.pnstRepo.findAllList();
+        List<TbAtmpPltnRtPnstDto> result = new ArrayList<>();
+        data.forEach(obj -> {
+            result.add(obj.toDto());
+        });
+        return result;
+    }
+}

+ 64 - 0
src/main/java/com/its/api/its/service/weather/TbVilgFrcsZoneService.java

@@ -0,0 +1,64 @@
+package com.its.api.its.service.weather;
+
+import com.its.api.its.model.dto.weather.TbVilgFrcsDto;
+import com.its.api.its.model.dto.weather.TbVilgFrcsZoneDto;
+import com.its.api.its.model.entity.weather.TbVilgFrcs;
+import com.its.api.its.model.entity.weather.TbVilgFrcsZone;
+import com.its.api.its.repository.weather.TbVilgFrcsRepository;
+import com.its.api.its.repository.weather.TbVilgFrcsZoneRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbVilgFrcsZoneService {
+
+    private final TbVilgFrcsZoneRepository repo;
+    private final TbVilgFrcsRepository frcsRepo;
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbVilgFrcsZoneDto> findAll() {
+        List<TbVilgFrcsZoneDto> result = new ArrayList<>();
+        List<TbVilgFrcsZone> data = this.repo.findAll();
+        for (TbVilgFrcsZone entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    /**
+     * 동네 예보 구역 전체 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbVilgFrcsZoneDto> findAllList() {
+        List<TbVilgFrcsZoneDto> result = new ArrayList<>();
+        List<TbVilgFrcsZone> data = this.repo.findAll();
+        data.forEach(obj -> {
+            result.add(obj.toDto());
+        });
+        return result;
+    }
+
+    /**
+     * 동네 예보 조회
+     * @return
+     */
+    @Transactional(readOnly = true)
+    public List<TbVilgFrcsDto> findAllRealtimeStatus() {
+        List<TbVilgFrcsDto> result = new ArrayList<>();
+        List<TbVilgFrcs> data = this.frcsRepo.findAllList();
+        data.forEach(obj -> {
+            result.add(obj.toDto());
+        });
+        return result;
+    }
+
+}

+ 3 - 1
src/main/resources/mybatis/mapper/bis/BisWallMapper.xml

@@ -111,6 +111,7 @@
                TO_CHAR(T2.COLLECTDATE,'YYYY/MM/DD HH24:MI:SS') AS COLLECTDATE,
                T2.STATIONNAME,
                T2.EVENTCODE,
+               T2.EVENTCODENAME,
                T2.COORDX,
                T2.COORDY
         FROM VEHICLE T1,
@@ -124,7 +125,8 @@
                      B.STATIONTYPE,
                      B.COORDX,
                      B.COORDY,
-                     (SELECT D.BASICCODEINFO FROM CODE_DEFINE D WHERE D.CODEKIND = 'A048' AND C.EVENTCODE = D.BASICCODE) AS EVENTCODE
+                     C.EVENTCODE AS EVENTCODE,
+                     (SELECT D.BASICCODEINFO FROM CODE_DEFINE D WHERE D.CODEKIND = 'A048' AND C.EVENTCODE = D.BASICCODE) AS EVENTCODENAME
               FROM BUS_RUNSTATUS A, BUS_STATION B,
                    (
                        SELECT VEHID,