瀏覽代碼

dwdb 4,5min process add

HANTE 2 月之前
父節點
當前提交
9bcf0d0dbb
共有 24 個文件被更改,包括 1973 次插入45 次删除
  1. 3 3
      utic-common/src/main/java/com/utic/common/utils/LogUtils.java
  2. 4 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/UticDwdbServerApplication.java
  3. 4 7
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/aspect/LoggingAspect.java
  4. 24 7
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/config/ThreadPoolInitializer.java
  5. 1 1
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs01DController.java
  6. 1 1
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs01HController.java
  7. 8 1
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs04MController.java
  8. 8 1
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs05MController.java
  9. 8 1
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs15MController.java
  10. 15 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobMapper.java
  11. 18 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs04MMapper.java
  12. 77 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs05MMapper.java
  13. 23 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/CodeValueDto.java
  14. 20 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/HolidayDto.java
  15. 30 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/StatTimeDto.java
  16. 6 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/scheduler/DwdbJobPrcsScheduler.java
  17. 7 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/AbstractProcessService.java
  18. 122 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs04MService.java
  19. 532 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs05MService.java
  20. 122 0
      utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs15MService.java
  21. 1 23
      utic-dwdb-server/src/main/resources/logback-spring.xml
  22. 34 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobMapper.xml
  23. 127 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs04MMapper.xml
  24. 778 0
      utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs05MMapper.xml

+ 3 - 3
utic-common/src/main/java/com/utic/common/utils/LogUtils.java

@@ -32,17 +32,17 @@ public class LogUtils {
     }
 
     public static String elapsedLog(String logMsg, int count, long elapsedTime) {
-        String adjustedMsg = adjustLogMsg(logMsg, 36);
+        String adjustedMsg = adjustLogMsg(logMsg, 38);
         DecimalFormat df = new DecimalFormat("#,###");
         return String.format("%s: [%8s ms, %8s EA]", adjustedMsg, df.format(elapsedTime), df.format(count));
     }
     public static String elapsedLog(String logMsg) {
-        String adjustedMsg = adjustLogMsg(logMsg, 36);
+        String adjustedMsg = adjustLogMsg(logMsg, 38);
         DecimalFormat df = new DecimalFormat("#,###");
         return String.format("%s", adjustedMsg);
     }
     public static String elapsedLog(String logMsg, long elapsedTime) {
-        String adjustedMsg = adjustLogMsg(logMsg, 36);
+        String adjustedMsg = adjustLogMsg(logMsg, 38);
         DecimalFormat df = new DecimalFormat("#,###");
         return String.format("%s: [%8s ms]", adjustedMsg, df.format(elapsedTime));
     }

+ 4 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/UticDwdbServerApplication.java

@@ -2,6 +2,7 @@ package com.utic.dwdb.server;
 
 import com.utic.common.spring.SpringUtils;
 import com.utic.dwdb.server.config.ApplicationConfig;
+import com.utic.dwdb.server.controller.DwdbJobPrcs15MController;
 import com.utic.dwdb.server.service.ProcessStateService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.DisposableBean;
@@ -59,6 +60,9 @@ public class UticDwdbServerApplication implements CommandLineRunner, Application
         ProcessStateService processStateService = SpringUtils.getBean(ProcessStateService.class);
         processStateService.processStart();
 
+        DwdbJobPrcs15MController dwdbJobProcControl = SpringUtils.getBean(DwdbJobPrcs15MController.class);
+        dwdbJobProcControl.run();
+
         applicationConfig.setStartSchedule(true);
 
         Runtime.getRuntime().addShutdownHook(new Thread(() -> {

+ 4 - 7
utic-dwdb-server/src/main/java/com/utic/dwdb/server/aspect/LoggingAspect.java

@@ -3,15 +3,12 @@ package com.utic.dwdb.server.aspect;
 import com.utic.common.utils.Elapsed;
 import lombok.extern.slf4j.Slf4j;
 import org.aspectj.lang.ProceedingJoinPoint;
-import org.aspectj.lang.annotation.Around;
-import org.aspectj.lang.annotation.Aspect;
-import org.springframework.stereotype.Component;
 
 @Slf4j
-@Aspect
-@Component
+//@Aspect
+//@Component
 public class LoggingAspect {
-    @Around("@annotation(com.utic.common.annotation.ScheduleElapsed)")
+//    @Around("@annotation(com.utic.common.annotation.ScheduleElapsed)")
     public Object scheduleElapsedTime(ProceedingJoinPoint joinPoint) throws Throwable {
 
         String proceedName = String.format("%45s", joinPoint.getTarget().getClass().getSimpleName() + "." + joinPoint.getSignature().getName());
@@ -20,7 +17,7 @@ public class LoggingAspect {
         log.info("{}: {}", proceedName, Elapsed.elapsedStr(elapsed.nanoSeconds()));
         return proceed;
     }
-    @Around("@annotation(com.utic.common.annotation.ProcessElapsed)")
+//    @Around("@annotation(com.utic.common.annotation.ProcessElapsed)")
     public Object processElapsedTime(ProceedingJoinPoint joinPoint) throws Throwable {
         String proceedName = String.format("%45s", joinPoint.getTarget().getClass().getSimpleName() + "." + joinPoint.getSignature().getName());
         Elapsed elapsed = new Elapsed();

+ 24 - 7
utic-dwdb-server/src/main/java/com/utic/dwdb/server/config/ThreadPoolInitializer.java

@@ -4,11 +4,14 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
 import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
 import javax.annotation.PostConstruct;
+import java.util.concurrent.Executor;
 
 @Slf4j
 @Getter
@@ -18,19 +21,33 @@ import javax.annotation.PostConstruct;
 @ConfigurationProperties(prefix = "application.thread-pool")
 public class ThreadPoolInitializer extends AsyncConfigurerSupport {
 
-    private int work = 0;
-    private int dbms = 0;
+    private int schedule = 0;
 
     @PostConstruct
     private void init() {
         int MAX_CORE = Math.max(8, Runtime.getRuntime().availableProcessors());
-        if (this.work <= 0) {
-            this.work = MAX_CORE;
-        }
-        if (this.dbms <= 0) {
-            this.dbms = MAX_CORE;
+        if (this.schedule <= 0) {
+            this.schedule = MAX_CORE;
         }
         log.info("{}", this);
     }
 
+    public ThreadPoolTaskExecutor getDefaultExecutor(int poolSize) {
+        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
+        threadPoolTaskExecutor.setCorePoolSize(poolSize);              // 인스턴스 되면서 기본적으로 띄울 스레드 개수.
+        // 아무작업이 없어도 corePoolSize 만큼 스레드가 생성
+        threadPoolTaskExecutor.setMaxPoolSize(poolSize*2);   // 풀 최대개수, Queue Capacity 까지 꽉차는 경우 maxPoolSize 만큼 넓혀감
+        threadPoolTaskExecutor.setQueueCapacity(2000);          // 스레드 대기큐, Queue Capacity 가 꽉차면 스레드가 추가로 생성됨. Async 처리시 Queue Size
+        // (설정하지 않으면 Integer.MAX 이기 때문에 성능에 문제가 발생함)
+        return threadPoolTaskExecutor;
+    }
+
+    @Bean(name="scheduleExecutor")
+    public Executor getScheduleExecutor() {
+        ThreadPoolTaskExecutor threadPoolTaskExecutor = getDefaultExecutor(this.schedule);
+        threadPoolTaskExecutor.setThreadNamePrefix("schedule-pool-");
+        threadPoolTaskExecutor.initialize();
+        return threadPoolTaskExecutor;
+    }
+
 }

+ 1 - 1
utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs01DController.java

@@ -19,6 +19,6 @@ public class DwdbJobPrcs01DController implements AbstractProcessController {
         stopWatch.start("DwdbJobPrcs01DController");
         log.info("[SCHEDULE] >>>>> {}: [{}]", LogUtils.elapsedLog("1일 실행주기 작업 시작"), TimeUtils.getCurrentTimeString());
         stopWatch.stop();
-        log.info("[SCHEDULE] <<<<< {}: [{} ms]", LogUtils.elapsedLog("1일 실행주기 작업 완료"), stopWatch.getTotalTimeMillis());
+        log.info("[SCHEDULE] <<<<< {}", LogUtils.elapsedLog("1일 실행주기 작업 완료", stopWatch.getTotalTimeMillis()));
     }
 }

+ 1 - 1
utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs01HController.java

@@ -19,6 +19,6 @@ public class DwdbJobPrcs01HController implements AbstractProcessController {
         stopWatch.start("DwdbJobPrcs01HController");
         log.info("[SCHEDULE] >>>>> {}: [{}]", LogUtils.elapsedLog("1시간 실행주기 작업 시작"), TimeUtils.getCurrentTimeString());
         stopWatch.stop();
-        log.info("[SCHEDULE] <<<<< {}: [{} ms]", LogUtils.elapsedLog("1시간 실행주기 작업 완료"), stopWatch.getTotalTimeMillis());
+        log.info("[SCHEDULE] <<<<< {}", LogUtils.elapsedLog("1시간 실행주기 작업 완료", stopWatch.getTotalTimeMillis()));
     }
 }

+ 8 - 1
utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs04MController.java

@@ -2,6 +2,7 @@ package com.utic.dwdb.server.controller;
 
 import com.utic.common.utils.LogUtils;
 import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.service.DwdbJobPrcs04MService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
@@ -11,6 +12,9 @@ import org.springframework.util.StopWatch;
 @Controller
 @RequiredArgsConstructor
 public class DwdbJobPrcs04MController implements AbstractProcessController {
+
+    private final DwdbJobPrcs04MService dwdbJobPrcs04MService;
+
     public void initialize() {
     }
 
@@ -18,7 +22,10 @@ public class DwdbJobPrcs04MController implements AbstractProcessController {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start("DwdbJobPrcs04MController");
         log.info("[SCHEDULE] >>>>> {}: [{}]", LogUtils.elapsedLog("정주기 4분 실행주기 작업 시작"), TimeUtils.getCurrentTimeString());
+
+        this.dwdbJobPrcs04MService.processing();
+
         stopWatch.stop();
-        log.info("[SCHEDULE] <<<<< {}: [{} ms]", LogUtils.elapsedLog("정주기 4분 실행주기 작업 완료"), stopWatch.getTotalTimeMillis());
+        log.info("[SCHEDULE] <<<<< {}", LogUtils.elapsedLog("정주기 4분 실행주기 작업 완료", stopWatch.getTotalTimeMillis()));
     }
 }

+ 8 - 1
utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs05MController.java

@@ -2,6 +2,7 @@ package com.utic.dwdb.server.controller;
 
 import com.utic.common.utils.LogUtils;
 import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.service.DwdbJobPrcs05MService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
@@ -11,6 +12,9 @@ import org.springframework.util.StopWatch;
 @Controller
 @RequiredArgsConstructor
 public class DwdbJobPrcs05MController implements AbstractProcessController {
+
+    private final DwdbJobPrcs05MService dwdbJobPrcs05MService;
+
     public void initialize() {
     }
 
@@ -18,7 +22,10 @@ public class DwdbJobPrcs05MController implements AbstractProcessController {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start("DwdbJobPrcs05MController");
         log.info("[SCHEDULE] >>>>> {}: [{}]", LogUtils.elapsedLog("정주기 5분 실행주기 작업 시작"), TimeUtils.getCurrentTimeString());
+
+        this.dwdbJobPrcs05MService.processing();
+
         stopWatch.stop();
-        log.info("[SCHEDULE] <<<<< {}: [{} ms]", LogUtils.elapsedLog("정주기 5분 실행주기 작업 완료"), stopWatch.getTotalTimeMillis());
+        log.info("[SCHEDULE] <<<<< {}", LogUtils.elapsedLog("정주기 5분 실행주기 작업 완료", stopWatch.getTotalTimeMillis()));
     }
 }

+ 8 - 1
utic-dwdb-server/src/main/java/com/utic/dwdb/server/controller/DwdbJobPrcs15MController.java

@@ -2,6 +2,7 @@ package com.utic.dwdb.server.controller;
 
 import com.utic.common.utils.LogUtils;
 import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.service.DwdbJobPrcs15MService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Controller;
@@ -11,6 +12,9 @@ import org.springframework.util.StopWatch;
 @Controller
 @RequiredArgsConstructor
 public class DwdbJobPrcs15MController implements AbstractProcessController {
+
+    private final DwdbJobPrcs15MService dwdbJobPrcs15MService;
+
     public void initialize() {
     }
 
@@ -18,7 +22,10 @@ public class DwdbJobPrcs15MController implements AbstractProcessController {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start("DwdbJobPrcs15MController");
         log.info("[SCHEDULE] >>>>> {}: [{}]", LogUtils.elapsedLog("정주기 15분 실행주기 작업 시작"), TimeUtils.getCurrentTimeString());
+
+        this.dwdbJobPrcs15MService.processing();
+
         stopWatch.stop();
-        log.info("[SCHEDULE] <<<<< {}: [{} ms]", LogUtils.elapsedLog("정주기 15분 실행주기 작업 완료"), stopWatch.getTotalTimeMillis());
+        log.info("[SCHEDULE] <<<<< {}", LogUtils.elapsedLog("정주기 15분 실행주기 작업 완료", stopWatch.getTotalTimeMillis()));
     }
 }

+ 15 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobMapper.java

@@ -0,0 +1,15 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import com.utic.dwdb.server.dto.CodeValueDto;
+import com.utic.dwdb.server.dto.StatTimeDto;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DwdbJobMapper {
+
+    StatTimeDto findStatTime();
+    List<CodeValueDto> findAllCodeValue();
+
+}

+ 18 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs04MMapper.java

@@ -0,0 +1,18 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DwdbJobPrcs04MMapper {
+
+    int insertCurLinkStMoctLog(@Param("past10Min") String past10Min);
+    int insertCurLinkSt(@Param("past10Min") String past10Min);
+    int insertRcvLinkTraffic(@Param("past10Min") String past10Min);
+    int updateIncidentCenter(@Param("past10Min") String past10Min);
+    int insertTraffic5mHist(@Param("past05Min") String past05Min, @Param("past30Min") String past30Min);
+    int insertCollInfoHist(@Param("past05Min") String past05Min, @Param("past30Min") String past30Min);
+    int insertCollTrafficHist(@Param("past05Min") String past05Min, @Param("past30Min") String past30Min);
+    int insertTrafficObeLocHist(@Param("past10Min") String past10Min);
+
+}

+ 77 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dao/mapper/DwdbJobPrcs05MMapper.java

@@ -0,0 +1,77 @@
+package com.utic.dwdb.server.dao.mapper;
+
+import com.utic.dwdb.server.dto.HolidayDto;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface DwdbJobPrcs05MMapper {
+
+    int truncateStatLocal();
+    int insertStatLocal12Loc(@Param("past25Min") String past25Min, @Param("past30Min") String past30Min);
+    int insertStatLocalCapital(@Param("past25Min") String past25Min, @Param("past30Min") String past30Min);
+    int insertStatLocalTotal(@Param("past25Min") String past25Min, @Param("past30Min") String past30Min);
+
+    int truncateLinkFilter();
+    int insertLinkFilter(@Param("past25Min") String past25Min, @Param("codeValue0") String codeValue0, @Param("codeValue5") String codeValue5);
+    HolidayDto findHoliday(@Param("past25Min") String past25Min);
+
+    int updateLinkFilterPattern(@Param("fromTable") String fromTable, @Param("past25Min") String past25Min, @Param("minValue") Integer minValue, @Param("maxValue") Integer maxValue);
+
+    int updateLinkFilterNull();
+
+    int updateLinkFilterRoadRank();
+
+    int updateLinkFilterMinMax(@Param("minValue6") Integer minValue6, @Param("maxValue6") Integer maxValue6,
+                               @Param("minValue7") Integer minValue7, @Param("maxValue7") Integer maxValue7,
+                               @Param("minValue8") Integer minValue8, @Param("maxValue8") Integer maxValue8,
+                               @Param("minValue9") Integer minValue9, @Param("maxValue9") Integer maxValue9);
+
+    int insertStatLocalLog();
+
+    //statDwd05MEXE
+    String findLinkFilterMakeDate();
+
+    int insertCenterLog(@Param("regDate") String regDate);
+
+    int insertUtisLog(@Param("regDate") String regDate);
+    int insertStatTrafficLog(@Param("regDate") String regDate);
+    int insertFilterLog(@Param("regDate") String regDate,
+                        @Param("codeValue0") String codeValue0,
+                        @Param("codeValue1") String codeValue1,
+                        @Param("codeValue2") String codeValue2,
+                        @Param("codeValue3") String codeValue3,
+                        @Param("codeValue4") String codeValue4);
+    int insertLinkFilterLog(@Param("codeValue4") String codeValue4);
+    int insertStat5MinCenter(@Param("regDate") String regDate, @Param("codeValue4") String codeValue4);
+    int insertStatFilterLog(@Param("regDate") String regDate);
+    int insertStat5MinCenterLevel(@Param("linkLevel") String linkLevel, @Param("regDate") String regDate);
+
+    int updateStat5MinCenter(@Param("regDate") String regDate);
+
+
+    int insertStat5Min12Loc(@Param("regDate") String regDate, @Param("codeValue4") String codeValue4);
+
+    int insertStat5Min12LocLevel(@Param("linkLevel") String linkLevel, @Param("regDate") String regDate);
+    int updateStat5Min12LocTravelTime(@Param("regDate") String regDate);
+
+    int insertStat5MinExw(@Param("regDate") String regDate, @Param("codeValue4") String codeValue4);
+
+    int insertStat5MinExwLevel(@Param("linkLevel") String linkLevel, @Param("regDate") String regDate);
+    int updateStat5MinExwTravelTime(@Param("regDate") String regDate);
+
+    int insertStat5MinLoc(@Param("regDate") String regDate, @Param("codeValue4") String codeValue4);
+
+    int insertStat5MinLocLevel(@Param("linkLevel") String linkLevel, @Param("regDate") String regDate);
+    int updateStat5MinLocTravelTime(@Param("regDate") String regDate);
+
+    int insertStat5MinObeLoc(@Param("regDate") String regDate);
+
+    int insertPatternHist(@Param("targetTable") String targetTable, @Param("fromTable") String fromTable, @Param("regDate") String regDate);
+    int updatePattern(@Param("targetTable") String targetTable, @Param("minValue") String minValue, @Param("maxValue") String maxValue);
+
+    int mergePatternWeekJob(@Param("columnName") String columnName, @Param("regDate") String regDate);
+    int updatePatternWeekJob(@Param("columnName") String columnName, @Param("regDate") String regDate);
+    int mergePatternWeek(@Param("regDate") String regDate, @Param("minValue") String minValue, @Param("maxValue") String maxValue);
+
+}

+ 23 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/CodeValueDto.java

@@ -0,0 +1,23 @@
+package com.utic.dwdb.server.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class CodeValueDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String mainCode;
+    private String subCode;
+    private String codeValue;
+    private Integer minValue;
+    private Integer maxValue;
+
+}

+ 20 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/HolidayDto.java

@@ -0,0 +1,20 @@
+package com.utic.dwdb.server.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class HolidayDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer wDay;    // 요일코드
+    private Integer hCnt;    // 공휴일 갯수(공휴일 갯수가 0 이상이면 HOLIDAY 로 설정)
+
+}

+ 30 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/dto/StatTimeDto.java

@@ -0,0 +1,30 @@
+package com.utic.dwdb.server.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor//(access = AccessLevel.PROTECTED)
+@AllArgsConstructor
+public class StatTimeDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String currTime;
+    private String past05Min;
+    private String past10Min;
+    private String past25Min;
+    private String past30Min;
+    private String past45Min;
+    private String past60Min;
+    private String past90Min;
+    private String past2Hour;
+    private String next1Month;
+    private String next2Month;
+    private Integer currMin;
+
+}

+ 6 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/scheduler/DwdbJobPrcsScheduler.java

@@ -5,6 +5,7 @@ import com.utic.dwdb.server.config.ApplicationConfig;
 import com.utic.dwdb.server.controller.*;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -31,6 +32,7 @@ public class DwdbJobPrcsScheduler {
         }
     }
 
+    @Async("scheduleExecutor")
     @ScheduleElapsed
     @Scheduled(cron = "4 4/5 * * * *")
     public void schedule04MProcess() {
@@ -39,6 +41,7 @@ public class DwdbJobPrcsScheduler {
         }
     }
 
+    @Async("scheduleExecutor")
     @ScheduleElapsed
     @Scheduled(cron = "5 0/5 * * * *")
     public void schedule05MProcess() {
@@ -47,6 +50,7 @@ public class DwdbJobPrcsScheduler {
         }
     }
 
+    @Async("scheduleExecutor")
     @ScheduleElapsed
     @Scheduled(cron = "15 0/15 * * * *")
     public void schedule16MProcess() {
@@ -55,6 +59,7 @@ public class DwdbJobPrcsScheduler {
         }
     }
 
+    @Async("scheduleExecutor")
     @ScheduleElapsed
     @Scheduled(cron = "1 1 * * * *")
     public void schedule01HProcess() {
@@ -63,6 +68,7 @@ public class DwdbJobPrcsScheduler {
         }
     }
 
+    @Async("scheduleExecutor")
     @ScheduleElapsed
     @Scheduled(cron = "2 2 2 * * *")
     public void schedule01DProcess() {

+ 7 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/AbstractProcessService.java

@@ -0,0 +1,7 @@
+package com.utic.dwdb.server.service;
+
+public interface AbstractProcessService {
+
+    int processing();
+
+}

+ 122 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs04MService.java

@@ -0,0 +1,122 @@
+package com.utic.dwdb.server.service;
+
+import com.utic.common.utils.Elapsed;
+import com.utic.common.utils.LogUtils;
+import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.dao.mapper.DwdbJobMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs04MMapper;
+import com.utic.dwdb.server.dto.StatTimeDto;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Getter
+@RequiredArgsConstructor
+@Service
+public class DwdbJobPrcs04MService implements AbstractProcessService {
+
+    private final DwdbJobMapper dwdbJobMapper;
+    private final DwdbJobPrcs04MMapper prcs04MMapper;
+
+    private StatTimeDto initialize() {
+
+        try {
+            return this.dwdbJobMapper.findStatTime();
+        }
+        catch (Exception e) {
+            log.error("[04MIN...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findStatTime"), e.getMessage());
+            return null;
+        }
+    }
+
+    public int processing() {
+        final String processName = "정주기 4분 작업";
+        log.info("[04MIN...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
+        Elapsed elapsed = new Elapsed();
+
+        StatTimeDto statTime = initialize();
+        if (statTime == null) {
+            log.error("[04MIN...] {}", LogUtils.elapsedLog(processName + " 오류!!", elapsed.milliSeconds()));
+            return -1;
+        }
+
+        Elapsed tmpelapsed = new Elapsed();
+
+        // statRcvPTDEXE
+        try {
+            tmpelapsed.reset();
+            int currLinkStMoctLog = this.prcs04MMapper.insertCurLinkStMoctLog(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(건교부 LINK)", currLinkStMoctLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(건교부 LINK)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // statRcv12LEXE
+        try {
+            tmpelapsed.reset();
+            int currLinkSt = this.prcs04MMapper.insertCurLinkSt(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", currLinkSt, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // statRcvLOCEXE
+        try {
+            tmpelapsed.reset();
+            int rcvLinkTraffic = this.prcs04MMapper.insertRcvLinkTraffic(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", rcvLinkTraffic, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // statRcvCNTEXE
+        try {
+            tmpelapsed.reset();
+            int incidentCenter = this.prcs04MMapper.updateIncidentCenter(statTime.getPast10Min());
+            log.info("[04MIN...] (UPD) {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", incidentCenter, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int traffic5mHist = this.prcs04MMapper.insertTraffic5mHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", traffic5mHist, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int collInfoHist = this.prcs04MMapper.insertCollInfoHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLINFOHIST", collInfoHist, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("COLLINFOHIST", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int collTrafficHist = this.prcs04MMapper.insertCollTrafficHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLTRAFFICHIST", collTrafficHist, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("COLLTRAFFICHIST", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+
+        // statRcvOBEEXE
+        // TODO: TRAFFIC_OBELOC@UTISDB 테이블 스키마 확인해야함.
+        try {
+            tmpelapsed.reset();
+            int trafficObeLocHist = this.prcs04MMapper.insertTrafficObeLocHist(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", trafficObeLocHist, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        log.info("[04MIN...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
+        return 0;
+    }
+
+}

+ 532 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs05MService.java

@@ -0,0 +1,532 @@
+package com.utic.dwdb.server.service;
+
+import com.utic.common.utils.Elapsed;
+import com.utic.common.utils.LogUtils;
+import com.utic.common.utils.StringUtils;
+import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.dao.mapper.DwdbJobMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs05MMapper;
+import com.utic.dwdb.server.dto.CodeValueDto;
+import com.utic.dwdb.server.dto.HolidayDto;
+import com.utic.dwdb.server.dto.StatTimeDto;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@Getter
+@RequiredArgsConstructor
+@Service
+public class DwdbJobPrcs05MService implements AbstractProcessService {
+
+    private final DwdbJobMapper dwdbJobMapper;
+    private final DwdbJobPrcs05MMapper prcs05MMapper;
+    private ConcurrentHashMap<String, CodeValueDto> mapData = new ConcurrentHashMap<>();
+    private StatTimeDto initialize() {
+
+        try {
+            List<CodeValueDto> codes = this.dwdbJobMapper.findAllCodeValue();
+            for (CodeValueDto code : codes) {
+                this.mapData.put(code.getMainCode()+code.getSubCode(), code);
+            }
+        }
+        catch (Exception e) {
+            log.error("[05MIN...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findAllCodeValue"), e.getMessage());
+        }
+
+        try {
+            return this.dwdbJobMapper.findStatTime();
+        }
+        catch (Exception e) {
+            log.error("[05MIN...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findStatTime"), e.getMessage());
+            return null;
+        }
+
+    }
+
+    public int processing() {
+        final String processName = "정주기 5분 작업";
+        log.info("[05MIN...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
+        Elapsed elapsed = new Elapsed();
+
+        StatTimeDto statTime = initialize();
+        if (statTime == null) {
+            log.error("[05MIN...] {}", LogUtils.elapsedLog(processName + " 오류!!", elapsed.milliSeconds()));
+            return -1;
+        }
+
+        Elapsed tmpelapsed = new Elapsed();
+
+        // statFitTRFEXE
+        try {
+            tmpelapsed.reset();
+            int truncateStatLocal = this.prcs05MMapper.truncateStatLocal();
+            log.info("[05MIN...] (DEL) {}", LogUtils.elapsedLog("STAT_LOCAL(TRUNCATE)", truncateStatLocal, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (DEL) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL(TRUNCATE)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+        try {
+            tmpelapsed.reset();
+            int local12Loc = this.prcs05MMapper.insertStatLocal12Loc(statTime.getPast25Min(), statTime.getPast30Min());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(12개지자체)", local12Loc, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL(12개지자체)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+        try {
+            tmpelapsed.reset();
+            int localCapital = this.prcs05MMapper.insertStatLocalCapital(statTime.getPast25Min(), statTime.getPast30Min());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(수도권 지역센터)", localCapital, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL(수도권 지역센터)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+        try {
+            tmpelapsed.reset();
+            int localTotal = this.prcs05MMapper.insertStatLocal12Loc(statTime.getPast25Min(), statTime.getPast30Min());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL(통합배포시스템)", localTotal, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL(통합배포시스템)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // LINK_FILTER 데이터 입력
+        CodeValueDto codeValue0 = Optional.ofNullable(this.mapData.get("C01T01")).orElseGet(() -> CodeValueDto.builder().mainCode("C01").subCode("T01").codeValue("Y").minValue(999).maxValue(999).build());
+        CodeValueDto codeValue1 = Optional.ofNullable(this.mapData.get("C01T02")).orElseGet(() -> CodeValueDto.builder().mainCode("C01").subCode("T02").codeValue("N").minValue(0).maxValue(0).build());
+        CodeValueDto codeValue2 = Optional.ofNullable(this.mapData.get("C01T03")).orElseGet(() -> CodeValueDto.builder().mainCode("C01").subCode("T03").codeValue("Y").minValue(30).maxValue(30).build());
+        CodeValueDto codeValue3 = Optional.ofNullable(this.mapData.get("C01T04")).orElseGet(() -> CodeValueDto.builder().mainCode("C01").subCode("T04").codeValue("Y").minValue(999).maxValue(999).build());
+        CodeValueDto codeValue4 = Optional.ofNullable(this.mapData.get("C01T05")).orElseGet(() -> CodeValueDto.builder().mainCode("C01").subCode("T05").codeValue("10").minValue(999).maxValue(999).build());
+        CodeValueDto codeValue5 = Optional.ofNullable(this.mapData.get("C01T06")).orElseGet(() -> CodeValueDto.builder().mainCode("C01").subCode("T06").codeValue("2").minValue(999).maxValue(999).build());
+        CodeValueDto codeValue6 = Optional.ofNullable(this.mapData.get("C02T01")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T01").codeValue("999").minValue(5).maxValue(150).build());
+        CodeValueDto codeValue7 = Optional.ofNullable(this.mapData.get("C02T02")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T02").codeValue("999").minValue(5).maxValue(130).build());
+        CodeValueDto codeValue8 = Optional.ofNullable(this.mapData.get("C02T03")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T03").codeValue("999").minValue(5).maxValue(120).build());
+        CodeValueDto codeValue9 = Optional.ofNullable(this.mapData.get("C02T04")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T04").codeValue("999").minValue(5).maxValue(90).build());
+
+        try {
+            // LINK_FILTER 초기화
+            tmpelapsed.reset();
+            int truncateLinkFilter = this.prcs05MMapper.truncateLinkFilter();
+            log.info("[05MIN...] (DEL) {}", LogUtils.elapsedLog("LINK_FILTER(TRUNCATE)", truncateLinkFilter, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (DEL) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(TRUNCATE)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            // LINK_FILTER 표준편차 입력
+            tmpelapsed.reset();
+            int linkFilter = this.prcs05MMapper.insertLinkFilter(statTime.getPast25Min(), codeValue0.getCodeValue(), codeValue5.getCodeValue());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("LINK_FILTER(표준편차값)", linkFilter, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(표준편차값)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // 패턴 최대최소값 UPDATE
+        // 패턴 필터링 실행여부 확인
+        if ("Y".equals(codeValue1.getCodeValue())) {
+            log.info("[05MIN...] (UPD) {}: LINK_FILTER 통계 최대최소 필터링 사용", LogUtils.elapsedLog("LINK_FILTER(패턴 필터링)"));
+            try {
+                tmpelapsed.reset();
+                HolidayDto holiday = this.prcs05MMapper.findHoliday(statTime.getPast25Min());
+                log.info("[05MIN...] (SEL) {}", LogUtils.elapsedLog("HOLIDAY", 1, tmpelapsed.milliSeconds()));
+                
+                runLinkFilterPaternUpdate(statTime, holiday, codeValue2);
+            } catch (Exception e) {
+                log.info("[05MIN...] (SEL) {}, Exception: {}", LogUtils.elapsedLog("HOLIDAY", tmpelapsed.milliSeconds()), e.getMessage());
+            }
+            
+        }
+        else {
+            //LINK_FILTER 통계 최대최소 필터링 사용안함
+            log.info("[05MIN...] (UPD) {}: LINK_FILTER 통계 최대최소 필터링 사용안함", LogUtils.elapsedLog("LINK_FILTER(패턴 필터링)"));
+        }
+
+        // 도로등급별 최대최소값 UPDATE
+        try {
+            tmpelapsed.reset();
+            int result = this.prcs05MMapper.updateLinkFilterRoadRank();
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("LINK_FILTER(도로등급 변경)", result, tmpelapsed.milliSeconds()));
+        }
+        catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(도로등급 변경)", elapsed.milliSeconds()), e.getMessage());
+        }
+
+        // LINK_FILTER 최대최소 속도 입력
+        if ("Y".equals(codeValue2.getCodeValue())) {
+            log.info("[05MIN...] (UPD) {}: LINK_FILTER  도로등급 최대최소 필터링 사용", LogUtils.elapsedLog("LINK_FILTER(도로등급 필터링)"));
+            try {
+                tmpelapsed.reset();
+                int result = this.prcs05MMapper.updateLinkFilterMinMax(
+                        codeValue6.getMinValue(), codeValue6.getMaxValue(),
+                        codeValue7.getMinValue(), codeValue7.getMaxValue(),
+                        codeValue8.getMinValue(), codeValue8.getMaxValue(),
+                        codeValue9.getMinValue(), codeValue9.getMaxValue());
+                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("LINK_FILTER(도로등급 필터링)", result, tmpelapsed.milliSeconds()));
+            } catch (Exception e) {
+                log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(도로등급 필터링)", tmpelapsed.milliSeconds()), e.getMessage());
+            }
+        }
+        else {
+            //LINK_FILTER 도로등급 최대최소 필터링 사용안함
+            log.info("[05MIN...] (UPD) {}: LINK_FILTER 도로등급 최대최소 필터링 사용안함", LogUtils.elapsedLog("LINK_FILTER(도로등급 필터링)"));
+        }
+
+        // 전국 이력저장
+        try {
+            tmpelapsed.reset();
+            int statLocalLog = this.prcs05MMapper.insertStatLocalLog();
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_LOCAL_LOG", statLocalLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_LOCAL_LOG", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // statDwd05MEXE
+        String regDate = null;
+        try {
+            tmpelapsed.reset();
+            regDate = this.prcs05MMapper.findLinkFilterMakeDate();
+            log.info("[05MIN...] (SEL) {}", LogUtils.elapsedLog("LINK_FILTER(생성일자)", 1, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (SEL) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(생성일자)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+        if (StringUtils.isEmpty(regDate)) {
+            regDate = statTime.getPast25Min();  // LINK_FILTER 생성일자(MAK_DATE) 없을 경우
+        }
+
+        try {
+            tmpelapsed.reset();
+            int centerLog = this.prcs05MMapper.insertCenterLog(regDate);
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("CENTER_LOG", centerLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CENTER_LOG", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int utisLog = this.prcs05MMapper.insertUtisLog(regDate);
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("UTIS_LOG", utisLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("UTIS_LOG", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int trafficLog = this.prcs05MMapper.insertStatTrafficLog(regDate);
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_TRAFFIC_LOG", trafficLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_TRAFFIC_LOG", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int trafficLog = this.prcs05MMapper.insertFilterLog(regDate, codeValue0.getCodeValue(), codeValue1.getCodeValue(), codeValue2.getCodeValue(), codeValue3.getCodeValue(), codeValue4.getCodeValue());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("FILTER_LOG", trafficLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("FILTER_LOG", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int linkFilterLog = this.prcs05MMapper.insertLinkFilterLog(codeValue4.getCodeValue());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("LINK_FILTER_LOG", linkFilterLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER_LOG", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int stat5MinCenter = this.prcs05MMapper.insertStat5MinCenter(regDate, codeValue4.getCodeValue());
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", stat5MinCenter, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int statFilterLog = this.prcs05MMapper.insertStatFilterLog(regDate);
+            log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_FILTER_LOG", statFilterLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_FILTER_LOG", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        for (int level = 2; level <= 4; level++) {
+            try {
+                tmpelapsed.reset();
+                int stat5MinCenter = this.prcs05MMapper.insertStat5MinCenterLevel(String.valueOf(level), regDate);
+                log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER(레벨" + level + ")", stat5MinCenter, tmpelapsed.milliSeconds()));
+            } catch (Exception e) {
+                log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_CENTER(레벨" + level + ")", tmpelapsed.milliSeconds()), e.getMessage());
+            }
+        }
+
+        try {
+            tmpelapsed.reset();
+            int updateStat5MinCenter = this.prcs05MMapper.updateStat5MinCenter(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", updateStat5MinCenter, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_CENTER", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        patternUpdate(regDate);
+
+        // STAT_5MIN_12LOC 통계정보
+        try {
+            tmpelapsed.reset();
+            int inserted = this.prcs05MMapper.insertStat5Min12Loc(regDate, codeValue4.getCodeValue());
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC", inserted, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_12LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+        for (int level = 2; level <= 4; level++) {
+            try {
+                    tmpelapsed.reset();
+                    int inserted = this.prcs05MMapper.insertStat5Min12LocLevel(String.valueOf(level), regDate);
+                    log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(레벨" + level + ")", inserted, tmpelapsed.milliSeconds()));
+            } catch (Exception e) {
+                log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(레벨" + level + ")", tmpelapsed.milliSeconds()), e.getMessage());
+            }
+        }
+        try {
+            tmpelapsed.reset();
+            int inserted = this.prcs05MMapper.updateStat5Min12LocTravelTime(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(TRAVEL_TIME)", inserted, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_12LOC(TRAVEL_TIME)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // STAT_5MIN_EXW 통계정보
+        try {
+            tmpelapsed.reset();
+            int inserted = this.prcs05MMapper.insertStat5MinExw(regDate, codeValue4.getCodeValue());
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW", inserted, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_EXW", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+        for (int level = 2; level <= 4; level++) {
+            try {
+                tmpelapsed.reset();
+                int inserted = this.prcs05MMapper.insertStat5MinExwLevel(String.valueOf(level), regDate);
+                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW(레벨" + level + ")", inserted, tmpelapsed.milliSeconds()));
+            } catch (Exception e) {
+                log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_EXW(레벨" + level + ")", tmpelapsed.milliSeconds()), e.getMessage());
+            }
+        }
+        try {
+            tmpelapsed.reset();
+            int inserted = this.prcs05MMapper.updateStat5MinExwTravelTime(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_EXW(TRAVEL_TIME)", inserted, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_EXW(TRAVEL_TIME)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // STAT_5MIN_LOC 통계정보
+        try {
+            tmpelapsed.reset();
+            int inserted = this.prcs05MMapper.insertStat5MinLoc(regDate, codeValue4.getCodeValue());
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC", inserted, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_LOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+        for (int level = 2; level <= 4; level++) {
+            try {
+                tmpelapsed.reset();
+                int inserted = this.prcs05MMapper.insertStat5MinLocLevel(String.valueOf(level), regDate);
+                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC(레벨" + level + ")", inserted, tmpelapsed.milliSeconds()));
+            } catch (Exception e) {
+                log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_LOC(레벨" + level + ")", tmpelapsed.milliSeconds()), e.getMessage());
+            }
+        }
+        try {
+            tmpelapsed.reset();
+            int inserted = this.prcs05MMapper.updateStat5MinLocTravelTime(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_LOC(TRAVEL_TIME)", inserted, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_LOC(TRAVEL_TIME)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // STAT_5MIN_OBELOC 통계정보
+        try {
+            tmpelapsed.reset();
+            int inserted = this.prcs05MMapper.insertStat5MinObeLoc(regDate);
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("STAT_5MIN_OBELOC", inserted, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("STAT_5MIN_OBELOC", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        log.info("[05MIN...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
+        return 0;
+    }
+
+    private void patternUpdate(String regDate) {
+        Elapsed elapsed = new Elapsed();
+        Elapsed tmpElapsed = new Elapsed();
+        String logTable, fromTable;
+        String minValue = "0";
+        String maxValue = "0";
+        String columnName = "SPEED3";
+
+        CodeValueDto code11 = Optional.ofNullable(this.mapData.get("C02T06")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T06").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code12 = Optional.ofNullable(this.mapData.get("C02T07")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T07").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code13 = Optional.ofNullable(this.mapData.get("C02T08")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T08").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code14 = Optional.ofNullable(this.mapData.get("C02T09")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T09").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code15 = Optional.ofNullable(this.mapData.get("C02T10")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T10").codeValue("999").minValue(80).maxValue(20).build());
+        CodeValueDto code16 = Optional.ofNullable(this.mapData.get("C02T11")).orElseGet(() -> CodeValueDto.builder().mainCode("C02").subCode("T11").codeValue("999").minValue(80).maxValue(20).build());
+
+        boolean isWeek = false;
+        HolidayDto holiday = null;
+        try {
+            holiday = this.prcs05MMapper.findHoliday(regDate);
+            log.info("[05MIN...] (SEL) {}", LogUtils.elapsedLog("HOLIDAY", 1, tmpElapsed.milliSeconds()));
+        }
+        catch (Exception e) {
+            log.info("[05MIN...] (SEL) {}, patternUpdate[{}], Exception: {}", LogUtils.elapsedLog("HOLIDAY", tmpElapsed.milliSeconds()), regDate, e.getMessage());
+            return;
+        }
+
+        if (holiday.getHCnt() > 0) {
+            logTable = "(휴일)PATN_HOLIDAY";
+            fromTable = "PATN_HOLIDAY";
+            minValue = String.valueOf(code16.getMinValue());
+            maxValue = String.valueOf(code16.getMaxValue());
+        }
+        else {
+            switch(holiday.getWDay()) {
+                case 1: // 일요일 패턴
+                    logTable = "(일요일)PATN_SUN";
+                    fromTable = "PATN_SUN";
+                    minValue = String.valueOf(code11.getMinValue());
+                    maxValue = String.valueOf(code11.getMaxValue());
+                    break;
+                case 2: // 월요일 패턴
+                    logTable = "(월요일)PATN_MON";
+                    fromTable = "PATN_MON";
+                    minValue = String.valueOf(code12.getMinValue());
+                    maxValue = String.valueOf(code12.getMaxValue());
+                    break;
+                case 6: // 금요일 패턴
+                    logTable = "(금요일)PATN_FRI";
+                    fromTable = "PATN_FRI";
+                    minValue = String.valueOf(code14.getMinValue());
+                    maxValue = String.valueOf(code14.getMaxValue());
+                    break;
+                case 7: // 토요일 패턴
+                    logTable = "(토요일)PATN_SAT";
+                    fromTable = "PATN_SAT";
+                    minValue = String.valueOf(code15.getMinValue());
+                    maxValue = String.valueOf(code15.getMaxValue());
+                    break;
+                default: // 평일 패턴(3,4,5)
+                    isWeek = true;
+                    logTable = "(평일)PATN_WEEK";
+                    fromTable = "PATN_WEEK";
+                    if (holiday.getWDay() == 3) {
+                        columnName = "SPEED3";
+                    }
+                    else if (holiday.getWDay() == 4) {
+                        columnName = "SPEED4";
+                    }
+                    else {
+                        columnName = "SPEED5";
+                    }
+                    break;
+            }
+        }
+
+        if (isWeek) {
+            // 평일(3,4,5)
+            try {
+                int result = this.prcs05MMapper.mergePatternWeekJob(columnName, regDate);
+                log.info("[05MIN...] (MRG) {}", LogUtils.elapsedLog("PATN_WEEK_JOB(MERGE)", result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[05MIN...] (MRG) {}, Exception: {}", LogUtils.elapsedLog("PATN_WEEK_JOB(MERGE)", elapsed.milliSeconds()), e.getMessage());
+            }
+            try {
+                int result = this.prcs05MMapper.updatePatternWeekJob(columnName, regDate);
+                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("PATN_WEEK_JOB(UPDATE)", result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("PATN_WEEK_JOB(UPDATE)", elapsed.milliSeconds()), e.getMessage());
+            }
+        }
+        else {
+            try {
+                int result = this.prcs05MMapper.insertPatternHist(fromTable + "_HIST", fromTable, regDate);
+                log.info("[05MIN...] (INS) {}", LogUtils.elapsedLog(logTable + "_HIST", result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[05MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog(logTable + "_HIST", elapsed.milliSeconds()), e.getMessage());
+            }
+            try {
+                int result = this.prcs05MMapper.updatePattern(fromTable, minValue, maxValue);
+                log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog(logTable, result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog(logTable, elapsed.milliSeconds()), e.getMessage());
+            }
+        }
+
+        if (holiday.getWDay() == 6) {
+            // 금요일 이면 금요일 패턴을 업데이트 하고(위에서 처리) 평일패턴을 업데이트 한다.
+            // 평일패턴작업 테이블을 이용하여 작업을 수행한다.
+            try {
+                int result = this.prcs05MMapper.mergePatternWeek(regDate, minValue, maxValue);
+                log.info("[05MIN...] (MRG) {}", LogUtils.elapsedLog("PATN_WEEK", result, elapsed.milliSeconds()));
+            }
+            catch (Exception e) {
+                log.info("[05MIN...] (MRG) {}, Exception: {}", LogUtils.elapsedLog("PATN_WEEK", elapsed.milliSeconds()), e.getMessage());
+            }
+        }
+    }
+
+    private void runLinkFilterPaternUpdate(StatTimeDto statTime, HolidayDto holiday, CodeValueDto codeValue2) {
+        Elapsed elapsed = new Elapsed();
+        String logTable, fromTable;
+        if (holiday.getHCnt() > 0) {
+            logTable = "(휴일)PATN_HOLIDAY";
+            fromTable = "PATN_HOLIDAY";
+        }
+        else {
+            switch(holiday.getWDay()) {
+                case 1: // 일요일 패턴
+                    logTable = "(일요일)PATN_SUN";
+                    fromTable = "PATN_SUN";
+                    break;
+                case 2: // 월요일 패턴
+                    logTable = "(월요일)PATN_MON";
+                    fromTable = "PATN_MON";
+                    break;
+                case 6: // 금요일 패턴
+                    logTable = "(금요일)PATN_FRI";
+                    fromTable = "PATN_FRI";
+                    break;
+                case 7: // 토요일 패턴
+                    logTable = "(토요일)PATN_SAT";
+                    fromTable = "PATN_SAT";
+                    break;
+                default: // 평일 패턴(3,4,5)
+                    logTable = "(평일)PATN_WEEK";
+                    fromTable = "PATN_WEEK";
+                    break;
+            }
+        }
+
+        try {
+            int result = this.prcs05MMapper.updateLinkFilterPattern(fromTable, statTime.getPast25Min(), codeValue2.getMinValue(), codeValue2.getMaxValue());
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog(logTable+"(패턴 최대최소값 변경)", result, elapsed.milliSeconds()));
+        }
+        catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog(logTable+"(패턴 최대최소값 변경)", elapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            int result = this.prcs05MMapper.updateLinkFilterNull();
+            log.info("[05MIN...] (UPD) {}", LogUtils.elapsedLog("LINK_FILTER(NULL값 처리)", result, elapsed.milliSeconds()));
+        }
+        catch (Exception e) {
+            log.info("[05MIN...] (UPD) {}, Exception: {}", LogUtils.elapsedLog("LINK_FILTER(NULL값 처리)", elapsed.milliSeconds()), e.getMessage());
+        }
+    }
+
+}

+ 122 - 0
utic-dwdb-server/src/main/java/com/utic/dwdb/server/service/DwdbJobPrcs15MService.java

@@ -0,0 +1,122 @@
+package com.utic.dwdb.server.service;
+
+import com.utic.common.utils.Elapsed;
+import com.utic.common.utils.LogUtils;
+import com.utic.common.utils.TimeUtils;
+import com.utic.dwdb.server.dao.mapper.DwdbJobMapper;
+import com.utic.dwdb.server.dao.mapper.DwdbJobPrcs04MMapper;
+import com.utic.dwdb.server.dto.StatTimeDto;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Getter
+@RequiredArgsConstructor
+@Service
+public class DwdbJobPrcs15MService implements AbstractProcessService {
+
+    private final DwdbJobMapper dwdbJobMapper;
+    private final DwdbJobPrcs04MMapper prcs04MMapper;
+
+    private StatTimeDto initialize() {
+
+        try {
+            return this.dwdbJobMapper.findStatTime();
+        }
+        catch (Exception e) {
+            log.error("[04MIN...] (SEL) {}: Exception: {}", LogUtils.elapsedLog("initialize.findStatTime"), e.getMessage());
+            return null;
+        }
+    }
+
+    public int processing() {
+        final String processName = "정주기 15분 작업";
+        log.info("[04MIN...] ..... {}: [{}]", LogUtils.elapsedLog(processName + " 시작"), TimeUtils.getCurrentTimeString());
+        Elapsed elapsed = new Elapsed();
+
+        StatTimeDto statTime = initialize();
+        if (statTime == null) {
+            log.error("[04MIN...] {}", LogUtils.elapsedLog(processName + " 오류!!", elapsed.milliSeconds()));
+            return -1;
+        }
+
+        Elapsed tmpelapsed = new Elapsed();
+
+        // statDwd15MEXE
+        try {
+            tmpelapsed.reset();
+            int currLinkStMoctLog = this.prcs04MMapper.insertCurLinkStMoctLog(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(건교부 LINK)", currLinkStMoctLog, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CURLINKST_MOCT_LOG(건교부 LINK)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // statRcv12LEXE
+        try {
+            tmpelapsed.reset();
+            int currLinkSt = this.prcs04MMapper.insertCurLinkSt(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", currLinkSt, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("CURLINKST(12개지자체 연계)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // statRcvLOCEXE
+        try {
+            tmpelapsed.reset();
+            int rcvLinkTraffic = this.prcs04MMapper.insertRcvLinkTraffic(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", rcvLinkTraffic, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("RCV_LINK_TRAFFIC(수도권교통정보)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        // statRcvCNTEXE
+        try {
+            tmpelapsed.reset();
+            int incidentCenter = this.prcs04MMapper.updateIncidentCenter(statTime.getPast10Min());
+            log.info("[04MIN...] (UPD) {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", incidentCenter, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("INCIDENT_CENTER(돌발정보)", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int traffic5mHist = this.prcs04MMapper.insertTraffic5mHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", traffic5mHist, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC5M_HIST", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int collInfoHist = this.prcs04MMapper.insertCollInfoHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLINFOHIST", collInfoHist, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("COLLINFOHIST", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        try {
+            tmpelapsed.reset();
+            int collTrafficHist = this.prcs04MMapper.insertCollTrafficHist(statTime.getPast05Min(), statTime.getPast30Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("COLLTRAFFICHIST", collTrafficHist, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("COLLTRAFFICHIST", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+
+        // statRcvOBEEXE
+        // TODO: TRAFFIC_OBELOC@UTISDB 테이블 스키마 확인해야함.
+        try {
+            tmpelapsed.reset();
+            int trafficObeLocHist = this.prcs04MMapper.insertTrafficObeLocHist(statTime.getPast10Min());
+            log.info("[04MIN...] (INS) {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", trafficObeLocHist, tmpelapsed.milliSeconds()));
+        } catch (Exception e) {
+            log.info("[04MIN...] (INS) {}, Exception: {}", LogUtils.elapsedLog("TRAFFIC_OBELOC_HIST", tmpelapsed.milliSeconds()), e.getMessage());
+        }
+
+        log.info("[04MIN...] ..... {}", LogUtils.elapsedLog(processName + " 종료", elapsed.milliSeconds()));
+        return 0;
+    }
+
+}

+ 1 - 23
utic-dwdb-server/src/main/resources/logback-spring.xml

@@ -25,9 +25,7 @@
     <property name="LOG_PATTERN_ASPECT"      value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %msg%n"/>
     <property name="LOG_PATTERN_CONSOLE"     value="[%d{HH:mm:ss.SSS}] [%5level] %msg %n"/>
 
-    <springProfile name="!xxx">
-        <include resource="logback-spring-appender.xml"/>
-    </springProfile>
+    <include resource="logback-spring-appender.xml"/>
 
     <springProfile name="!prod">
         <root level="INFO">
@@ -41,16 +39,6 @@
             <appender-ref ref="FILE_ASPECT"/>
             <appender-ref ref="FILE_ERROR"/>
         </logger>
-
-        <logger name="${APP_CLASS_PATH}.process" level="INFO" additivity="false">
-            <appender-ref ref="FILE_CENTER"/>
-            <appender-ref ref="FILE_ERROR"/>
-        </logger>
-
-        <logger name="${APP_CLASS_PATH}.service" level="INFO" additivity="false">
-            <appender-ref ref="FILE_CENTER"/>
-            <appender-ref ref="FILE_ERROR"/>
-        </logger>
     </springProfile>
 
     <springProfile name="prod">
@@ -63,16 +51,6 @@
             <appender-ref ref="FILE_ASPECT"/>
             <appender-ref ref="FILE_ERROR"/>
         </logger>
-
-        <logger name="${APP_CLASS_PATH}.process" level="INFO" additivity="false">
-            <appender-ref ref="FILE_CENTER"/>
-            <appender-ref ref="FILE_ERROR"/>
-        </logger>
-
-        <logger name="${APP_CLASS_PATH}.service" level="INFO" additivity="false">
-            <appender-ref ref="FILE_CENTER"/>
-            <appender-ref ref="FILE_ERROR"/>
-        </logger>
     </springProfile>
 
 </configuration>

+ 34 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobMapper.xml

@@ -0,0 +1,34 @@
+<?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.utic.dwdb.server.dao.mapper.DwdbJobMapper">
+
+    <select id="findStatTime" resultType="com.utic.dwdb.server.dto.StatTimeDto">
+        SELECT TO_CHAR(SYSDATE,            'YYYYMMDDHH24MI') ||'00' AS currTime,
+               TO_CHAR(SYSDATE -   5/1440, 'YYYYMMDDHH24MI') ||'00' AS past05Min,
+               TO_CHAR(SYSDATE -  10/1440, 'YYYYMMDDHH24MI') ||'00' AS past10Min,
+               TO_CHAR(SYSDATE -  25/1440, 'YYYYMMDDHH24MI') ||'00' AS past25Min,
+               TO_CHAR(SYSDATE -  30/1440, 'YYYYMMDDHH24MI')        AS past30Min,
+               TO_CHAR(SYSDATE -  45/1440, 'YYYYMMDDHH24MI')        AS past45Min,
+               TO_CHAR(SYSDATE -  60/1440, 'YYYYMMDDHH24MI')        AS past60Min,
+               TO_CHAR(SYSDATE -  90/1440, 'YYYYMMDDHH24MI')        AS past90Min,
+               TO_CHAR(SYSDATE - 120/1440, 'YYYYMMDDHH24MI')        AS past2Hour,
+               TO_CHAR(ADD_MONTHS(SYSDATE, 1), 'YYYYMM')            AS next1Month,
+               TO_CHAR(ADD_MONTHS(SYSDATE, 2), 'YYYYMM')            AS next2Month,
+               TO_NUMBER(TO_CHAR(SYSDATE, 'MI'))                    AS currMin
+        FROM DUAL
+    </select>
+
+    <select id="findAllCodeValue" resultType="com.utic.dwdb.server.dto.CodeValueDto">
+        SELECT MAINCODE                      AS mainCode,
+               NVL(SUBCODE,           '999') AS subCode,
+               NVL(CODEVALUE,         '999') AS codeValue,
+               NVL(TO_NUMBER(MINVALUE), 999) AS minValue,
+               NVL(TO_NUMBER(MAXVALUE), 999) AS maxValue
+        FROM CODEDEFINE
+        WHERE MAINCODE in ('C01', 'C02')
+          AND SUBCODE != 'T00'
+        ORDER BY MAINCODE, SUBCODE
+    </select>
+
+</mapper>

+ 127 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs04MMapper.xml

@@ -0,0 +1,127 @@
+<?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.utic.dwdb.server.dao.mapper.DwdbJobPrcs04MMapper">
+
+    <insert id="insertCurLinkStMoctLog" parameterType="java.lang.String">
+        INSERT INTO CURLINKST_MOCT_LOG(REG_DATE, STD_LINK_ID, SPEED, VOLUME, DENSITY, TRAVELTIME, DELAY, QUEUELENGTH, OCCUPANCY, SUCCESS)
+        SELECT /*+ INDEX(a, PK_CURLINKST_MOCT_LOG) */
+            REG_DATE, STD_LINK_ID, SPEED, VOLUME, DENSITY, TRAVELTIME, DELAY, QUEUELENGTH, OCCUPANCY, SUCCESS
+        FROM CURLINKST_MOCT_LOG@PTDBSDB
+        WHERE REG_DATE > #{past10Min}
+          AND STD_LINK_ID > ' '
+            MINUS
+        SELECT  REG_DATE, STD_LINK_ID, SPEED, VOLUME, DENSITY, TRAVELTIME, DELAY, QUEUELENGTH, OCCUPANCY, SUCCESS
+        FROM CURLINKST_MOCT_LOG
+        WHERE REG_DATE > #{past10Min}
+          AND STD_LINK_ID > ' '
+    </insert>
+
+    <insert id="insertCurLinkSt" parameterType="java.lang.String">
+        INSERT INTO CURLINKST(CENTERID, LINK_ID, REG_DATE, SPEED, VOLUME, DENSITY, TRAVELTIME, DELAY, QUEUELENGTH, OCCUPANCY, INSERT_DATE)
+        SELECT CENTERID, LINK_ID, REG_DATE, SPEED, VOLUME, DENSITY, TRAVELTIME, DELAY, QUEUELENGTH, OCCUPANCY, INSERT_DATE
+        FROM CURLINKST@LOC12DB
+        WHERE REG_DATE > #{past10Min}
+            MINUS
+        SELECT CENTERID, LINK_ID, REG_DATE, SPEED, VOLUME, DENSITY, TRAVELTIME, DELAY, QUEUELENGTH, OCCUPANCY, INSERT_DATE
+        FROM CURLINKST
+        WHERE REG_DATE > #{past10Min}
+    </insert>
+
+    <insert id="insertRcvLinkTraffic" parameterType="java.lang.String">
+        INSERT INTO RCV_LINK_TRAFFIC(REGDATE, TOCENTERID, LINKNUMBER, LOGDATE, FROMCENTERID, SPEEDRATE, VOLUMERATE, DENSITYRATE,
+                                     TRAVELTIMEQUANTITY, DELAYQUANITY, VEHICLEQUEUELENGTHQUANTITY, OCCUPANCYPERCENT)
+        SELECT REGDATE, TOCENTERID, LINKNUMBER, LOGDATE, FROMCENTERID, SPEEDRATE, VOLUMERATE, DENSITYRATE, TRAVELTIMEQUANTITY,
+               DELAYQUANITY, VEHICLEQUEUELENGTHQUANTITY, OCCUPANCYPERCENT
+        FROM RCV_LINK_TRAFFIC@TPEGDB a
+        WHERE REGDATE > TO_DATE(#{past10Min}, 'YYYYMMDDHH24MISS')
+            MINUS
+        SELECT REGDATE, TOCENTERID, LINKNUMBER, LOGDATE, FROMCENTERID, SPEEDRATE, VOLUMERATE, DENSITYRATE, TRAVELTIMEQUANTITY,
+               DELAYQUANITY, VEHICLEQUEUELENGTHQUANTITY, OCCUPANCYPERCENT
+        FROM RCV_LINK_TRAFFIC
+        WHERE REGDATE > TO_DATE(#{past10Min}, 'YYYYMMDDHH24MISS')
+    </insert>
+
+    <update id="updateIncidentCenter" parameterType="java.lang.String">
+        MERGE INTO INCIDENT_CENTER NP
+            USING (SELECT INCIDENTID, LOGDATE, REPORTDATE, LINKID, USERID, REPORTERID, STARTDATE, ENDDATE, TRAFFICGRADE,
+                          TROUBLEGRADE, INCIDENTTITLE, INCIDENTINFO, INCIDENTCODE, INCIDENTSUBCODE, LOCATION, COORDX, COORDY, RESID
+                   FROM INCIDENT_CENTER@UTISDB
+                   WHERE REPORTDATE > TO_DATE(#{past10Min}, 'YYYYMMDDHH24MISS')
+                       MINUS
+                   SELECT INCIDENTID, LOGDATE, REPORTDATE, LINKID, USERID, REPORTERID, STARTDATE, ENDDATE, TRAFFICGRADE,
+                       TROUBLEGRADE, INCIDENTTITLE, INCIDENTINFO, INCIDENTCODE, INCIDENTSUBCODE, LOCATION, COORDX, COORDY, RESID
+                   FROM INCIDENT_CENTER
+                   WHERE REPORTDATE > TO_DATE(#{past10Min}, 'YYYYMMDDHH24MISS')) MG
+            ON (NP.INCIDENTID = MG.INCIDENTID)
+            WHEN MATCHED THEN
+                UPDATE SET
+                    NP.LOGDATE         = MG.LOGDATE,         NP.REPORTDATE      = MG.REPORTDATE,
+                    NP.LINKID          = MG.LINKID,          NP.USERID          = MG.USERID,
+                    NP.REPORTERID      = MG.REPORTERID,      NP.STARTDATE       = MG.STARTDATE,
+                    NP.ENDDATE         = MG.ENDDATE,         NP.TRAFFICGRADE    = MG.TRAFFICGRADE,
+                    NP.TROUBLEGRADE    = MG.TROUBLEGRADE,    NP.INCIDENTTITLE   = MG.INCIDENTTITLE,
+                    NP.INCIDENTINFO    = MG.INCIDENTINFO,    NP.INCIDENTCODE    = MG.INCIDENTCODE,
+                    NP.INCIDENTSUBCODE = MG.INCIDENTSUBCODE, NP.LOCATION        = MG.LOCATION,
+                    NP.COORDX          = MG.COORDX,          NP.COORDY          = MG.COORDY,
+                    NP.RESID           = MG.RESID
+            WHEN NOT MATCHED THEN
+                INSERT (NP.INCIDENTID, NP.LOGDATE, NP.REPORTDATE, NP.LINKID, NP.USERID, NP.REPORTERID, NP.STARTDATE, NP.ENDDATE,
+                        NP.TRAFFICGRADE, NP.TROUBLEGRADE, NP.INCIDENTTITLE, NP.INCIDENTINFO, NP.INCIDENTCODE, NP.INCIDENTSUBCODE,
+                        NP.LOCATION, NP.COORDX, NP.COORDY, NP.RESID)
+                    VALUES (MG.INCIDENTID, MG.LOGDATE, MG.REPORTDATE, MG.LINKID, MG.USERID, MG.REPORTERID, MG.STARTDATE, MG.ENDDATE,
+                            MG.TRAFFICGRADE, MG.TROUBLEGRADE, MG.INCIDENTTITLE, MG.INCIDENTINFO, MG.INCIDENTCODE, MG.INCIDENTSUBCODE,
+                            MG.LOCATION, MG.COORDX, MG.COORDY, MG.RESID)
+    </update>
+
+    <insert id="insertTraffic5mHist" parameterType="java.lang.String">
+        INSERT INTO TRAFFIC5M_HIST(REGDT, LINKID, LINKLEVEL, TRVTM, SPD, DATACNT, CENTERID)
+        SELECT REGDT, LINKID, LINKLEVEL, TRVTM, SPD, DATACNT, CENTERID
+        FROM UTISCENTER.TRAFFIC5M_HIST@UTISDB
+        WHERE REGDT <![CDATA[ <= ]]> TO_DATE(#{past05Min},  'YYYYMMDDHH24MISS')
+          AND REGDT <![CDATA[  > ]]> TO_DATE(#{past30Min}, 'YYYYMMDDHH24MISS')
+            MINUS
+        SELECT REGDT, LINKID, LINKLEVEL, TRVTM, SPD, DATACNT, CENTERID
+        FROM TRAFFIC5M_HIST
+        WHERE REGDT <![CDATA[ <= ]]> TO_DATE(#{past05Min},  'YYYYMMDDHH24MISS')
+          AND REGDT <![CDATA[  > ]]> TO_DATE(#{past30Min}, 'YYYYMMDDHH24MISS')
+    </insert>
+
+    <insert id="insertCollInfoHist" parameterType="java.lang.String">
+        INSERT INTO COLLINFOHIST(GPSTM, COLLDT, CENTERID, RSEID, COORDX, COORDY, SIGNQLY, SIGNDEGREE, NOISEDEGREE)
+        SELECT GPSTM, COLLDT, CENTERID, RSEID, COORDX, COORDY, SIGNQLY, SIGNDEGREE, NOISEDEGREE
+        FROM COLLINFOHIST@UTISCENTER
+        WHERE GPSTM <![CDATA[ <= ]]> #{past05Min}
+          AND GPSTM <![CDATA[  > ]]> #{past30Min}
+        MINUS
+        SELECT GPSTM, COLLDT, CENTERID, RSEID, COORDX, COORDY, SIGNQLY, SIGNDEGREE, NOISEDEGREE
+        FROM COLLINFOHIST
+        WHERE GPSTM <![CDATA[ <= ]]> #{past05Min}
+          AND GPSTM <![CDATA[  > ]]> #{past30Min}
+    </insert>
+
+    <insert id="insertCollTrafficHist" parameterType="java.lang.String">
+        INSERT INTO COLLTRAFFICHIST(GPSTM, HHMMSS, COLLDT, CENTERID, ENTITYID, PNODE, MACHYN, RSEID, TOTTRVTM, AVGSPD, BRKPLACE)
+        SELECT GPSTM, HHMMSS, COLLDT, CENTERID, ENTITYID, PNODE, MACHYN, RSEID, TOTTRVTM, AVGSPD, BRKPLACE
+        FROM COLLTRAFFICHIST@UTISCENTER
+        WHERE GPSTM <![CDATA[ <= ]]> #{past05Min}
+          AND GPSTM <![CDATA[  > ]]> #{past30Min}
+            MINUS
+        SELECT GPSTM, HHMMSS, COLLDT, CENTERID, ENTITYID, PNODE, MACHYN, RSEID, TOTTRVTM, AVGSPD, BRKPLACE
+        FROM COLLTRAFFICHIST
+        WHERE GPSTM <![CDATA[ <= ]]> #{past05Min}
+          AND GPSTM <![CDATA[  > ]]> #{past30Min}
+    </insert>
+
+    <insert id="insertTrafficObeLocHist" parameterType="java.lang.String">
+        INSERT INTO TRAFFIC_OBELOC_HIST(REGDATE, LINKID, SPEED, DATACNT)
+        SELECT LOGDATE, LINKID, SPEED, DATACNT
+        FROM TRAFFIC_OBELOC@UTISDB
+        WHERE LOGDATE > TO_DATE(#{past10Min}, 'YYYYMMDDHH24MISS')
+            MINUS
+        SELECT REGDATE, LINKID, SPEED, DATACNT
+        FROM TRAFFIC_OBELOC_HIST
+        WHERE REGDATE > TO_DATE(#{past10Min}, 'YYYYMMDDHH24MISS')
+    </insert>
+
+</mapper>

+ 778 - 0
utic-dwdb-server/src/main/resources/mybatis/mapper/DwdbJobPrcs05MMapper.xml

@@ -0,0 +1,778 @@
+<?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.utic.dwdb.server.dao.mapper.DwdbJobPrcs05MMapper">
+
+    <delete id="truncateStatLocal">
+        TRUNCATE TABLE STAT_LOCAL
+    </delete>
+
+    <insert id="insertStatLocal12Loc" parameterType="java.lang.String">
+        INSERT INTO STAT_LOCAL(LOCAL_DATE, CENTER_ID, LINKID, REV_TYPE, SPEED)
+        SELECT REG_DATE, b.Center_ID, LINK_ID, 'L', AVG(SPEED)
+        FROM CURLINKST a, CENTER b
+        WHERE REG_DATE <![CDATA[  > ]]> #{past30Min}
+          AND REG_DATE <![CDATA[ <= ]]> #{past25Min}
+        AND a.CenterId = B.ASN_CENTER_ID
+        GROUP BY b.Center_ID, REG_DATE, LINK_ID
+    </insert>
+
+    <insert id="insertStatLocalCapital" parameterType="java.lang.String">
+        INSERT INTO STAT_LOCAL(LOCAL_DATE, CENTER_ID, LINKID, REV_TYPE, SPEED)
+        SELECT TO_CHAR(REGDATE, 'YYYYMMDDHH24MISS'), FromCenterID, LinkNumber, 'U', SpeedRate
+        FROM RCV_LINK_TRAFFIC
+        WHERE REGDATE <![CDATA[  > ]]> TO_DATE(#{past30Min}, 'YYYYMMDDHH24MISS')
+          AND REGDATE <![CDATA[ <= ]]> TO_DATE(#{past25Min}, 'YYYYMMDDHH24MISS')
+    </insert>
+
+    <insert id="insertStatLocalTotal" parameterType="java.lang.String">
+        INSERT INTO STAT_LOCAL(LOCAL_DATE, CENTER_ID, LINKID, REV_TYPE, SPEED)
+        SELECT REG_DATE, 'L00', STD_LINK_ID, 'S', SPEED
+        FROM CURLINKST_MOCT_LOG
+        WHERE <![CDATA[  > ]]> #{past30Min}
+          AND <![CDATA[ <= ]]> #{past25Min}
+    </insert>
+
+
+    <delete id="truncateLinkFilter">
+        TRUNCATE TABLE LINK_FILTER
+    </delete>
+
+    <insert id="insertLinkFilter" parameterType="java.lang.String">
+        INSERT INTO LINK_FILTER(LINKID, MAK_DATE, AVG_SPEED, DATA_CNT,
+                                STDV, STDV_HSPEED, STDV_LSPEED)
+        SELECT LINKID, #{past25Min}, AVGSPEED, DATACNT, STDSPEED,
+               DECODE(#{codeValue0}, 'Y', AVGSPEED + STDSPEED * TO_NUMBER(#{codeValue5}), 200),
+               DECODE(#{codeValue0}, 'Y', AVGSPEED - STDSPEED * TO_NUMBER(#{codeValue5}), 0)
+        FROM (
+                 SELECT LINKID        AS LINKID,
+                        COUNT(1)      AS DATACNT,
+                        AVG(SPEED)    AS AVGSPEED,
+                        STDDEV(SPEED) AS STDSPEED
+                 FROM STAT_LOCAL
+                 WHERE LOCAL_DATE IS NOT NULL
+                 GROUP BY LINKID
+             ) a
+    </insert>
+
+    <select id="findHoliday" parameterType="java.lang.String" resultType="com.utic.dwdb.server.dto.HolidayDto">
+        SELECT SUM(WDAY) AS wDay, SUM(HCNT) AS hCnt
+        FROM (
+                 SELECT TO_NUMBER(TO_CHAR(TO_DATE(#{past25Min}, 'YYYYMMDDHH24MISS'), 'D')) AS WDAY,
+                        0 AS HCNT
+                 FROM DUAL
+                 UNION ALL
+                 SELECT 0 AS WDAY,
+                        COUNT(1) AS HCNT
+                 FROM HOLIDAY
+                 WHERE HOLIDAY = SUBSTR(#{past25Min}, 1, 8)
+             )
+    </select>
+
+    <update id="updateLinkFilterPattern" parameterType="java.lang.String">
+        UPDATE LINK_FILTER a
+        SET (STAT_HSPEED, STAT_LSPEED) =
+                (
+                    SELECT SPEED + ${maxValue}, SPEED - ${minValue}
+                    FROM ${fromTable}
+                    WHERE PATN_TIME = SUBSTR(#{past25Min}, 9, 4)
+                      AND a.LINKID = LINKID
+                )
+    </update>
+
+    <update id="updateLinkFilterNull">
+        UPDATE LINK_FILTER a
+        SET STAT_HSPEED = 999,
+            STAT_LSPEED = 0
+        WHERE STAT_HSPEED IS NULL
+    </update>
+
+    <update id="updateLinkFilterRoadRank">
+        UPDATE LINK_FILTER a
+        SET (ROADRANK, LINKLEVEL) =
+                (
+                    SELECT ROADRANK, LINKLEVEL
+                    FROM LINK
+                    WHERE LinkID = a.LinkID
+                )
+    </update>
+
+    <update id="updateLinkFilterMinMax" parameterType="java.lang.Integer">
+        UPDATE LINK_FILTER a
+        SET GRAD_HSPEED = DECODE(ROADRANK, '101', #{maxValue6, jdbcType=NUMERIC},
+                                           '102', #{maxValue7, jdbcType=NUMERIC},
+                                           '103', #{maxValue8, jdbcType=NUMERIC},
+                                                  #{maxValue9, jdbcType=NUMERIC}
+                          ),
+            GRAD_LSPEED = DECODE(ROADRANK, '101', #{minValue6, jdbcType=NUMERIC},
+                                           '102', #{minValue7, jdbcType=NUMERIC},
+                                           '103', #{minValue8, jdbcType=NUMERIC},
+                                                  #{minValue9, jdbcType=NUMERIC}
+                          )
+        WHERE ROADRANK Is Not NULL
+    </update>
+
+    <insert id="insertStatLocalLog">
+        INSERT INTO STAT_LOCAL_LOG(LOCAL_DATE, CENTER_ID, LINKID, REV_TYPE, SPEED)
+        SELECT LOCAL_DATE, CENTER_ID, LINKID, REV_TYPE, SPEED
+        FROM STAT_LOCAL
+    </insert>
+
+
+    <select id="findLinkFilterMakeDate" resultType="java.lang.String">
+        SELECT MAK_DATE AS makeDate
+        FROM LINK_FILTER
+        WHERE ROWNUM = 1
+    </select>
+
+    <insert id="insertCenterLog" parameterType="java.lang.String">
+        INSERT INTO CENTER_LOG(EXE_DATE, CENTER_ID, LOG_DATE, DATA_CNT)
+        SELECT #{regDate}, CENTER_ID, SYSDATE, COUNT(1)
+        FROM (SELECT A.LINKID, C.CENTER_ID
+              FROM (SELECT DISTINCT LINKID AS LINKID
+                    FROM STAT_LOCAL) A,
+                   LINK B,
+                   LOCAL_AREA C
+              WHERE B.LINKLEVEL = '1'
+                AND A.LINKID = B.LINKID
+                AND C.CENTER_ID IS NOT NULL
+                AND SUBSTR(A.LINKID, 1, 3) = C.SLOCAL_ID
+             )
+        GROUP BY CENTER_ID
+    </insert>
+
+    <insert id="insertUtisLog" parameterType="java.lang.String">
+        INSERT INTO UTIS_LOG(EXE_DATE, CENTER_ID, LOG_DATE, DATA_CNT)
+        SELECT /*+ INDEX(A PK_TRAFF5M_HIST) */
+            #{regDate},
+            A.CENTERID, SYSDATE, COUNT(1)
+        FROM TRAFFIC5M_HIST A, LINK B
+        WHERE A.REGDT BETWEEN TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS') - 299/86400
+            AND TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS')
+          AND B.LINKLEVEL = '1'
+          AND A.LINKID    = B.LINKID
+        GROUP BY A.CENTERID
+    </insert>
+
+    <insert id="insertStatTrafficLog" parameterType="java.lang.String">
+        INSERT INTO STAT_TRAFFIC_LOG(EXE_DATE, CENTER_ID, MISSVALUEYN, LANES, DATA_CNT)
+        SELECT SUBSTR(#{regDate}, 1, 12), C.CENTER_ID, A.MISSVALUEYN, DECODE(B.LANES, 1, 1, 2), COUNT(1)
+        FROM TRAFFIC_CENTER_HIST A, LINK B, LOCAL_AREA C
+        WHERE B.LINKLEVEL = '1'
+          AND A.REGDATE = TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS')
+          AND A.LINKID = B.LINKID
+          AND SUBSTR(A.LINKID, 1, 3) = C.SLOCAL_ID
+          AND C.CENTER_ID IS NOT NULL
+        GROUP BY C.CENTER_ID, A.MISSVALUEYN, DECODE(B.LANES, 1, 1, 2)
+    </insert>
+
+    <insert id="insertFilterLog" parameterType="java.lang.String">
+        INSERT INTO FILTER_LOG(EXE_DATE, CENTER_ID, LOG_DATE, LINK_FILTER_CNT, LINKLEVEL_FILTER_CNT, ZERO_CNT,
+                               STD_YN, STD_CNT, STA_YN, STA_CNT, RGF_YN, RGF_CNT, RGF_USE_YN)
+        SELECT #{regDate}, CENTER_ID, SYSDATE,
+               SUM(CNT_LINK), SUM(LEVEL_CNT), SUM(ZERO_CNT),
+               #{codeValue0}, DECODE(#{codeValue0}, 'Y', SUM(CNT_STD), 0),
+               #{codeValue1}, DECODE(#{codeValue1}, 'Y', SUM(CNT_STAT),0),
+               #{codeValue2}, DECODE(#{codeValue2}, 'Y', SUM(CNT_MAX), 0),
+               #{codeValue3}
+        FROM (
+                 SELECT a.CENTER_ID, COUNT(*) CNT_LINK, 0 CNT_STD, 0 CNT_STAT, 0 CNT_MAX, 0 LEVEL_CNT, 0 ZERO_CNT
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NULL
+                 GROUP BY a.CENTER_ID
+                 UNION ALL
+                 SELECT a.CENTER_ID, 0 CNT_LINK, COUNT(1) CNT_STD, 0 CNT_STAT, 0 CNT_MAX, 0 LEVEL_CNT, 0 ZERO_CN
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND (a.SPEED > B.STDV_HSPEED OR a.SPEED <![CDATA[ < ]]> B.STDV_LSPEED)
+                   AND b.DATA_CNT <![CDATA[ >= ]]> TO_NUMBER(#{codeValue4})
+                 GROUP BY a.CENTER_ID
+                 UNION ALL
+                 SELECT CENTER_ID, 0 CNT_LINK, 0 CNT_STD, 0 CNT_STAT, 0 CNT_MAX, 0 LEVEL_CNT, COUNT(1) ZERO_CNT
+                 FROM STAT_LOCAL
+                 WHERE SPEED = 0
+                 GROUP BY CENTER_ID
+                 UNION ALL
+                 SELECT a.CENTER_ID, 0 CNT_LINK, 0 CNT_STD, COUNT(1) CNT_STAT, 0 CNT_MAX, 0 LEVEL_CNT, 0 ZERO_CN
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND (a.SPEED > B.STAT_HSPEED OR a.SPEED <![CDATA[ < ]]> B.STAT_LSPEED)
+                 GROUP BY a.CENTER_ID
+                 UNION ALL
+                 SELECT a.CENTER_ID, 0 CNT_LINK, 0 CNT_STD, 0 CNT_STAT, COUNT(1) CNT_MAX, 0 LEVEL_CNT, 0 ZERO_CN
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND (a.SPEED > B.GRAD_HSPEED OR a.SPEED <![CDATA[ < ]]> B.GRAD_LSPEED)
+                 GROUP BY a.CENTER_ID
+                 UNION ALL
+                 SELECT a.CENTER_ID, 0 CNT_LINK, 0 CNT_STD, 0 CNT_STAT, 0 CNT_MAX, COUNT(1) LEVEL_CNT, 0 ZERO_CN
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.LINKLEVEL IS NOT NULL
+                   AND b.LINKLEVEL != '1'
+                 GROUP BY a.CENTER_ID
+             )
+        GROUP BY CENTER_ID
+    </insert>
+
+    <insert id="insertLinkFilterLog" parameterType="java.lang.String">
+        INSERT INTO LINK_FILTER_LOG(LOCAL_DATE, CENTER_ID, LINKID, REV_TYPE, LINK_FILTER_YN, LINKLEVEL_FILTER_YN, ZERO_YN, STD_YN, STA_YN, RGF_YN)
+        SELECT LOCAL_DATE, CENTER_ID, LINKID, REV_TYPE,
+               DECODE(LINK_FILTER, 0, 'N', 'Y'), DECODE(LINKLEVEL_FILTER, 0, 'N', 'Y'), DECODE(ZERO, 0, 'N', 'Y'),
+               DECODE(STD, 0, 'N', 'Y'), DECODE(STA, 0, 'N', 'Y'), DECODE(RGF, 0, 'N', 'Y')
+        FROM (
+                 SELECT CENTER_ID, LOCAL_DATE, LINKID, REV_TYPE,
+                        SUM(LINK_FILTER) LINK_FILTER, SUM(LINKLEVEL_FILTER) LINKLEVEL_FILTER, SUM(ZERO) ZERO,
+                        SUM(STD) STD, SUM(STA) STA, SUM(RGF) RGF
+                 FROM (
+                          SELECT a.CENTER_ID, a.LOCAL_DATE, a.LINKID, a.REV_TYPE, 1 LINK_FILTER, 0 LINKLEVEL_FILTER, 0 ZERO, 0 STD, 0 STA, 0 RGF
+                          FROM STAT_LOCAL a, LINK_FILTER b
+                          WHERE a.LINKID = b.LINKID
+                            AND b.ROADRANK IS NULL
+                          UNION ALL
+                          SELECT a.CENTER_ID, a.LOCAL_DATE, a.LINKID, a.REV_TYPE, 0 LINK_FILTER, 0 LINKLEVEL_FILTER, 0 ZERO, 1 STD, 0 STA, 0 RGF
+                          FROM STAT_LOCAL a, LINK_FILTER b
+                          WHERE a.LINKID = b.LINKID
+                            AND (a.SPEED > B.STDV_HSPEED OR a.SPEED <![CDATA[ < ]]> B.STDV_LSPEED)
+                            AND b.DATA_CNT <![CDATA[ >= ]]> TO_NUMBER(#{codeValue4})
+                          UNION ALL
+                          SELECT a.CENTER_ID, a.LOCAL_DATE, a.LINKID, a.REV_TYPE, 0 LINK_FILTER, 0 LINKLEVEL_FILTER, 1 ZERO, 0 STD, 0 STA, 0 RGF
+                          FROM STAT_LOCAL a
+                          WHERE SPEED = 0
+                          UNION ALL
+                          SELECT a.CENTER_ID, a.LOCAL_DATE, a.LINKID, a.REV_TYPE, 0 LINK_FILTER, 0 LINKLEVEL_FILTER, 0 ZERO, 0 STD, 1 STA, 0 RGF
+                          FROM STAT_LOCAL a, LINK_FILTER b
+                          WHERE a.LINKID = b.LINKID
+                            AND (a.SPEED > B.STAT_HSPEED OR a.SPEED <![CDATA[ < ]]> B.STAT_LSPEED)
+                          UNION ALL
+                          SELECT a.CENTER_ID, a.LOCAL_DATE, a.LINKID, a.REV_TYPE, 0 LINK_FILTER, 0 LINKLEVEL_FILTER, 0 ZERO, 0 STD, 0 STA, 1 RGF
+                          FROM STAT_LOCAL a, LINK_FILTER b
+                          WHERE a.LINKID = b.LINKID
+                            AND (a.SPEED > B.GRAD_HSPEED OR a.SPEED <![CDATA[ < ]]> B.GRAD_LSPEED)
+                          UNION ALL
+                          SELECT a.CENTER_ID, a.LOCAL_DATE, a.LINKID, a.REV_TYPE, 0 LINK_FILTER, 1 LINKLEVEL_FILTER, 0 ZERO, 0 STD, 0 STA, 0 RGF
+                          FROM STAT_LOCAL a, LINK_FILTER b
+                          WHERE a.LINKID = b.LINKID
+                            AND b.LINKLEVEL IS NOT NULL
+                            AND b.LINKLEVEL != '1'
+                      )
+                 GROUP BY CENTER_ID, LOCAL_DATE, LINKID, REV_TYPE
+             )
+    </insert>
+
+    <insert id="insertStat5MinCenter" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_CENTER(STAT_DATE,
+                                     LINKID, LINKLEVEL, DAY_TYPE, SPEED, DATA_CNT, TRAVEL_TIME)
+        SELECT a1.S_DATE, a1.LINKID, '1' LinkLEVEL,
+               a1.DAY_TYPE, a1.Speed, DataCnt,
+               ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
+        FROM (
+                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                        a.LINKID,
+                        TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+                        AVG(SPEED) Speed,
+                        COUNT(1) DataCnt
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NOT NULL
+                   AND b.LINKLEVEL = '1'
+                   AND b.DATA_CNT <![CDATA[ >= ]]> TO_NUMBER(#{codeValue4})
+                   AND a.SPEED <![CDATA[ <= ]]> B.STDV_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STDV_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.STAT_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STAT_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.GRAD_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.GRAD_LSPEED
+                   AND a.SPEED <![CDATA[ > ]]> 0
+                 GROUP BY a.LINKID
+             ) a1, LINK b1
+        WHERE a1.LINKID = b1.LINKID
+        UNION ALL
+        SELECT a1.S_DATE, a1.LINKID, '1' LinkLEVEL,
+               a1.DAY_TYPE, a1.Speed, DataCnt,
+               ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
+        FROM (
+                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                        a.LINKID,
+                        TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+                        AVG(SPEED) Speed,
+                        COUNT(1) DataCnt
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NOT NULL
+                   AND b.LINKLEVEL = '1'
+                   AND b.DATA_CNT <![CDATA[ < ]]> TO_NUMBER(#{codeValue4})
+                   AND a.SPEED <![CDATA[ <= ]]> B.STAT_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STAT_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.GRAD_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.GRAD_LSPEED
+                   AND a.SPEED <![CDATA[ > ]]> 0
+                 GROUP BY a.LINKID
+             ) a1, LINK b1
+        WHERE a1.LINKID = b1.LINKID
+    </insert>
+
+    <insert id="insertStatFilterLog" parameterType="java.lang.String">
+        INSERT INTO STAT_FILTER_LOG(EXE_DATE, CENTER_ID, COLLECT_CNT, FILTER_CNT)
+        SELECT SUBSTR(#{regDate}, 1, 12) AS EXE_DATE, CENTER_ID, SUM(COLLECT_CNT) AS COLLECT_CNT, SUM(FILTER_CNT) AS FILTER_CNT
+        FROM (
+                 SELECT CENTER_ID, COUNT(1) AS COLLECT_CNT, 0 AS FILTER_CNT
+                 FROM (SELECT A.LINKID, C.CENTER_ID
+                       FROM (SELECT DISTINCT LINKID AS LINKID FROM STAT_LOCAL) A, LINK B, LOCAL_AREA C
+                       WHERE B.LINKLEVEL = '1'
+                         AND A.LINKID = B.LINKID
+                         AND C.CENTER_ID IS NOT NULL
+                         AND SUBSTR(A.LINKID, 1, 3) = C.SLOCAL_ID
+                      )
+                 GROUP BY CENTER_ID
+                 UNION ALL
+                 SELECT C.CENTER_ID, 0 AS COLLECT_CNT, COUNT(1) AS FILTER_CNT
+                 FROM STAT_5MIN_CENTER A, LINK B, LOCAL_AREA C
+                 WHERE A.STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+                   AND A.LINKLEVEL = '1'
+                   AND A.LINKID = B.LINKID
+                   AND C.CENTER_ID IS NOT NULL
+                   AND SUBSTR(A.LINKID, 1, 3) = C.SLOCAL_ID
+                 GROUP BY C.CENTER_ID
+             )
+        GROUP BY CENTER_ID
+    </insert>
+
+    <insert id="insertStat5MinCenterLevel" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_CENTER(STAT_DATE,
+                                     LINKID, LINKLEVEL, DAY_TYPE, SPEED, DATA_CNT)
+        SELECT SUBSTR(#{regDate}, 1, 12),
+               b1.LOGICALLINKID, #{linkLevel} LINKLEVEL,
+               TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+               ROUND(SUM(a1.LENGTH * a1.SPEED)/SUM(a1.LENGTH)) SPEED,
+               COUNT(*) DATA_CNT
+        FROM
+            (
+                SELECT A.LINKID, A.LENGTH, B.SPEED
+                FROM LINK A, STAT_5MIN_CENTER B
+                WHERE A.LINKID = B.LINKID
+                  AND A.LINKLEVEL ='1'
+                  AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+            ) a1,
+            (
+                SELECT a.LOGICALLINKID, a.LINKID
+                FROM LOGICALLINK a,
+                     (
+                         SELECT LINKID
+                         FROM LINK
+                         WHERE LINKLEVEL = #{linkLevel}
+                     ) B
+                WHERE a.LOGICALLINKID = b.LINKID
+                  AND a.LINKLEVEL = '1'
+            ) b1
+        WHERE a1.LINKID = b1.LINKID
+        GROUP BY b1.LOGICALLINKID
+    </insert>
+
+    <update id="updateStat5MinCenter" parameterType="java.lang.String">
+        UPDATE STAT_5MIN_CENTER a
+        SET TRAVEL_TIME =
+                (
+                    SELECT (b.LENGTH * 3.6)/a.SPEED
+                    FROM LINK b
+                    WHERE a.LinkID = b.LinkID
+                )
+        WHERE LINKLEVEL IN('2', '3', '4')
+          AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+    </update>
+
+
+    <insert id="insertStat5Min12Loc" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_12LOC(STAT_DATE,
+                                    LINKID, LINKLEVEL, DAY_TYPE, SPEED, DATA_CNT, TRAVEL_TIME)
+        SELECT a1.S_DATE, a1.LINKID, '1' LinkLEVEL,
+               a1.DAY_TYPE, a1.Speed, DataCnt,
+               ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
+        FROM (
+                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                        a.LINKID,
+                        TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+                        AVG(SPEED) Speed,
+                        COUNT(*) DataCnt
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NOT NULL
+                   AND b.LINKLEVEL = '1'
+                   AND b.DATA_CNT <![CDATA[ >= ]]> TO_NUMBER(#{codeValue4})
+                   AND a.SPEED <![CDATA[ <= ]]> B.STDV_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STDV_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.STAT_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STAT_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.GRAD_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.GRAD_LSPEED
+                   AND a.REV_TYPE = 'L'
+                   AND a.SPEED > 0
+                 GROUP BY a.LINKID
+             ) a1, LINK b1
+        WHERE a1.LINKID = b1.LINKID
+        UNION ALL
+        SELECT a1.S_DATE, a1.LINKID, '1' LinkLEVEL,
+               a1.DAY_TYPE, a1.Speed, DataCnt,
+               ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
+        FROM (
+                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                        a.LINKID,
+                        TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+                        AVG(SPEED) Speed,
+                        COUNT(*) DataCnt
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NOT NULL
+                   AND b.LINKLEVEL = '1'
+                   AND b.DATA_CNT <![CDATA[ < ]]> TO_NUMBER(#{codeValue4})
+                   AND a.SPEED <![CDATA[ <= ]]> B.STAT_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STAT_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.GRAD_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.GRAD_LSPEED
+                   AND a.REV_TYPE = 'L'
+                   AND a.SPEED > 0
+                 GROUP BY a.LINKID
+             ) a1, LINK b1
+        WHERE a1.LINKID = b1.LINKID
+    </insert>
+
+
+    <insert id="insertStat5Min12LocLevel" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_12LOC(STAT_DATE,
+                                    LINKID, LINKLEVEL, DAY_TYPE, SPEED, DATA_CNT)
+        SELECT SUBSTR(#{regDate}, 1, 12),
+               b1.LOGICALLINKID, #{linkLevel} LINKLEVEL,
+               TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+               ROUND(SUM(a1.LENGTH * a1.SPEED)/SUM(a1.LENGTH)) SPEED,
+               COUNT(*) DATA_CNT
+        FROM
+            (
+                SELECT A.LINKID, A.LENGTH, B.SPEED
+                FROM LINK A, STAT_5MIN_12LOC B
+                WHERE A.LINKID = B.LINKID
+                  AND A.LINKLEVEL ='1'
+                  AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+            ) a1,
+            (
+                SELECT a.LOGICALLINKID, a.LINKID
+                FROM LOGICALLINK a,
+                     (
+                         SELECT LINKID
+                         FROM LINK
+                         WHERE LINKLEVEL = #{linkLevel}
+                     ) B
+                WHERE a.LOGICALLINKID = b.LINKID
+                  AND a.LINKLEVEL = '1'
+            ) b1
+        WHERE a1.LINKID = b1.LINKID
+        GROUP BY b1.LOGICALLINKID
+    </insert>
+
+    <update id="updateStat5Min12LocTravelTime" parameterType="java.lang.String">
+        UPDATE STAT_5MIN_12LOC a
+        SET TRAVEL_TIME =
+                (
+                    SELECT (b.LENGTH * 3.6)/a.SPEED
+                    FROM LINK b
+                    WHERE a.LinkID = b.LinkID
+                )
+        WHERE LINKLEVEL IN('2', '3', '4')
+          AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+    </update>
+
+
+    <insert id="insertStat5MinExw" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_EXW(STAT_DATE,
+                                  LINKID, LINKLEVEL, DAY_TYPE, SPEED, DATA_CNT, TRAVEL_TIME)
+        SELECT a1.S_DATE, a1.LINKID, '1' LinkLEVEL,
+               a1.DAY_TYPE, a1.Speed, DataCnt,
+               ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
+        FROM (
+                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                        a.LINKID,
+                        TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+                        AVG(SPEED) Speed,
+                        COUNT(*) DataCnt
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NOT NULL
+                   AND b.LINKLEVEL = '1'
+                   AND b.DATA_CNT <![CDATA[ >= ]]> #{codeValue4}
+                   AND a.SPEED <![CDATA[ <= ]]> B.STDV_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STDV_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.STAT_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STAT_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.GRAD_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.GRAD_LSPEED
+                   AND a.REV_TYPE = 'S'
+                   AND a.SPEED > 0
+                 GROUP BY a.LINKID
+             ) a1, LINK b1
+        WHERE a1.LINKID = b1.LINKID
+        UNION ALL
+        SELECT a1.S_DATE, a1.LINKID, '1' LinkLEVEL,
+               a1.DAY_TYPE, a1.Speed, DataCnt,
+               ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
+        FROM (
+                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                        a.LINKID,
+                        TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+                        AVG(SPEED) Speed,
+                        COUNT(*) DataCnt
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NOT NULL
+                   AND b.LINKLEVEL = '1'
+                   AND b.DATA_CNT <![CDATA[ < ]]> #{codeValue4}
+                   AND a.SPEED <![CDATA[ <= ]]> B.STAT_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STAT_LSPEED
+                   AND a.SPEED <![CDATA[ <=]]>  B.GRAD_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.GRAD_LSPEED
+                   AND a.REV_TYPE = 'S'
+                   AND a.SPEED > 0
+                 GROUP BY a.LINKID
+             ) a1, LINK b1
+        WHERE a1.LINKID = b1.LINKID
+    </insert>
+
+
+    <insert id="insertStat5MinExwLevel" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_EXW(STAT_DATE,
+                                  LINKID, LINKLEVEL, DAY_TYPE, SPEED, DATA_CNT)
+        SELECT SUBSTR(#{regDate}, 1, 12),
+               b1.LOGICALLINKID, #{linkLevel} LINKLEVEL,
+               TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+               ROUND(SUM(a1.LENGTH * a1.SPEED)/SUM(a1.LENGTH)) SPEED,
+               COUNT(*) DATA_CNT
+        FROM
+            (
+                SELECT A.LINKID, A.LENGTH, B.SPEED
+                FROM LINK A, STAT_5MIN_EXW B
+                WHERE A.LINKID = B.LINKID
+                  AND A.LINKLEVEL ='1'
+                  AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+            ) a1,
+            (
+                SELECT a.LOGICALLINKID, a.LINKID
+                FROM LOGICALLINK a,
+                     (
+                         SELECT LINKID
+                         FROM LINK
+                         WHERE LINKLEVEL = #{linkLevel}
+                     ) B
+                WHERE a.LOGICALLINKID = b.LINKID
+                  AND a.LINKLEVEL = '1'
+            ) b1
+        WHERE a1.LINKID = b1.LINKID
+        GROUP BY b1.LOGICALLINKID
+    </insert>
+
+    <update id="updateStat5MinExwTravelTime" parameterType="java.lang.String">
+        UPDATE STAT_5MIN_EXW a
+        SET TRAVEL_TIME =
+                (
+                    SELECT (b.LENGTH * 3.6)/a.SPEED
+                    FROM LINK b
+                    WHERE a.LinkID = b.LinkID
+                )
+        WHERE LINKLEVEL IN('2', '3', '4')
+          AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+    </update>
+
+    <insert id="insertStat5MinLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_LOC(STAT_DATE,
+                                  LINKID, LINKLEVEL, DAY_TYPE, SPEED, DATA_CNT, TRAVEL_TIME)
+        SELECT a1.S_DATE, a1.LINKID, '1' LinkLEVEL,
+               a1.DAY_TYPE, a1.Speed, DataCnt,
+               ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
+        FROM (
+                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                        a.LINKID,
+                        TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+                        AVG(SPEED) Speed,
+                        COUNT(*) DataCnt
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NOT NULL
+                   AND b.LINKLEVEL = '1'
+                   AND b.DATA_CNT <![CDATA[ >= ]]> #{codeValue4}
+                   AND a.SPEED <![CDATA[ <= ]]> B.STDV_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STDV_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.STAT_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STAT_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.GRAD_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.GRAD_LSPEED
+                   AND a.REV_TYPE = 'U'
+                   AND a.SPEED > 0
+                 GROUP BY a.LINKID
+             ) a1, LINK b1
+        WHERE a1.LINKID = b1.LINKID
+        UNION ALL
+        SELECT a1.S_DATE, a1.LINKID, '1' LinkLEVEL,
+               a1.DAY_TYPE, a1.Speed, DataCnt,
+               ROUND(b1.LENGTH / ((a1.Speed * 1000)/3600)) TRAVEL_TIME
+        FROM (
+                 SELECT SUBSTR(#{regDate}, 1, 12) S_Date,
+                        a.LINKID,
+                        TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+                        AVG(SPEED) Speed,
+                        COUNT(*) DataCnt
+                 FROM STAT_LOCAL a, LINK_FILTER b
+                 WHERE a.LINKID = b.LINKID
+                   AND b.ROADRANK IS NOT NULL
+                   AND b.LINKLEVEL = '1'
+                   AND b.DATA_CNT <![CDATA[ < ]]> #{codeValue4}
+                   AND a.SPEED <![CDATA[ <= ]]> B.STAT_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.STAT_LSPEED
+                   AND a.SPEED <![CDATA[ <= ]]> B.GRAD_HSPEED
+                   AND a.SPEED <![CDATA[ >= ]]> B.GRAD_LSPEED
+                   AND a.REV_TYPE = 'U'
+                   AND a.SPEED > 0
+                 GROUP BY a.LINKID
+             ) a1, LINK b1
+        WHERE a1.LINKID = b1.LINKID
+    </insert>
+
+
+    <insert id="insertStat5MinLocLevel" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_LOC(STAT_DATE,
+                                  LINKID, LINKLEVEL, DAY_TYPE, SPEED, DATA_CNT)
+        SELECT SUBSTR(#{regDate}, 1, 12),
+               b1.LOGICALLINKID, #{linkLevel} LINKLEVEL,
+               TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') DAY_TYPE,
+               ROUND(SUM(a1.LENGTH * a1.SPEED)/SUM(a1.LENGTH)) SPEED,
+               COUNT(*) DATA_CNT
+        FROM
+            (
+                SELECT A.LINKID, A.LENGTH, B.SPEED
+                FROM LINK A, STAT_5MIN_LOC B
+                WHERE A.LINKID = B.LINKID
+                  AND A.LINKLEVEL = '1'
+                  AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+            ) a1,
+            (
+                SELECT a.LOGICALLINKID, a.LINKID
+                FROM LOGICALLINK a,
+                     (
+                         SELECT LINKID
+                         FROM LINK
+                         WHERE LINKLEVEL = #{linkLevel}
+                     ) B
+                WHERE a.LOGICALLINKID = b.LINKID
+                  AND a.LINKLEVEL = '1'
+            ) b1
+        WHERE a1.LINKID = b1.LINKID
+        GROUP BY b1.LOGICALLINKID
+    </insert>
+
+    <update id="updateStat5MinLocTravelTime" parameterType="java.lang.String">
+        UPDATE STAT_5MIN_LOC a
+        SET TRAVEL_TIME =
+                (
+                    SELECT (b.LENGTH * 3.6)/a.SPEED
+                    FROM LINK b
+                    WHERE a.LinkID = b.LinkID
+                )
+        WHERE LINKLEVEL IN('2', '3', '4')
+          AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+    </update>
+
+
+    <insert id="insertStat5MinObeLoc" parameterType="java.lang.String">
+        INSERT INTO STAT_5MIN_OBELOC(STAT_DATE, LINKID, LINKLEVEL, DAY_TYPE, SPEED, TRAVEL_TIME, DATA_CNT)
+        SELECT SUBSTR(#{regDate}, 1, 12) AS STAT_DATE, A.LINKID, MIN(B.LINKLEVEL) AS LINKLVEL,
+               TO_CHAR(TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS'), 'D') AS DAY_TYPE,
+               ROUND(AVG(A.SPEED)) AS SPEED,
+               ROUND( (MIN(B.LENGTH) * 3.6) / ROUND(AVG(A.SPEED)) ) AS TRAVEL_TIME,
+               SUM(A.DATACNT) AS DATA_CNT
+        FROM TRAFFIC_OBELOC_HIST A, LINK B
+        WHERE B.LINKLEVEL = '1'
+          AND A.LINKID    = B.LINKID
+          AND A.REGDATE BETWEEN TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS') - 299/86400
+            AND TO_DATE(#{regDate}, 'YYYYMMDDHH24MISS')
+        GROUP BY A.LINKID
+    </insert>
+
+
+
+    <insert id="insertPatternHist" parameterType="java.lang.String">
+        INSERT INTO ${targetTable}(PATN_DATE, PATN_TIME, LINKID, SPEED, LOG_DATE, LINKLEVEL)
+        SELECT SUBSTR(#{regDate}, 1, 8), PATN_TIME, LINKID, SPEED, LOG_DATE, LINKLEVEL
+        FROM ${fromTable}
+        WHERE PATN_TIME = SUBSTR(#{regDate}, 9, 4)
+    </insert>
+
+    <update id="updatePattern" parameterType="java.lang.String">
+        UPDATE ${targetTable} a
+        SET (SPEED, LOG_DATE) =
+                (
+                    SELECT DECODE(a.SPEED, NULL, SPEED,
+                                  ( (a.SPEED * TO_NUMBER(#{minValue})) + ( SPEED * TO_NUMBER(#{maxValue}) ) ) / ( TO_NUMBER(#{minValue}) + TO_NUMBER(#{maxValue}) ) ),
+                           SYSDATE
+                    FROM STAT_5MIN_CENTER
+                    WHERE LINKID = a.LINKID
+                      AND STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+                )
+        WHERE PATN_TIME = SUBSTR(#{regDate}, 9, 4)
+          AND LINKID IN (SELECT LINKID
+                         FROM STAT_5MIN_CENTER
+                         WHERE STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+                           AND LINKLEVEL IN ('1', '4')
+                           AND LINKID NOT IN
+                               (SELECT A.LINKID
+                                FROM INCIDENT_CENTER A
+                                WHERE TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ >= ]]> A.STARTDATE
+                                  AND TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ <= ]]> DECODE((SIGN((ENDDATE-STARTDATE)*24*60)-30), 1, A.ENDDATE+1/24/60*60, A.ENDDATE+1/24/60*30)
+                                GROUP BY A.LINKID)
+        )
+    </update>
+
+    <update id="mergePatternWeekJob" parameterType="java.lang.String">
+        MERGE INTO PATN_WEEK_JOB NP
+            USING (SELECT B.LINKID, NVL(A.SPEED, 0) AS SPEED, SYSDATE AS LOG_DATE, A.LINKLEVEL
+                   FROM STAT_5MIN_CENTER A, LINK B
+                   WHERE A.STAT_DATE = SUBSTR(#{regDate}, 1, 12)
+                     AND B.LINKLEVEL IN ('1', '4')
+                     AND A.SPEED > 0 AND A.SPEED <![CDATA[ < ]]> 150
+                     AND A.LINKID(+) = B.LINKID
+                     AND A.LINKLEVEL = B.LINKLEVEL) MG
+            ON (NP.PATN_TIME = SUBSTR(#{regDate}, 9, 4) AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET NP.${columnName} = MG.SPEED
+            WHEN NOT MATCHED THEN
+                INSERT (NP.PATN_TIME, NP.LINKID, NP.SPEED3, NP.SPEED4, NP.SPEED5, NP.LINKLEVEL)
+                VALUES (SUBSTR(#{regDate}, 9, 4), MG.LINKID, 0, 0, MG.SPEED, MG.LINKLEVEL)
+    </update>
+
+    <update id="updatePatternWeekJob" parameterType="java.lang.String">
+        UPDATE PATN_WEEK_JOB A
+        SET A.${columnName} = 0
+        WHERE A.PATN_TIME = SUBSTR(#{regDate}, 9, 4)
+          AND A.LINKID IN (
+            SELECT A.LINKID
+            FROM INCIDENT_CENTER A
+            WHERE TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ >=]]>  A.STARTDATE
+              AND TO_DATE(SUBSTR(#{regDate}, 1, 14), 'YYYYMMDDHH24MISS') <![CDATA[ <= ]]> DECODE((SIGN((ENDDATE-STARTDATE)*24*60)-30), 1, A.ENDDATE+1/24/60*60, A.ENDDATE+1/24/60*30)
+            GROUP BY A.LINKID)
+    </update>
+
+    <update id="mergePatternWeek" parameterType="java.lang.String">
+        MERGE INTO PATN_WEEK NP
+            USING (SELECT LINKID, LINKLEVEL,
+                          (SPEED3+SPEED4+SPEED5)/(DECODE(SPEED3,0,0,1)+DECODE(SPEED4,0,0,1)+DECODE(SPEED4,0,0,1)) AS AVGSPEED
+                   FROM PATN_WEEK_JOB
+                   WHERE PATN_TIME = SUBSTR(#{regDate}, 9, 4)SUBSTR(#{regDate}, 9, 4)
+                     AND (DECODE(SPEED3,0,0,1)+DECODE(SPEED4,0,0,1)+DECODE(SPEED4,0,0,1)) > 0
+                     AND (SPEED3+SPEED4+SPEED5) <![CDATA[ > ]]> 0
+                     AND (SPEED3+SPEED4+SPEED5) <![CDATA[ < ]]> 450) MG
+            ON (NP.PATN_TIME = SUBSTR(#{regDate}, 9, 4) AND NP.LINKID = MG.LINKID)
+            WHEN MATCHED THEN
+                UPDATE SET NP.SPEED    = DECODE(NP.SPEED, NULL, MG.AVGSPEED, ((NP.SPEED*TO_NUMBER(#{minValue})+MG.AVGSPEED*TO_NUMBER(#{maxValue}))/(TO_NUMBER(#{minValue})+TO_NUMBER(#{maxValue})))),
+                    NP.LOG_DATE = SYSDATE
+            WHEN NOT MATCHED THEN
+                INSERT (NP.PATN_TIME, NP.LINKID, NP.SPEED,    NP.LOG_DATE, NP.LINKLEVEL)
+                VALUES (SUBSTR(#{regDate}, 9, 4), MG.LINKID, MG.AVGSPEED, SYSDATE, MG.LINKLEVEL)
+    </update>
+
+</mapper>