shjung 3 роки тому
батько
коміт
da83d85cea
24 змінених файлів з 1223 додано та 224 видалено
  1. 80 0
      src/main/java/com/its/api/op/controller/analysis/TbTraf15mStatAnalController.java
  2. 0 51
      src/main/java/com/its/api/op/controller/analysis/TrafHistController.java
  3. 7 4
      src/main/java/com/its/api/op/model/dto/analysis/TbTraf15mStatCountDto.java
  4. 13 0
      src/main/java/com/its/api/op/model/dto/analysis/TbTraf15mStatCountInf.java
  5. 8 5
      src/main/java/com/its/api/op/model/dto/analysis/TbTraf15mStatListDto.java
  6. 13 0
      src/main/java/com/its/api/op/model/dto/analysis/TbTraf15mStatListInf.java
  7. 134 0
      src/main/java/com/its/api/op/model/dto/ifsc/TbIfsc15mStatDto.java
  8. 134 0
      src/main/java/com/its/api/op/model/dto/link/TbLink15mStatDto.java
  9. 134 0
      src/main/java/com/its/api/op/model/dto/road/TbRoad15mStatDto.java
  10. 88 0
      src/main/java/com/its/api/op/model/entity/ifsc/TbIfsc15mStat.java
  11. 25 0
      src/main/java/com/its/api/op/model/entity/ifsc/TbIfsc15mStatKey.java
  12. 88 0
      src/main/java/com/its/api/op/model/entity/link/TbLink15mStat.java
  13. 25 0
      src/main/java/com/its/api/op/model/entity/link/TbLink15mStatKey.java
  14. 88 0
      src/main/java/com/its/api/op/model/entity/road/TbRoad15mStat.java
  15. 25 0
      src/main/java/com/its/api/op/model/entity/road/TbRoad15mStatKey.java
  16. 0 20
      src/main/java/com/its/api/op/repository/analysis/TrafHistMapper.java
  17. 29 0
      src/main/java/com/its/api/op/repository/ifsc/TbIfsc15mStatRepository.java
  18. 29 0
      src/main/java/com/its/api/op/repository/link/TbLink15mStatRepository.java
  19. 29 0
      src/main/java/com/its/api/op/repository/road/TbRoad15mStatRepository.java
  20. 0 60
      src/main/java/com/its/api/op/service/analysis/TrafHistService.java
  21. 90 0
      src/main/java/com/its/api/op/service/ifsc/TbIfsc15mStatService.java
  22. 92 0
      src/main/java/com/its/api/op/service/link/TbLink15mStatService.java
  23. 92 0
      src/main/java/com/its/api/op/service/road/TbRoad15mStatService.java
  24. 0 84
      src/main/resources/mybatis/mapper/analysis/TrafHistMapper.xml

+ 80 - 0
src/main/java/com/its/api/op/controller/analysis/TbTraf15mStatAnalController.java

@@ -0,0 +1,80 @@
+package com.its.api.op.controller.analysis;
+
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountDto;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListDto;
+import com.its.api.op.service.ifsc.TbIfsc15mStatService;
+import com.its.api.op.service.link.TbLink15mStatService;
+import com.its.api.op.service.road.TbRoad15mStatService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+import java.util.List;
+import java.util.NoSuchElementException;
+
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/api/analysis/traf-hs")
+@Api(tags = "04.분석-4.소통정보이력분석")
+public class TbTraf15mStatAnalController {
+
+    private final TbLink15mStatService linkService;
+    private final TbIfsc15mStatService ifscService;
+    private final TbRoad15mStatService roadService;
+
+    @ApiOperation(value = "0.이력목록조회(TB_IFSC_15M_STAT)", response = TbTraf15mStatCountDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/stat", produces = {"application/json; charset=utf8"})
+    public List<TbTraf15mStatCountDto> findAllCountByDateRange(
+            @ApiParam(name = "HIST_TYPE", value = "LINK(링크), IFSC(서비스링크), ROAD(도로)", example = "IFSC", required = true)
+            @RequestParam String HIST_TYPE,
+            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH24MI00)", example = "20210202000000", required = true)
+            @RequestParam String FROM_DT,
+            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH24MI59)", example = "20210202235959", required = true)
+            @RequestParam String TO_DT
+    ) {
+
+        if (HIST_TYPE.equalsIgnoreCase("LINK")) {
+            return this.linkService.findAllCountByDateRange(FROM_DT, TO_DT);
+        }
+        else if (HIST_TYPE.equalsIgnoreCase("IFSC")) {
+            return this.ifscService.findAllCountByDateRange(FROM_DT, TO_DT);
+        }
+        else if (HIST_TYPE.equalsIgnoreCase("ROAD")) {
+            return this.roadService.findAllCountByDateRange(FROM_DT, TO_DT);
+        }
+        else {
+            throw new NoSuchElementException("요청 파라미터가 잘못 됐습니다: " + HIST_TYPE);
+        }
+    }
+
+    @ApiOperation(value = "1.이력데이터조회(TB_IFSC_15M_STAT)", response = TbTraf15mStatListDto.class, responseContainer = "ArrayList")
+    @GetMapping(value = "/hist", produces = {"application/json; charset=utf8"})
+    public List<TbTraf15mStatListDto> findAllDataByDateRange(
+            @ApiParam(name = "HIST_TYPE", value = "LINK(링크), IFSC(서비스링크), ROAD(도로)", example = "IFSC", required = true)
+            @RequestParam String HIST_TYPE,
+            @ApiParam(name = "STAT_DT", value = "이력시각(YYYYMMDDHH24MI00)", example = "20210202000000", required = true)
+            @RequestParam String STAT_DT
+    ) {
+
+        if (HIST_TYPE.equalsIgnoreCase("LINK")) {
+            return this.linkService.findAllDataByDateRange(STAT_DT);
+        }
+        else if (HIST_TYPE.equalsIgnoreCase("IFSC")) {
+            return this.ifscService.findAllDataByDateRange(STAT_DT);
+        }
+        else if (HIST_TYPE.equalsIgnoreCase("ROAD")) {
+            return this.roadService.findAllDataByDateRange(STAT_DT);
+        }
+        else {
+            throw new NoSuchElementException("요청 파라미터가 잘못 됐습니다: " + HIST_TYPE);
+        }
+    }
+
+}

+ 0 - 51
src/main/java/com/its/api/op/controller/analysis/TrafHistController.java

@@ -1,51 +0,0 @@
-package com.its.api.op.controller.analysis;
-
-import com.its.api.op.model.dto.analysis.TrafHistListDto;
-import com.its.api.op.model.dto.analysis.TrafHistDto;
-import com.its.api.op.service.analysis.TrafHistService;
-import io.swagger.annotations.*;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-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;
-
-import java.util.List;
-
-@Slf4j
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/api/analysis/traf-hs")
-@Api(tags = "04.분석-4.소통정보이력분석")
-public class TrafHistController {
-
-    private final TrafHistService service;
-
-    @ApiOperation(value = "0.이력목록조회(TB_IFSC_15M_STAT)", response = TrafHistDto.class, responseContainer = "ArrayList")
-    @GetMapping(value = "/stat", produces = {"application/json; charset=utf8"})
-    public List<TrafHistDto> findAllByDateRange(
-            @ApiParam(name = "HIST_TYPE", value = "LINK(링크), IFSC(서비스링크), ROAD(도로)", example = "IFSC", required = true)
-            @RequestParam String HIST_TYPE,
-            @ApiParam(name = "FROM_DT", value = "조회시작시각(YYYYMMDDHH24MI00)", example = "20220112000000", required = true)
-            @RequestParam String FROM_DT,
-            @ApiParam(name = "TO_DT", value = "조회종료시각(YYYYMMDDHH24MI59)", example = "20220112235959", required = true)
-            @RequestParam String TO_DT
-    ) {
-
-        return this.service.findAllByDateRange(HIST_TYPE, FROM_DT, TO_DT);
-    }
-
-    @ApiOperation(value = "1.이력리스트조회(TB_IFSC_15M_STAT)", response = TrafHistListDto.class, responseContainer = "ArrayList")
-    @GetMapping(value = "/hist", produces = {"application/json; charset=utf8"})
-    public List<TrafHistListDto> findAllByDateRangeList(
-            @ApiParam(name = "HIST_TYPE", value = "LINK(링크), IFSC(서비스링크), ROAD(도로)", example = "IFSC", required = true)
-            @RequestParam String HIST_TYPE,
-            @ApiParam(name = "STAT_DT", value = "이력시각(YYYYMMDDHH24MI00)", example = "20220112235000", required = true)
-            @RequestParam String STAT_DT
-    ) {
-
-        return this.service.findAllByDateRangeList(HIST_TYPE, STAT_DT);
-    }
-
-}

+ 7 - 4
src/main/java/com/its/api/op/model/dto/analysis/TrafHistDto.java → src/main/java/com/its/api/op/model/dto/analysis/TbTraf15mStatCountDto.java

@@ -8,18 +8,21 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 @Data
 @Builder
 @AllArgsConstructor
 @NoArgsConstructor
-@ApiModel("TrafHistDto(교통정보이력 분석 목록 정보)")
-public class TrafHistDto {
+@ApiModel("TbTraf15mStatCountDto(교통정보이력 분석 목록 정보)")
+public class TbTraf15mStatCountDto implements Serializable {
+    private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("통계시각")
     @JsonProperty("stat_dt")
-    private String STAT_DT;         // 통계시각
+    private String statDt;         // 통계시각
     @ApiModelProperty("데이터 건수")
     @JsonProperty("data_cnt")
-    private int    DATA_CNT;        // 데이터 건수
+    private int    dataCnt;        // 데이터 건수
 
 }

+ 13 - 0
src/main/java/com/its/api/op/model/dto/analysis/TbTraf15mStatCountInf.java

@@ -0,0 +1,13 @@
+package com.its.api.op.model.dto.analysis;
+
+import java.math.BigDecimal;
+
+/**
+ * 교통정보이력 분석 목록 정보 Interface Class
+ */
+public interface TbTraf15mStatCountInf {
+
+    String getStatDt();
+    BigDecimal getDataCnt();
+
+}

+ 8 - 5
src/main/java/com/its/api/op/model/dto/analysis/TrafHistListDto.java → src/main/java/com/its/api/op/model/dto/analysis/TbTraf15mStatListDto.java

@@ -8,20 +8,23 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
+
 @Data
 @Builder
 @AllArgsConstructor
 @NoArgsConstructor
-@ApiModel("TrafHistListDto(교통정보이력 분석 목록 데이터 정보)")
-public class TrafHistListDto {
+@ApiModel("TbTraf15mStatListDto(교통정보이력 분석 데이터 정보)")
+public class TbTraf15mStatListDto implements Serializable {
+    private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("LINK, IFSC, ROAD ID")
     @JsonProperty("id")
-    private String ID;
+    private Long id;
     @ApiModelProperty("소통등급코드")
     @JsonProperty("cmtr_grad_cd")
-    private String CMTR_GRAD_CD;
+    private String cmtrGradCd;
     @ApiModelProperty("속도")
     @JsonProperty("sped")
-    private int    SPED;
+    private int    sped;
 }

+ 13 - 0
src/main/java/com/its/api/op/model/dto/analysis/TbTraf15mStatListInf.java

@@ -0,0 +1,13 @@
+package com.its.api.op.model.dto.analysis;
+
+import java.math.BigDecimal;
+
+/**
+ * 교통정보이력 분석 데이터 정보 Interface Class
+ */
+public interface TbTraf15mStatListInf {
+
+    BigDecimal getId();
+    String getCmtrGradCd();
+    BigDecimal getSped();
+}

+ 134 - 0
src/main/java/com/its/api/op/model/dto/ifsc/TbIfsc15mStatDto.java

@@ -0,0 +1,134 @@
+package com.its.api.op.model.dto.ifsc;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.api.op.model.entity.ifsc.TbIfsc15mStat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 정보제공구간 15분 통계 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbIfsc15mStatDto(정보제공구간 15분 통계)")
+public class TbIfsc15mStatDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("정보제공구간 ID")  // N NUMBER(10)
+    @JsonProperty("ifsc_id")
+    private Long ifscId;
+
+    @ApiModelProperty("통계 일시")  // N VARCHAR(14)
+    @JsonProperty("stat_dt")
+    private String statDt;
+
+    @ApiModelProperty("요일 유형 코드")  // Y VARCHAR(7)
+    @JsonProperty("day_type_cd")
+    private String dayTypeCd;
+
+    @ApiModelProperty("교통량")  // Y NUMBER(6)
+    @JsonProperty("tfvl")
+    private Integer tfvl;
+
+    @ApiModelProperty("속도")  // Y NUMBER(3)
+    @JsonProperty("sped")
+    private Integer sped;
+
+    @ApiModelProperty("점유 율")  // Y NUMBER(5,2)
+    @JsonProperty("ocpy_rate")
+    private Double ocpyRate;
+
+    @ApiModelProperty("통행 시간")  // Y NUMBER(6)
+    @JsonProperty("trvl_hh")
+    private Integer trvlHh;
+
+    @ApiModelProperty("데이터 개수")  // Y NUMBER(3)
+    @JsonProperty("data_num")
+    private Integer dataNum;
+
+    // Code Description Field
+    @ApiModelProperty("요일 유형 코드 설명")
+    @JsonProperty("day_type_desc")    // DAY_TYPE_CD
+    private String dayTypeDesc;
+
+    @ApiModel("TbIfsc15mStatUpdReq(정보제공구간 15분 통계 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbIfsc15mStatUpdReq {
+
+        @ApiModelProperty("정보제공구간 ID, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("ifsc_id")
+        @Positive
+        private Long ifscId;
+
+        @ApiModelProperty("통계 일시, Nullable = N, VARCHAR(14)")  // N VARCHAR(14)
+        @JsonProperty("stat_dt")
+        @Size(min=1, max=14)
+        private String statDt;
+
+        @ApiModelProperty("요일 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("day_type_cd")
+        @Size(min=1, max=7)
+        private String dayTypeCd;
+
+        @ApiModelProperty("교통량, Nullable = Y, NUMBER(6)")  // Y NUMBER(6)
+        @JsonProperty("tfvl")
+        @Positive
+        private Integer tfvl;
+
+        @ApiModelProperty("속도, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("sped")
+        @Positive
+        private Integer sped;
+
+        @ApiModelProperty("점유 율, , NUMBER(5,2)")  // Y NUMBER(5,2)
+        @JsonProperty("ocpy_rate")
+        private Double ocpyRate;
+
+        @ApiModelProperty("통행 시간, Nullable = Y, NUMBER(6)")  // Y NUMBER(6)
+        @JsonProperty("trvl_hh")
+        @Positive
+        private Integer trvlHh;
+
+        @ApiModelProperty("데이터 개수, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("data_num")
+        @Positive
+        private Integer dataNum;
+
+        @Builder
+        public TbIfsc15mStatUpdReq(Long ifsc_id, String stat_dt, String day_type_cd, Integer tfvl, Integer sped, Double ocpy_rate, Integer trvl_hh, Integer data_num) {
+            this.ifscId = ifsc_id;
+            this.statDt = stat_dt;
+            this.dayTypeCd = day_type_cd;
+            this.tfvl = tfvl;
+            this.sped = sped;
+            this.ocpyRate = ocpy_rate;
+            this.trvlHh = trvl_hh;
+            this.dataNum = data_num;
+        }
+
+        public TbIfsc15mStat toEntity() {
+            TbIfsc15mStat entity = TbIfsc15mStat.builder()
+                    .ifscId(this.ifscId)
+                    .statDt(this.statDt)
+                    .dayTypeCd(this.dayTypeCd)
+                    .tfvl(this.tfvl)
+                    .sped(this.sped)
+                    .ocpyRate(this.ocpyRate)
+                    .trvlHh(this.trvlHh)
+                    .dataNum(this.dataNum)
+                    .build();
+
+            return entity;
+        }
+
+    }
+
+}

+ 134 - 0
src/main/java/com/its/api/op/model/dto/link/TbLink15mStatDto.java

@@ -0,0 +1,134 @@
+package com.its.api.op.model.dto.link;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.api.op.model.entity.link.TbLink15mStat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 링크 15분 통계 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbLink15mStatDto(링크 15분 통계)")
+public class TbLink15mStatDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("링크ID")  // N NUMBER(10)
+    @JsonProperty("link_id")
+    private Long linkId;
+
+    @ApiModelProperty("통계 일시")  // N VARCHAR(14)
+    @JsonProperty("stat_dt")
+    private String statDt;
+
+    @ApiModelProperty("요일 유형 코드")  // Y VARCHAR(7)
+    @JsonProperty("day_type_cd")
+    private String dayTypeCd;
+
+    @ApiModelProperty("교통량")  // Y NUMBER(6)
+    @JsonProperty("tfvl")
+    private Integer tfvl;
+
+    @ApiModelProperty("속도")  // Y NUMBER(3)
+    @JsonProperty("sped")
+    private Integer sped;
+
+    @ApiModelProperty("점유 율")  // Y NUMBER(5,2)
+    @JsonProperty("ocpy_rate")
+    private Double ocpyRate;
+
+    @ApiModelProperty("통행 시간")  // Y NUMBER(6)
+    @JsonProperty("trvl_hh")
+    private Integer trvlHh;
+
+    @ApiModelProperty("데이터 개수")  // Y NUMBER(3)
+    @JsonProperty("data_num")
+    private Integer dataNum;
+
+    // Code Description Field
+    @ApiModelProperty("요일 유형 코드 설명")
+    @JsonProperty("day_type_desc")    // DAY_TYPE_CD
+    private String dayTypeDesc;
+
+    @ApiModel("TbLink15mStatUpdReq(링크 15분 통계 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbLink15mStatUpdReq {
+
+        @ApiModelProperty("링크ID, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("link_id")
+        @Positive
+        private Long linkId;
+
+        @ApiModelProperty("통계 일시, Nullable = N, VARCHAR(14)")  // N VARCHAR(14)
+        @JsonProperty("stat_dt")
+        @Size(min=1, max=14)
+        private String statDt;
+
+        @ApiModelProperty("요일 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("day_type_cd")
+        @Size(min=1, max=7)
+        private String dayTypeCd;
+
+        @ApiModelProperty("교통량, Nullable = Y, NUMBER(6)")  // Y NUMBER(6)
+        @JsonProperty("tfvl")
+        @Positive
+        private Integer tfvl;
+
+        @ApiModelProperty("속도, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("sped")
+        @Positive
+        private Integer sped;
+
+        @ApiModelProperty("점유 율, , NUMBER(5,2)")  // Y NUMBER(5,2)
+        @JsonProperty("ocpy_rate")
+        private Double ocpyRate;
+
+        @ApiModelProperty("통행 시간, Nullable = Y, NUMBER(6)")  // Y NUMBER(6)
+        @JsonProperty("trvl_hh")
+        @Positive
+        private Integer trvlHh;
+
+        @ApiModelProperty("데이터 개수, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("data_num")
+        @Positive
+        private Integer dataNum;
+
+        @Builder
+        public TbLink15mStatUpdReq(Long link_id, String stat_dt, String day_type_cd, Integer tfvl, Integer sped, Double ocpy_rate, Integer trvl_hh, Integer data_num) {
+            this.linkId = link_id;
+            this.statDt = stat_dt;
+            this.dayTypeCd = day_type_cd;
+            this.tfvl = tfvl;
+            this.sped = sped;
+            this.ocpyRate = ocpy_rate;
+            this.trvlHh = trvl_hh;
+            this.dataNum = data_num;
+        }
+
+        public TbLink15mStat toEntity() {
+            TbLink15mStat entity = TbLink15mStat.builder()
+                    .linkId(this.linkId)
+                    .statDt(this.statDt)
+                    .dayTypeCd(this.dayTypeCd)
+                    .tfvl(this.tfvl)
+                    .sped(this.sped)
+                    .ocpyRate(this.ocpyRate)
+                    .trvlHh(this.trvlHh)
+                    .dataNum(this.dataNum)
+                    .build();
+
+            return entity;
+        }
+
+    }
+
+}

+ 134 - 0
src/main/java/com/its/api/op/model/dto/road/TbRoad15mStatDto.java

@@ -0,0 +1,134 @@
+package com.its.api.op.model.dto.road;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.its.api.op.model.entity.road.TbRoad15mStat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.validation.constraints.Positive;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+
+/**
+ * 도로 15분 통계 DTO Class
+ */
+@Data
+@Builder
+@ApiModel("TbRoad15mStatDto(도로 15분 통계)")
+public class TbRoad15mStatDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("도로 ID")  // N NUMBER(10)
+    @JsonProperty("road_id")
+    private Long roadId;
+
+    @ApiModelProperty("통계 일시")  // N VARCHAR(14)
+    @JsonProperty("stat_dt")
+    private String statDt;
+
+    @ApiModelProperty("요일 유형 코드")  // Y VARCHAR(7)
+    @JsonProperty("day_type_cd")
+    private String dayTypeCd;
+
+    @ApiModelProperty("교통량")  // Y NUMBER(6)
+    @JsonProperty("tfvl")
+    private Integer tfvl;
+
+    @ApiModelProperty("속도")  // Y NUMBER(3)
+    @JsonProperty("sped")
+    private Integer sped;
+
+    @ApiModelProperty("점유 율")  // Y NUMBER(5,2)
+    @JsonProperty("ocpy_rate")
+    private Double ocpyRate;
+
+    @ApiModelProperty("통행 시간")  // Y NUMBER(6)
+    @JsonProperty("trvl_hh")
+    private Integer trvlHh;
+
+    @ApiModelProperty("데이터 개수")  // Y NUMBER(3)
+    @JsonProperty("data_num")
+    private Integer dataNum;
+
+    // Code Description Field
+    @ApiModelProperty("요일 유형 코드 설명")
+    @JsonProperty("day_type_desc")    // DAY_TYPE_CD
+    private String dayTypeDesc;
+
+    @ApiModel("TbRoad15mStatUpdReq(도로 15분 통계 정보변경)")
+    @Getter
+    @Setter
+    @ToString
+    @NoArgsConstructor(access = AccessLevel.PROTECTED)
+    public static class TbRoad15mStatUpdReq {
+
+        @ApiModelProperty("도로 ID, Nullable = N, NUMBER(10)")  // N NUMBER(10)
+        @JsonProperty("road_id")
+        @Positive
+        private Long roadId;
+
+        @ApiModelProperty("통계 일시, Nullable = N, VARCHAR(14)")  // N VARCHAR(14)
+        @JsonProperty("stat_dt")
+        @Size(min=1, max=14)
+        private String statDt;
+
+        @ApiModelProperty("요일 유형 코드, Nullable = Y, VARCHAR(7)")  // Y VARCHAR(7)
+        @JsonProperty("day_type_cd")
+        @Size(min=1, max=7)
+        private String dayTypeCd;
+
+        @ApiModelProperty("교통량, Nullable = Y, NUMBER(6)")  // Y NUMBER(6)
+        @JsonProperty("tfvl")
+        @Positive
+        private Integer tfvl;
+
+        @ApiModelProperty("속도, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("sped")
+        @Positive
+        private Integer sped;
+
+        @ApiModelProperty("점유 율, , NUMBER(5,2)")  // Y NUMBER(5,2)
+        @JsonProperty("ocpy_rate")
+        private Double ocpyRate;
+
+        @ApiModelProperty("통행 시간, Nullable = Y, NUMBER(6)")  // Y NUMBER(6)
+        @JsonProperty("trvl_hh")
+        @Positive
+        private Integer trvlHh;
+
+        @ApiModelProperty("데이터 개수, Nullable = Y, NUMBER(3)")  // Y NUMBER(3)
+        @JsonProperty("data_num")
+        @Positive
+        private Integer dataNum;
+
+        @Builder
+        public TbRoad15mStatUpdReq(Long road_id, String stat_dt, String day_type_cd, Integer tfvl, Integer sped, Double ocpy_rate, Integer trvl_hh, Integer data_num) {
+            this.roadId = road_id;
+            this.statDt = stat_dt;
+            this.dayTypeCd = day_type_cd;
+            this.tfvl = tfvl;
+            this.sped = sped;
+            this.ocpyRate = ocpy_rate;
+            this.trvlHh = trvl_hh;
+            this.dataNum = data_num;
+        }
+
+        public TbRoad15mStat toEntity() {
+            TbRoad15mStat entity = TbRoad15mStat.builder()
+                    .roadId(this.roadId)
+                    .statDt(this.statDt)
+                    .dayTypeCd(this.dayTypeCd)
+                    .tfvl(this.tfvl)
+                    .sped(this.sped)
+                    .ocpyRate(this.ocpyRate)
+                    .trvlHh(this.trvlHh)
+                    .dataNum(this.dataNum)
+                    .build();
+
+            return entity;
+        }
+
+    }
+
+}

+ 88 - 0
src/main/java/com/its/api/op/model/entity/ifsc/TbIfsc15mStat.java

@@ -0,0 +1,88 @@
+package com.its.api.op.model.entity.ifsc;
+
+import com.its.api.op.model.dto.ifsc.TbIfsc15mStatDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 정보제공구간 15분 통계 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("정보제공구간 15분 통계")
+@Entity
+@Table(name = "TB_IFSC_15M_STAT")
+@IdClass(TbIfsc15mStatKey.class)
+public class TbIfsc15mStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("정보제공구간 ID")  // N NUMBER(10)
+    @Id
+    @Column(name = "IFSC_ID", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long ifscId;
+
+    @ApiModelProperty("통계 일시")  // N VARCHAR(14)
+    @Id
+    @Column(name = "STAT_DT", nullable = false, length = 14)
+    private String statDt;
+
+    @ApiModelProperty("요일 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "DAY_TYPE_CD", length = 7)
+    private String dayTypeCd;
+
+    @ApiModelProperty("교통량")  // Y NUMBER(6)
+    @Column(name = "TFVL", columnDefinition = "NUMBER", length = 6)
+    private Integer tfvl;
+
+    @ApiModelProperty("속도")  // Y NUMBER(3)
+    @Column(name = "SPED", columnDefinition = "NUMBER", length = 3)
+    private Integer sped;
+
+    @ApiModelProperty("점유 율")  // Y NUMBER(5,2)
+    @Column(name = "OCPY_RATE", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double ocpyRate;
+
+    @ApiModelProperty("통행 시간")  // Y NUMBER(6)
+    @Column(name = "TRVL_HH", columnDefinition = "NUMBER", length = 6)
+    private Integer trvlHh;
+
+    @ApiModelProperty("데이터 개수")  // Y NUMBER(3)
+    @Column(name = "DATA_NUM", columnDefinition = "NUMBER", length = 3)
+    private Integer dataNum;
+
+    public TbIfsc15mStatDto toDto() {
+        TbIfsc15mStatDto dto = TbIfsc15mStatDto.builder()
+                .ifscId(this.ifscId)
+                .statDt(this.statDt)
+                .dayTypeCd(this.dayTypeCd)
+                .tfvl(this.tfvl)
+                .sped(this.sped)
+                .ocpyRate(this.ocpyRate)
+                .trvlHh(this.trvlHh)
+                .dataNum(this.dataNum)
+                .build();
+
+        return dto;
+    }
+
+    public TbIfsc15mStat(Long ifscId, String statDt) {
+        this.ifscId = ifscId;
+        this.statDt = statDt;
+    }
+
+    public void updateInfo(TbIfsc15mStatDto.TbIfsc15mStatUpdReq req) {
+        this.dayTypeCd = req.getDayTypeCd();
+        this.tfvl = req.getTfvl();
+        this.sped = req.getSped();
+        this.ocpyRate = req.getOcpyRate();
+        this.trvlHh = req.getTrvlHh();
+        this.dataNum = req.getDataNum();
+    }
+
+}

+ 25 - 0
src/main/java/com/its/api/op/model/entity/ifsc/TbIfsc15mStatKey.java

@@ -0,0 +1,25 @@
+package com.its.api.op.model.entity.ifsc;
+
+import lombok.Data;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 정보제공구간 15분 통계 Key Class
+ */
+@Data
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbIfsc15mStatKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // IFSC_ID, 정보제공구간 ID  // N NUMBER(10)
+    private Long ifscId;
+
+    // STAT_DT, 통계 일시  // N VARCHAR(14)
+    private String statDt;
+
+}

+ 88 - 0
src/main/java/com/its/api/op/model/entity/link/TbLink15mStat.java

@@ -0,0 +1,88 @@
+package com.its.api.op.model.entity.link;
+
+import com.its.api.op.model.dto.link.TbLink15mStatDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 링크 15분 통계 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("링크 15분 통계")
+@Entity
+@Table(name = "TB_LINK_15M_STAT")
+@IdClass(TbLink15mStatKey.class)
+public class TbLink15mStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("링크ID")  // N NUMBER(10)
+    @Id
+    @Column(name = "LINK_ID", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long linkId;
+
+    @ApiModelProperty("통계 일시")  // N VARCHAR(14)
+    @Id
+    @Column(name = "STAT_DT", nullable = false, length = 14)
+    private String statDt;
+
+    @ApiModelProperty("요일 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "DAY_TYPE_CD", length = 7)
+    private String dayTypeCd;
+
+    @ApiModelProperty("교통량")  // Y NUMBER(6)
+    @Column(name = "TFVL", columnDefinition = "NUMBER", length = 6)
+    private Integer tfvl;
+
+    @ApiModelProperty("속도")  // Y NUMBER(3)
+    @Column(name = "SPED", columnDefinition = "NUMBER", length = 3)
+    private Integer sped;
+
+    @ApiModelProperty("점유 율")  // Y NUMBER(5,2)
+    @Column(name = "OCPY_RATE", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double ocpyRate;
+
+    @ApiModelProperty("통행 시간")  // Y NUMBER(6)
+    @Column(name = "TRVL_HH", columnDefinition = "NUMBER", length = 6)
+    private Integer trvlHh;
+
+    @ApiModelProperty("데이터 개수")  // Y NUMBER(3)
+    @Column(name = "DATA_NUM", columnDefinition = "NUMBER", length = 3)
+    private Integer dataNum;
+
+    public TbLink15mStatDto toDto() {
+        TbLink15mStatDto dto = TbLink15mStatDto.builder()
+                .linkId(this.linkId)
+                .statDt(this.statDt)
+                .dayTypeCd(this.dayTypeCd)
+                .tfvl(this.tfvl)
+                .sped(this.sped)
+                .ocpyRate(this.ocpyRate)
+                .trvlHh(this.trvlHh)
+                .dataNum(this.dataNum)
+                .build();
+
+        return dto;
+    }
+
+    public TbLink15mStat(Long linkId, String statDt) {
+        this.linkId = linkId;
+        this.statDt = statDt;
+    }
+
+    public void updateInfo(TbLink15mStatDto.TbLink15mStatUpdReq req) {
+        this.dayTypeCd = req.getDayTypeCd();
+        this.tfvl = req.getTfvl();
+        this.sped = req.getSped();
+        this.ocpyRate = req.getOcpyRate();
+        this.trvlHh = req.getTrvlHh();
+        this.dataNum = req.getDataNum();
+    }
+
+}

+ 25 - 0
src/main/java/com/its/api/op/model/entity/link/TbLink15mStatKey.java

@@ -0,0 +1,25 @@
+package com.its.api.op.model.entity.link;
+
+import lombok.Data;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 링크 15분 통계 Key Class
+ */
+@Data
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbLink15mStatKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // LINK_ID, 링크ID  // N NUMBER(10)
+    private Long linkId;
+
+    // STAT_DT, 통계 일시  // N VARCHAR(14)
+    private String statDt;
+
+}

+ 88 - 0
src/main/java/com/its/api/op/model/entity/road/TbRoad15mStat.java

@@ -0,0 +1,88 @@
+package com.its.api.op.model.entity.road;
+
+import com.its.api.op.model.dto.road.TbRoad15mStatDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * 도로 15분 통계 Entity Class
+ */
+@Getter
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@Builder
+@AllArgsConstructor
+@ApiModel("도로 15분 통계")
+@Entity
+@Table(name = "TB_ROAD_15M_STAT")
+@IdClass(TbRoad15mStatKey.class)
+public class TbRoad15mStat implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("도로 ID")  // N NUMBER(10)
+    @Id
+    @Column(name = "ROAD_ID", nullable = false, columnDefinition = "NUMBER", length = 10)
+    private Long roadId;
+
+    @ApiModelProperty("통계 일시")  // N VARCHAR(14)
+    @Id
+    @Column(name = "STAT_DT", nullable = false, length = 14)
+    private String statDt;
+
+    @ApiModelProperty("요일 유형 코드")  // Y VARCHAR(7)
+    @Column(name = "DAY_TYPE_CD", length = 7)
+    private String dayTypeCd;
+
+    @ApiModelProperty("교통량")  // Y NUMBER(6)
+    @Column(name = "TFVL", columnDefinition = "NUMBER", length = 6)
+    private Integer tfvl;
+
+    @ApiModelProperty("속도")  // Y NUMBER(3)
+    @Column(name = "SPED", columnDefinition = "NUMBER", length = 3)
+    private Integer sped;
+
+    @ApiModelProperty("점유 율")  // Y NUMBER(5,2)
+    @Column(name = "OCPY_RATE", columnDefinition = "NUMBER", length = 5, precision = 2)
+    private Double ocpyRate;
+
+    @ApiModelProperty("통행 시간")  // Y NUMBER(6)
+    @Column(name = "TRVL_HH", columnDefinition = "NUMBER", length = 6)
+    private Integer trvlHh;
+
+    @ApiModelProperty("데이터 개수")  // Y NUMBER(3)
+    @Column(name = "DATA_NUM", columnDefinition = "NUMBER", length = 3)
+    private Integer dataNum;
+
+    public TbRoad15mStatDto toDto() {
+        TbRoad15mStatDto dto = TbRoad15mStatDto.builder()
+                .roadId(this.roadId)
+                .statDt(this.statDt)
+                .dayTypeCd(this.dayTypeCd)
+                .tfvl(this.tfvl)
+                .sped(this.sped)
+                .ocpyRate(this.ocpyRate)
+                .trvlHh(this.trvlHh)
+                .dataNum(this.dataNum)
+                .build();
+
+        return dto;
+    }
+
+    public TbRoad15mStat(Long roadId, String statDt) {
+        this.roadId = roadId;
+        this.statDt = statDt;
+    }
+
+    public void updateInfo(TbRoad15mStatDto.TbRoad15mStatUpdReq req) {
+        this.dayTypeCd = req.getDayTypeCd();
+        this.tfvl = req.getTfvl();
+        this.sped = req.getSped();
+        this.ocpyRate = req.getOcpyRate();
+        this.trvlHh = req.getTrvlHh();
+        this.dataNum = req.getDataNum();
+    }
+
+}

+ 25 - 0
src/main/java/com/its/api/op/model/entity/road/TbRoad15mStatKey.java

@@ -0,0 +1,25 @@
+package com.its.api.op.model.entity.road;
+
+import lombok.Data;
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import lombok.AllArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 도로 15분 통계 Key Class
+ */
+@Data
+@NoArgsConstructor(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class TbRoad15mStatKey implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    // ROAD_ID, 도로 ID  // N NUMBER(10)
+    private Long roadId;
+
+    // STAT_DT, 통계 일시  // N VARCHAR(14)
+    private String statDt;
+
+}

+ 0 - 20
src/main/java/com/its/api/op/repository/analysis/TrafHistMapper.java

@@ -1,20 +0,0 @@
-package com.its.api.op.repository.analysis;
-
-import com.its.api.op.model.dto.analysis.TrafHistListDto;
-import com.its.api.op.model.dto.analysis.TrafHistDto;
-import org.apache.ibatis.annotations.Mapper;
-
-import java.util.List;
-import java.util.Map;
-
-@Mapper
-public interface TrafHistMapper {
-
-    List<TrafHistDto> findAllByDateRangeLINK(Map<String, String> param);
-    List<TrafHistDto> findAllByDateRangeIFSC(Map<String, String> param);
-    List<TrafHistDto> findAllByDateRangeROAD(Map<String, String> param);
-
-    List<TrafHistListDto> findAllByDateRangeListLINK(Map<String, String> param);
-    List<TrafHistListDto> findAllByDateRangeListIFSC(Map<String, String> param);
-    List<TrafHistListDto> findAllByDateRangeListROAD(Map<String, String> param);
-}

+ 29 - 0
src/main/java/com/its/api/op/repository/ifsc/TbIfsc15mStatRepository.java

@@ -0,0 +1,29 @@
+package com.its.api.op.repository.ifsc;
+
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountInf;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListInf;
+import com.its.api.op.model.entity.ifsc.TbIfsc15mStat;
+import com.its.api.op.model.entity.ifsc.TbIfsc15mStatKey;
+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 TbIfsc15mStatRepository extends JpaRepository<TbIfsc15mStat, TbIfsc15mStatKey>, JpaSpecificationExecutor<TbIfsc15mStat> {
+
+    @Query("select p.statDt as statDt, count(p.ifscId) as dataCnt from TbIfsc15mStat p where p.statDt between :fromDt and :toDt group by p.statDt")
+    List<TbTraf15mStatCountInf> findAllCountByDateRange(String fromDt, String toDt);
+
+    @Query( "select b.ifscId as id, nvl(c.cmtrGradCd, 'LTC0') as cmtrGradCd, b.sped as sped " +
+            "  from TbIfsc a, TbIfsc15mStat b, TbCmtrGradClsf c " +
+            " where a.delYn  = 'N' " +
+            "   and a.ifscId = b.ifscId " +
+            "   and a.sectGradCd = c.sectGradCd " +
+            "   and (b.sped >= c.lwstTrvlSped and b.sped <= c.hghsTrvlSped) " +
+            "   and b.statDt = :statDt"
+    )
+    List<TbTraf15mStatListInf> findAllDataByDateRange(String statDt);
+}

+ 29 - 0
src/main/java/com/its/api/op/repository/link/TbLink15mStatRepository.java

@@ -0,0 +1,29 @@
+package com.its.api.op.repository.link;
+
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountInf;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListInf;
+import com.its.api.op.model.entity.link.TbLink15mStat;
+import com.its.api.op.model.entity.link.TbLink15mStatKey;
+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 TbLink15mStatRepository extends JpaRepository<TbLink15mStat, TbLink15mStatKey>, JpaSpecificationExecutor<TbLink15mStat> {
+
+    @Query("select p.statDt as statDt, count(p.linkId) as dataCnt from TbLink15mStat p where p.statDt between :fromDt and :toDt group by p.statDt")
+    List<TbTraf15mStatCountInf> findAllCountByDateRange(String fromDt, String toDt);
+
+    @Query( "select b.linkId as id, nvl(c.cmtrGradCd, 'LTC0') as cmtrGradCd, b.sped as sped " +
+            "  from TbLink a, TbLink15mStat b, TbCmtrGradClsf c " +
+            " where a.delYn  = 'N' " +
+            "   and a.linkId = b.linkId " +
+            "   and a.sectGradCd = c.sectGradCd " +
+            "   and (b.sped >= c.lwstTrvlSped and b.sped <= c.hghsTrvlSped) " +
+            "   and b.statDt = :statDt"
+    )
+    List<TbTraf15mStatListInf> findAllDataByDateRange(String statDt);
+}

+ 29 - 0
src/main/java/com/its/api/op/repository/road/TbRoad15mStatRepository.java

@@ -0,0 +1,29 @@
+package com.its.api.op.repository.road;
+
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountInf;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListInf;
+import com.its.api.op.model.entity.road.TbRoad15mStat;
+import com.its.api.op.model.entity.road.TbRoad15mStatKey;
+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 TbRoad15mStatRepository extends JpaRepository<TbRoad15mStat, TbRoad15mStatKey>, JpaSpecificationExecutor<TbRoad15mStat> {
+
+    @Query("select p.statDt as statDt, count(p.roadId) as dataCnt from TbRoad15mStat p where p.statDt between :fromDt and :toDt group by p.statDt")
+    List<TbTraf15mStatCountInf> findAllCountByDateRange(String fromDt, String toDt);
+
+    @Query( "select b.roadId as id, nvl(c.cmtrGradCd, 'LTC0') as cmtrGradCd, b.sped as sped " +
+            "  from TbRoad a, TbRoad15mStat b, TbCmtrGradClsf c " +
+            " where a.delYn  = 'N' " +
+            "   and a.roadId = b.roadId " +
+            "   and a.sectGradCd = c.sectGradCd " +
+            "   and (b.sped >= c.lwstTrvlSped and b.sped <= c.hghsTrvlSped) " +
+            "   and b.statDt = :statDt"
+    )
+    List<TbTraf15mStatListInf> findAllDataByDateRange(String statDt);
+}

+ 0 - 60
src/main/java/com/its/api/op/service/analysis/TrafHistService.java

@@ -1,60 +0,0 @@
-package com.its.api.op.service.analysis;
-
-import com.its.api.op.model.dto.analysis.TrafHistDto;
-import com.its.api.op.model.dto.analysis.TrafHistListDto;
-import com.its.api.op.repository.analysis.TrafHistMapper;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-
-@Slf4j
-@RequiredArgsConstructor
-@Service
-public class TrafHistService {
-
-    private final TrafHistMapper mapper;
-
-    public List<TrafHistDto> findAllByDateRange(String HIST_TYPE, String fromDt, String toDt) {
-
-        Map<String, String> param = new HashMap<>();
-        param.put("FROM_DT", fromDt);
-        param.put("TO_DT", toDt);
-
-        if (HIST_TYPE.equalsIgnoreCase("LINK")) {
-            return this.mapper.findAllByDateRangeLINK(param);
-        }
-        else if (HIST_TYPE.equalsIgnoreCase("IFSC")) {
-            return this.mapper.findAllByDateRangeIFSC(param);
-        }
-        else if (HIST_TYPE.equalsIgnoreCase("ROAD")) {
-            return this.mapper.findAllByDateRangeROAD(param);
-        }
-        else {
-            throw new NoSuchElementException("요청 파라미터가 잘못 됐습니다: " + HIST_TYPE + ", " + param);
-        }
-    }
-
-    public List<TrafHistListDto> findAllByDateRangeList(String HIST_TYPE, String statDt) {
-
-        Map<String, String> param = new HashMap<>();
-        param.put("STAT_DT", statDt);
-        
-        if (HIST_TYPE.equalsIgnoreCase("LINK")) {
-            return this.mapper.findAllByDateRangeListLINK(param);
-        }
-        else if (HIST_TYPE.equalsIgnoreCase("IFSC")) {
-            return this.mapper.findAllByDateRangeListIFSC(param);
-        }
-        else if (HIST_TYPE.equalsIgnoreCase("ROAD")) {
-            return this.mapper.findAllByDateRangeListROAD(param);
-        }
-        else {
-            throw new NoSuchElementException("요청 파라미터가 잘못 됐습니다: " + HIST_TYPE + ", " + param);
-        }
-    }
-}

+ 90 - 0
src/main/java/com/its/api/op/service/ifsc/TbIfsc15mStatService.java

@@ -0,0 +1,90 @@
+package com.its.api.op.service.ifsc;
+
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountDto;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountInf;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListDto;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListInf;
+import com.its.api.op.model.dto.ifsc.TbIfsc15mStatDto;
+import com.its.api.op.model.entity.ifsc.TbIfsc15mStat;
+import com.its.api.op.model.entity.ifsc.TbIfsc15mStatKey;
+import com.its.api.op.repository.ifsc.TbIfsc15mStatRepository;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbIfsc15mStatService {
+
+    private final TbIfsc15mStatRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbIfsc15mStat requireOne(TbIfsc15mStatKey id) {
+        return this.repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbIfsc15mStatDto> findAll() {
+        List<TbIfsc15mStatDto> result = new ArrayList<>();
+        List<TbIfsc15mStat> data = this.repo.findAll();
+        for (TbIfsc15mStat entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbIfsc15mStatDto findById(TbIfsc15mStatKey id) {
+        TbIfsc15mStat entity = requireOne(id);
+        return entity.toDto();
+    }
+
+    /**
+     * 통계/분석: 소통정보 이력분석-데이터 건수 조회
+     * @param fromDt
+     * @param toDt
+     * @return
+     */
+    public List<TbTraf15mStatCountDto> findAllCountByDateRange(String fromDt, String toDt) {
+
+        List<TbTraf15mStatCountDto> result = new ArrayList<>();
+        List<TbTraf15mStatCountInf> data = this.repo.findAllCountByDateRange(fromDt, toDt);
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(TbTraf15mStatCountDto.builder()
+                        .statDt(obj.getStatDt())
+                        .dataCnt(obj.getDataCnt().intValue())
+                        .build());
+            });
+        }
+        return result;
+    }
+
+    /**
+     * 통계/분석: 소통정보 이력분석-이력 데이터 조회
+     * @param statDt
+     * @return
+     */
+    public List<TbTraf15mStatListDto> findAllDataByDateRange(String statDt) {
+
+        List<TbTraf15mStatListDto> result = new ArrayList<>();
+        List<TbTraf15mStatListInf> data = this.repo.findAllDataByDateRange(statDt);
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(TbTraf15mStatListDto.builder()
+                        .id(obj.getId().longValue())
+                        .cmtrGradCd(obj.getCmtrGradCd())
+                        .sped(obj.getSped().intValue())
+                        .build());
+            });
+        }
+        return result;
+    }
+}

+ 92 - 0
src/main/java/com/its/api/op/service/link/TbLink15mStatService.java

@@ -0,0 +1,92 @@
+package com.its.api.op.service.link;
+
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountDto;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountInf;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListDto;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListInf;
+import com.its.api.op.model.dto.link.TbLink15mStatDto;
+import com.its.api.op.model.entity.link.TbLink15mStat;
+import com.its.api.op.model.entity.link.TbLink15mStatKey;
+import com.its.api.op.repository.link.TbLink15mStatRepository;
+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;
+import java.util.NoSuchElementException;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbLink15mStatService {
+
+    private final TbLink15mStatRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbLink15mStat requireOne(TbLink15mStatKey id) {
+        return this.repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbLink15mStatDto> findAll() {
+        List<TbLink15mStatDto> result = new ArrayList<>();
+        List<TbLink15mStat> data = this.repo.findAll();
+        for (TbLink15mStat entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbLink15mStatDto findById(TbLink15mStatKey id) {
+        TbLink15mStat entity = requireOne(id);
+        return entity.toDto();
+    }
+
+    /**
+     * 통계/분석: 소통정보 이력분석-데이터 건수 조회
+     * @param fromDt
+     * @param toDt
+     * @return
+     */
+    public List<TbTraf15mStatCountDto> findAllCountByDateRange(String fromDt, String toDt) {
+
+        List<TbTraf15mStatCountDto> result = new ArrayList<>();
+        List<TbTraf15mStatCountInf> data = this.repo.findAllCountByDateRange(fromDt, toDt);
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(TbTraf15mStatCountDto.builder()
+                        .statDt(obj.getStatDt())
+                        .dataCnt(obj.getDataCnt().intValue())
+                        .build());
+            });
+        }
+        return result;
+    }
+
+    /**
+     * 통계/분석: 소통정보 이력분석-이력 데이터 조회
+     * @param statDt
+     * @return
+     */
+    public List<TbTraf15mStatListDto> findAllDataByDateRange(String statDt) {
+
+        List<TbTraf15mStatListDto> result = new ArrayList<>();
+        List<TbTraf15mStatListInf> data = this.repo.findAllDataByDateRange(statDt);
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(TbTraf15mStatListDto.builder()
+                        .id(obj.getId().longValue())
+                        .cmtrGradCd(obj.getCmtrGradCd())
+                        .sped(obj.getSped().intValue())
+                        .build());
+            });
+        }
+        return result;
+    }
+}

+ 92 - 0
src/main/java/com/its/api/op/service/road/TbRoad15mStatService.java

@@ -0,0 +1,92 @@
+package com.its.api.op.service.road;
+
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountDto;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatCountInf;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListDto;
+import com.its.api.op.model.dto.analysis.TbTraf15mStatListInf;
+import com.its.api.op.model.dto.road.TbRoad15mStatDto;
+import com.its.api.op.model.entity.road.TbRoad15mStat;
+import com.its.api.op.model.entity.road.TbRoad15mStatKey;
+import com.its.api.op.repository.road.TbRoad15mStatRepository;
+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;
+import java.util.NoSuchElementException;
+
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class TbRoad15mStatService {
+
+    private final TbRoad15mStatRepository repo;
+
+    // 데이터 1건 조회, 없으면 exception
+    private TbRoad15mStat requireOne(TbRoad15mStatKey id) {
+        return this.repo.findById(id)
+                .orElseThrow(() -> new NoSuchElementException("데이터가 존재하지 않습니다: " + id));
+    }
+
+    // 전체 데이터 조회
+    @Transactional(readOnly = true)
+    public List<TbRoad15mStatDto> findAll() {
+        List<TbRoad15mStatDto> result = new ArrayList<>();
+        List<TbRoad15mStat> data = this.repo.findAll();
+        for (TbRoad15mStat entity : data) {
+            result.add(entity.toDto());
+        }
+        return result;
+    }
+
+    // 데이터 1건 조회(기존 데이터가 반드시 존재해야 함)
+    @Transactional(readOnly = true)
+    public TbRoad15mStatDto findById(TbRoad15mStatKey id) {
+        TbRoad15mStat entity = requireOne(id);
+        return entity.toDto();
+    }
+
+    /**
+     * 통계/분석: 소통정보 이력분석-데이터 건수 조회
+     * @param fromDt
+     * @param toDt
+     * @return
+     */
+    public List<TbTraf15mStatCountDto> findAllCountByDateRange(String fromDt, String toDt) {
+
+        List<TbTraf15mStatCountDto> result = new ArrayList<>();
+        List<TbTraf15mStatCountInf> data = this.repo.findAllCountByDateRange(fromDt, toDt);
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(TbTraf15mStatCountDto.builder()
+                        .statDt(obj.getStatDt())
+                        .dataCnt(obj.getDataCnt().intValue())
+                        .build());
+            });
+        }
+        return result;
+    }
+
+    /**
+     * 통계/분석: 소통정보 이력분석-이력 데이터 조회
+     * @param statDt
+     * @return
+     */
+    public List<TbTraf15mStatListDto> findAllDataByDateRange(String statDt) {
+
+        List<TbTraf15mStatListDto> result = new ArrayList<>();
+        List<TbTraf15mStatListInf> data = this.repo.findAllDataByDateRange(statDt);
+        if (data != null) {
+            data.forEach(obj -> {
+                result.add(TbTraf15mStatListDto.builder()
+                        .id(obj.getId().longValue())
+                        .cmtrGradCd(obj.getCmtrGradCd())
+                        .sped(obj.getSped().intValue())
+                        .build());
+            });
+        }
+        return result;
+    }
+}

+ 0 - 84
src/main/resources/mybatis/mapper/analysis/TrafHistMapper.xml

@@ -1,84 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
-<mapper namespace="com.its.api.op.repository.analysis.TrafHistMapper">
-
-    <select id="findAllByDateRangeLINK" parameterType="java.util.HashMap" resultType="com.its.api.op.model.dto.analysis.TrafHistDto">
-        <![CDATA[
-        SELECT A.STAT_DT, COUNT(A.LINK_ID) AS DATA_CNT
-        FROM TB_LINK_15M_STAT A, TB_LINK B
-        WHERE B.DEL_YN = 'N'
-          AND A.LINK_ID = B.LINK_ID
-          AND A.STAT_DT BETWEEN #{FROM_DT} AND #{TO_DT}
-        GROUP BY A.STAT_DT
-        ORDER BY A.STAT_DT
-        ]]>
-    </select>
-
-    <select id="findAllByDateRangeIFSC" parameterType="java.util.HashMap" resultType="com.its.api.op.model.dto.analysis.TrafHistDto">
-        <![CDATA[
-        SELECT A.STAT_DT, COUNT(A.IFSC_ID) AS DATA_CNT
-        FROM TB_IFSC_15M_STAT A, TB_IFSC B
-        WHERE B.DEL_YN = 'N'
-          AND A.IFSC_ID = B.IFSC_ID
-          AND A.STAT_DT BETWEEN #{FROM_DT} AND #{TO_DT}
-        GROUP BY A.STAT_DT
-        ORDER BY A.STAT_DT
-        ]]>
-    </select>
-
-    <select id="findAllByDateRangeROAD" parameterType="java.util.HashMap" resultType="com.its.api.op.model.dto.analysis.TrafHistDto">
-        <![CDATA[
-        SELECT A.STAT_DT, COUNT(A.ROAD_ID) AS DATA_CNT
-        FROM TB_ROAD_15M_STAT A, TB_ROAD B
-        WHERE B.DEL_YN = 'N'
-          AND A.ROAD_ID = B.ROAD_ID
-          AND A.STAT_DT BETWEEN #{FROM_DT} AND #{TO_DT}
-        GROUP BY A.STAT_DT
-        ORDER BY A.STAT_DT
-        ]]>
-    </select>
-
-    <select id="findAllByDateRangeListLINK" parameterType="java.util.HashMap" resultType="com.its.api.op.model.dto.analysis.TrafHistListDto">
-        <![CDATA[
-        SELECT A.LINK_ID AS ID, NVL(B.CMTR_GRAD_CD, 'LTC0') AS CMTR_GRAD_CD, C.SPED
-        FROM TB_LINK           A,
-             TB_CMTR_GRAD_CLSF B,
-             TB_LINK_15M_STAT  C
-        WHERE A.DEL_YN       = 'N'
-          AND A.LINK_ID      = C.LINK_ID
-          AND A.SECT_GRAD_CD = B.SECT_GRAD_CD
-          AND (C.SPED >= B.LWST_TRVL_SPED AND C.SPED <= B.HGHS_TRVL_SPED)
-          AND STAT_DT =  #{STAT_DT}
-        ]]>
-    </select>
-
-    <select id="findAllByDateRangeListIFSC" parameterType="java.util.HashMap" resultType="com.its.api.op.model.dto.analysis.TrafHistListDto">
-        <![CDATA[
-        SELECT A.IFSC_ID AS ID, NVL(B.CMTR_GRAD_CD, 'LTC0') AS CMTR_GRAD_CD, C.SPED
-        FROM TB_IFSC           A,
-             TB_CMTR_GRAD_CLSF B,
-             TB_IFSC_15M_STAT  C
-        WHERE A.DEL_YN       = 'N'
-          AND A.IFSC_ID      = C.IFSC_ID
-          AND A.SECT_GRAD_CD = B.SECT_GRAD_CD
-          AND (C.SPED >= B.LWST_TRVL_SPED AND C.SPED <= B.HGHS_TRVL_SPED)
-          AND STAT_DT =  #{STAT_DT}
-        ]]>
-    </select>
-
-    <select id="findAllByDateRangeListROAD" parameterType="java.util.HashMap" resultType="com.its.api.op.model.dto.analysis.TrafHistListDto">
-        <![CDATA[
-        SELECT A.ROAD_ID AS ID, NVL(B.CMTR_GRAD_CD, 'LTC0') AS CMTR_GRAD_CD, C.SPED
-        FROM TB_ROAD           A,
-             TB_CMTR_GRAD_CLSF B,
-             TB_ROAD_15M_STAT  C
-        WHERE A.DEL_YN       = 'N'
-          AND A.ROAD_ID      = C.ROAD_ID
-          AND A.SECT_GRAD_CD = B.SECT_GRAD_CD
-          AND (C.SPED >= B.LWST_TRVL_SPED AND C.SPED <= B.HGHS_TRVL_SPED)
-          AND STAT_DT =  #{STAT_DT}
-        ]]>
-    </select>
-
-</mapper>