Commit 1d0560db authored by 강현수's avatar 강현수

16584 : refactor

parents
Pipeline #437 failed with stages
server:
port: 60012
spring:
application:
name: dataportal-api
profiles:
- dev
datasource:
hikari:
pool-name: dataportal-api-dbcp
maximumPoolSize: 50
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://echall-3-test-hevit-monitoring.caiafcuktsql.ap-northeast-2.rds.amazonaws.com:3306/solar?allowMultiQueries=true
username: hevitsvr
password: us&them100
mybatis:
mapper-locations:
- classpath*:mapper/*.xml
- classpath*:mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true
logging:
config: file:../config/logback-spring-dev.xml
# 참고 사이트
# http://www.cronmaker.com/;jsessionid=node017wytoozjhr9li45k2xw9epjj329715.node0?0
quartz-smp:
consumedata-property:
enable: true
schedule: "0 0 0/2 1/1 * ? *"
quartz-snd:
consumedata-property:
enable: true
schedule: "0 0/5 * 1/1 * ? *"
quartz-holiday:
consumedata-property:
enable: true
schedule: "0 0 10 ? * MON *" # 매주 월요일 10시
quartz-holiday-second:
consumedata-property:
enable: true
schedule: "0 0 10 ? * MON *"# 매주 월요일 11시
feign:
client:
config:
default:
connect-timeout: 3000
read-timeout: 3000
dataportal:
host: https://openapi.kpx.or.kr/openapi
serviceKey: q9UFQDXynoPTEE7AMlMMwxmBhiiKxkMWiCbZ8XxqFMnR09uDUz7GqR9QK8Jb3iUhUlcsgLD3ilsZsUV%2BoXCvQA%3D%3D # api인증키
smp:
uri-request-consume-data: /smp1hToday/getSmp1hToday # 서비스 동의 회원 전체 전기소비량 조회
snd:
uri-request-consume-data: /sukub5mMaxDatetime/getSukub5mMaxDatetime # 서비스 동의 회원 전체 전기소비량 조회
#공유일 데이터 조회 정보
open:
host: http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService
url-request-holiday-data : /getRestDeInfo
\ No newline at end of file
server:
port: 6002
spring:
application:
name: dataportal-api
profiles:
- local
datasource:
hikari:
pool-name: dataportal-api-dbcp
maximumPoolSize: 50
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://10.101.102.129:3306/solar
username: hevitsvr
password: we&there100
mybatis:
mapper-locations:
- classpath*:mapper/*.xml
- classpath*:mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true
logging:
config: file:./config/logback-spring-local.xml
# 참고 사이트
# http://www.cronmaker.com/;jsessionid=node017wytoozjhr9li45k2xw9epjj329715.node0?0
quartz-smp:
consumedata-property:
enable: true
schedule: "0 0/1 * * * ?"#테스트 주기
# schedule: "0 0 0 1/1 * ? *"#실제주기
quartz-snd:
consumedata-property:
enable: true
schedule: "0 0/1 * * * ?"#테스트 주기
# schedule: "0 0/5 * 1/1 * ? *"#실제주기
quartz-holiday:
consumedata-property:
enable: true
schedule: "0 0/2 * * * ?"#테스트 주기
quartz-holiday-second:
consumedata-property:
enable: true
schedule: "0/10 * * * * ?"#테스트 주기
feign:
client:
config:
default:
connect-timeout: 4000
read-timeout: 4000
circuitbreaker:
enabled: true
autoconfiguration:
jackson:
enabled: true
dataportal:
host: https://openapi.kpx.or.kr/openapi
serviceKey: q9UFQDXynoPTEE7AMlMMwxmBhiiKxkMWiCbZ8XxqFMnR09uDUz7GqR9QK8Jb3iUhUlcsgLD3ilsZsUV%2BoXCvQA%3D%3D # api인증키
smp:
uri-request-consume-data: /smp1hToday/getSmp1hToday # 서비스 동의 회원 전체 전기소비량 조회
snd:
uri-request-consume-data: /sukub5mMaxDatetime/getSukub5mMaxDatetime # 서비스 동의 회원 전체 전기소비량 조회
open:
host: http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService
url-request-holiday-data : /getRestDeInfo
server:
port: 5446
spring:
application:
name: dataportal-api
profiles:
- prod
datasource:
hikari:
pool-name: dataportal-api-dbcp
maximumPoolSize: 10
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://hevit-monitoring-v2.caiafcuktsql.ap-northeast-2.rds.amazonaws.com/solar
username: hevitsvr
password: us&them100
mybatis:
mapper-locations:
- classpath*:mapper/*.xml
- classpath*:mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true
logging:
config: file:../config/logback-spring-prod.xml
# 참고 사이트
# http://www.cronmaker.com/;jsessionid=node017wytoozjhr9li45k2xw9epjj329715.node0?0
quartz-smp:
consumedata-property:
enable: true
schedule: "0 0 0/2 1/1 * ? *"
quartz-snd:
consumedata-property:
enable: true
schedule: "0 0/5 * 1/1 * ? *"
quartz-holiday:
consumedata-property:
enable: true
schedule: "0 0 10 ? * MON *" # 매주 월요일 10시
quartz-holiday-second:
consumedata-property:
enable: true
schedule: "0 0 10 ? * MON *"# 매주 월요일 11시
feign:
client:
config:
default:
connect-timeout: 4000
read-timeout: 4000
circuitbreaker:
enabled: true
autoconfiguration:
jackson:
enabled: true
dataportal:
host: https://openapi.kpx.or.kr/openapi
serviceKey: q9UFQDXynoPTEE7AMlMMwxmBhiiKxkMWiCbZ8XxqFMnR09uDUz7GqR9QK8Jb3iUhUlcsgLD3ilsZsUV%2BoXCvQA%3D%3D # api인증키
smp:
uri-request-consume-data: /smp1hToday/getSmp1hToday # 서비스 동의 회원 전체 전기소비량 조회
snd:
uri-request-consume-data: /sukub5mMaxDatetime/getSukub5mMaxDatetime # 서비스 동의 회원 전체 전기소비량 조회
open:
host: http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService
url-request-holiday-data : /getRestDeInfo
server:
port: 6002
spring:
application:
name: dataportal-api
profiles:
- stg
datasource:
hikari:
pool-name: dataportal-api-dbcp
maximumPoolSize: 10
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://echall-3-test-hevit-monitoring.caiafcuktsql.ap-northeast-2.rds.amazonaws.com:3306/solar?allowMultiQueries=true
username: hevitsvr
password: us&them100
mybatis:
mapper-locations:
- classpath*:mapper/*.xml
- classpath*:mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true
logging:
config: file:../config/logback-spring-dev.xml
# 참고 사이트
# http://www.cronmaker.com/;jsessionid=node017wytoozjhr9li45k2xw9epjj329715.node0?0
quartz-smp:
consumedata-property:
enable: true
schedule: "0 0 0/2 1/1 * ? *"
quartz-snd:
consumedata-property:
enable: true
schedule: "0 0/5 * 1/1 * ? *"
quartz-holiday:
consumedata-property:
enable: true
schedule: "0 0 10 ? * MON *" # 매주 월요일 10시
quartz-holiday-second:
consumedata-property:
enable: true
schedule: "0 0 10 ? * MON *"# 매주 월요일 11시
feign:
client:
config:
default:
connect-timeout: 4000
read-timeout: 4000
circuitbreaker:
enabled: true
autoconfiguration:
jackson:
enabled: true
dataportal:
host: https://openapi.kpx.or.kr/openapi
serviceKey: q9UFQDXynoPTEE7AMlMMwxmBhiiKxkMWiCbZ8XxqFMnR09uDUz7GqR9QK8Jb3iUhUlcsgLD3ilsZsUV%2BoXCvQA%3D%3D # api인증키
smp:
uri-request-consume-data: /smp1hToday/getSmp1hToday # 서비스 동의 회원 전체 전기소비량 조회
snd:
uri-request-consume-data: /sukub5mMaxDatetime/getSukub5mMaxDatetime # 서비스 동의 회원 전체 전기소비량 조회
open:
host: http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService
url-request-holiday-data: /getRestDeInfo
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<property name="LOG_ROOT" value="/logs" />
<property name="LOG_FOLDER" value="dataportal-api" />
<property name="OMS_LOG_PATH" value="${LOG_ROOT}/omsLog/${LOG_FOLDER}" />
<property name="CALL_LOG_PATH" value="${LOG_ROOT}/callLog/${LOG_FOLDER}" />
<property name="ERROR_LOG_PATH" value="${LOG_ROOT}/errorLog/${LOG_FOLDER}" />
<property name="STD_LOG_PATH" value="${LOG_ROOT}/std/${LOG_FOLDER}" />
<property name="OMS_LEVEL" value="info" />
<property name="CALL_LEVEL" value="info" />
<property name="STD_LEVEL" value="info" />
<property name="ERROR_LEVEL" value="info" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%date{ISO8601}][%-4relative][%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<appender name="STD_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${STD_LOG_PATH}/std.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${STD_LOG_PATH}/%d{yyyy/MM/dd}/std.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>[%date{ISO8601}][%-4relative][%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<appender name="OMS_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${OMS_LOG_PATH}/oms.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${OMS_LOG_PATH}/%d{yyyy/MM/dd}/oms.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg %n</pattern>
</encoder>
</appender>
<appender name="CALL_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${CALL_LOG_PATH}/call.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${CALL_LOG_PATH}/%d{yyyy/MM/dd}/call.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="net.herit.ami.commons.logger.DefaultLayout"/>
</encoder>
</appender>
<appender name="ERROR_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${ERROR_LOG_PATH}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${ERROR_LOG_PATH}/%d{yyyy/MM/dd}/error.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="net.herit.ami.commons.logger.DefaultLayout" />
</encoder>
</appender>
<logger name="net.herit.ami.commons.logger.oms.log.OmsLogger" level="${OMS_LEVEL}">
<appender-ref ref="OMS_LOG_FILE" />
</logger>
<logger name="net.herit.ami.commons.logger.call.log.CallLogger" level="${CALL_LEVEL}">
<appender-ref ref="CALL_LOG_FILE" />
</logger>
<logger name="net.herit.ami.commons.logger.error.log.ErrorLogger" level="${ERROR_LEVEL}">
<appender-ref ref="ERROR_LOG_FILE" />
</logger>
<root level="${STD_LEVEL}">
<appender-ref ref="STDOUT" />
<appender-ref ref="STD_LOG_FILE" />
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<property name="LOG_ROOT" value="../logs" />
<property name="LOG_FOLDER" value="dataportal-api" />
<property name="OMS_LOG_PATH" value="${LOG_ROOT}/omsLog/${LOG_FOLDER}" />
<property name="CALL_LOG_PATH" value="${LOG_ROOT}/callLog/${LOG_FOLDER}" />
<property name="ERROR_LOG_PATH" value="${LOG_ROOT}/errorLog/${LOG_FOLDER}" />
<property name="STD_LOG_PATH" value="${LOG_ROOT}/std/${LOG_FOLDER}" />
<property name="OMS_LEVEL" value="info" />
<property name="CALL_LEVEL" value="debug" />
<property name="STD_LEVEL" value="debug" />
<property name="ERROR_LEVEL" value="info" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{ISO8601} %-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<appender name="STD_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${STD_LOG_PATH}/std.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${STD_LOG_PATH}/%d{yyyy/MM/dd}/std.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%date{ISO8601} %-4relative [%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<appender name="OMS_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${OMS_LOG_PATH}/oms.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${OMS_LOG_PATH}/%d{yyyy/MM/dd}/oms.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg %n</pattern>
</encoder>
</appender>
<appender name="CALL_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${CALL_LOG_PATH}/call.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${CALL_LOG_PATH}/%d{yyyy/MM/dd}/call.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="net.herit.ami.commons.logger.DefaultLayout"/>
</encoder>
</appender>
<appender name="ERROR_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${ERROR_LOG_PATH}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${ERROR_LOG_PATH}/%d{yyyy/MM/dd}/error.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="net.herit.ami.commons.logger.DefaultLayout" />
</encoder>
</appender>
<logger name="net.herit.ami.commons.logger.oms.log.OmsLogger" level="${OMS_LEVEL}">
<appender-ref ref="OMS_LOG_FILE" />
</logger>
<logger name="net.herit.ami.commons.logger.call.log.CallLogger" level="${CALL_LEVEL}">
<appender-ref ref="CALL_LOG_FILE" />
</logger>
<logger name="net.herit.ami.commons.logger.error.log.ErrorLogger" level="${ERROR_LEVEL}">
<appender-ref ref="ERROR_LOG_FILE" />
</logger>
<root level="${STD_LEVEL}">
<appender-ref ref="STDOUT" />
<appender-ref ref="STD_LOG_FILE" />
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<!-- http://logback.qos.ch/manual/index.html 참고 -->
<property name="LOG_ROOT" value="/logs" />
<property name="LOG_FOLDER" value="dataportal-api" />
<property name="OMS_LOG_PATH" value="${LOG_ROOT}/omsLog/${LOG_FOLDER}" />
<property name="CALL_LOG_PATH" value="${LOG_ROOT}/callLog/${LOG_FOLDER}" />
<property name="ERROR_LOG_PATH" value="${LOG_ROOT}/errorLog/${LOG_FOLDER}" />
<property name="STD_LOG_PATH" value="${LOG_ROOT}/std/${LOG_FOLDER}" />
<property name="OMS_LEVEL" value="info" />
<property name="CALL_LEVEL" value="info" />
<property name="STD_LEVEL" value="info" />
<property name="ERROR_LEVEL" value="info" />
<appender name="OMS_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${OMS_LOG_PATH}/oms.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${OMS_LOG_PATH}/%d{yyyy/MM/dd}/oms.log.%i</fileNamePattern>
<maxFileSize>5MB</maxFileSize> <!-- 로그파일 1개 최대 크기 -->
<maxHistory>7</maxHistory> <!-- 파일 저장 기간(day) -->
<totalSizeCap>1GB</totalSizeCap> <!-- 파일 저장 기간을 초과한 파일들의 최대 크기. 이 크기를 넘어가면 가장 오래된 파일부터 삭제함 -->
</rollingPolicy>
<encoder>
<pattern>%msg %n</pattern>
</encoder>
</appender>
<appender name="CALL_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${CALL_LOG_PATH}/call.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${CALL_LOG_PATH}/%d{yyyy/MM/dd}/call.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="net.herit.ami.commons.logger.DefaultLayout"/>
</encoder>
</appender>
<appender name="STD_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${STD_LOG_PATH}/std.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${STD_LOG_PATH}/%d{yyyy/MM/dd}/std.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>5</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>[%date{ISO8601}][%-4relative][%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<appender name="ERROR_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${ERROR_LOG_PATH}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${ERROR_LOG_PATH}/%d{yyyy/MM/dd}/error.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="net.herit.ami.commons.logger.DefaultLayout" />
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%date{ISO8601}][%-4relative][%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<logger name="net.herit.ami.commons.logger.oms.log.OmsLogger" level="${OMS_LEVEL}">
<appender-ref ref="OMS_LOG_FILE" />
</logger>
<logger name="net.herit.ami.commons.logger.call.log.CallLogger" level="${CALL_LEVEL}">
<appender-ref ref="CALL_LOG_FILE" />
</logger>
<logger name="net.herit.ami.commons.logger.error.log.ErrorLogger" level="${ERROR_LEVEL}">
<appender-ref ref="ERROR_LOG_FILE" />
</logger>
<root level="${STD_LEVEL}">
<appender-ref ref="STDOUT" />
<appender-ref ref="STD_LOG_FILE" />
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<property name="LOG_ROOT" value="/logs" />
<property name="LOG_FOLDER" value="dataportal-api" />
<property name="OMS_LOG_PATH" value="${LOG_ROOT}/omsLog/${LOG_FOLDER}" />
<property name="CALL_LOG_PATH" value="${LOG_ROOT}/callLog/${LOG_FOLDER}" />
<property name="ERROR_LOG_PATH" value="${LOG_ROOT}/errorLog/${LOG_FOLDER}" />
<property name="STD_LOG_PATH" value="${LOG_ROOT}/std/${LOG_FOLDER}" />
<property name="OMS_LEVEL" value="info" />
<property name="CALL_LEVEL" value="info" />
<property name="STD_LEVEL" value="info" />
<property name="ERROR_LEVEL" value="info" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%date{ISO8601}][%-4relative][%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<appender name="STD_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${STD_LOG_PATH}/std.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${STD_LOG_PATH}/%d{yyyy/MM/dd}/std.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>[%date{ISO8601}][%-4relative][%thread] %-5level %logger{35} - %msg %n</pattern>
</encoder>
</appender>
<appender name="OMS_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${OMS_LOG_PATH}/oms.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${OMS_LOG_PATH}/%d{yyyy/MM/dd}/oms.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%msg %n</pattern>
</encoder>
</appender>
<appender name="CALL_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${CALL_LOG_PATH}/call.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${CALL_LOG_PATH}/%d{yyyy/MM/dd}/call.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>30</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="net.herit.ami.commons.logger.DefaultLayout"/>
</encoder>
</appender>
<appender name="ERROR_LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${ERROR_LOG_PATH}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${ERROR_LOG_PATH}/%d{yyyy/MM/dd}/error.log.%i</fileNamePattern>
<maxFileSize>10MB</maxFileSize>
<maxHistory>7</maxHistory>
<totalSizeCap>500MB</totalSizeCap>
</rollingPolicy>
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="net.herit.ami.commons.logger.DefaultLayout" />
</encoder>
</appender>
<logger name="net.herit.ami.commons.logger.oms.log.OmsLogger" level="${OMS_LEVEL}">
<appender-ref ref="OMS_LOG_FILE" />
</logger>
<logger name="net.herit.ami.commons.logger.call.log.CallLogger" level="${CALL_LEVEL}">
<appender-ref ref="CALL_LOG_FILE" />
</logger>
<logger name="net.herit.ami.commons.logger.error.log.ErrorLogger" level="${ERROR_LEVEL}">
<appender-ref ref="ERROR_LOG_FILE" />
</logger>
<root level="${STD_LEVEL}">
<appender-ref ref="STDOUT" />
<appender-ref ref="STD_LOG_FILE" />
</root>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<webroots />
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
</sourceRoots>
</configuration>
</facet>
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.4.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.27" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.4.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.4" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-undertow:2.4.3" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-core:2.2.4.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.logging:jboss-logging:3.4.1.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.xnio:xnio-api:3.8.0.Final" level="project" />
<orderEntry type="library" name="Maven: org.wildfly.common:wildfly-common:1.5.2.Final" level="project" />
<orderEntry type="library" name="Maven: org.wildfly.client:wildfly-client-config:1.0.1.Final" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.jboss.xnio:xnio-nio:3.8.0.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.threads:jboss-threads:3.1.0.Final" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-servlet:2.2.4.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.spec.javax.annotation:jboss-annotations-api_1.3_spec:2.0.1.Final" level="project" />
<orderEntry type="library" name="Maven: io.undertow:undertow-websockets-jsr:2.2.4.Final" level="project" />
<orderEntry type="library" name="Maven: org.jboss.spec.javax.websocket:jboss-websocket-api_1.1_spec:2.0.0.Final" level="project" />
<orderEntry type="library" name="Maven: jakarta.servlet:jakarta.servlet-api:4.0.4" level="project" />
<orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-quartz:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context-support:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-tx:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.quartz-scheduler:quartz:2.3.2" level="project" />
<orderEntry type="library" name="Maven: com.mchange:mchange-commons-java:0.2.15" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.springframework.boot:spring-boot-devtools:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.projectlombok:lombok:1.18.18" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.4.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.4.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.4.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
<orderEntry type="library" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.18.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.7.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.7.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.7.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.7.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.7.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.7.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.6.28" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.10.20" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.20" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:3.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.6.28" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.3.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.7.0" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-jdbc:2.4.3" level="project" />
<orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.5" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jdbc:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.mybatis.spring.boot:mybatis-spring-boot-autoconfigure:2.1.4" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis:3.5.6" level="project" />
<orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:2.0.6" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.mariadb.jdbc:mariadb-java-client:2.7.2" level="project" />
<orderEntry type="library" name="Maven: org.postgresql:postgresql:42.2.18" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.checkerframework:checker-qual:3.5.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-configuration-processor:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.9.6" level="project" />
<orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.12.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter-openfeign:3.0.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-starter:3.0.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-context:3.0.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-rsa:1.0.9.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcpkix-jdk15on:1.64" level="project" />
<orderEntry type="library" name="Maven: org.bouncycastle:bcprov-jdk15on:1.64" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-openfeign-core:3.0.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-aop:2.4.3" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form-spring:3.8.0" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign.form:feign-form:3.8.0" level="project" />
<orderEntry type="library" name="Maven: commons-fileupload:commons-fileupload:1.4" level="project" />
<orderEntry type="library" name="Maven: commons-io:commons-io:2.2" level="project" />
<orderEntry type="library" name="Maven: org.springframework.cloud:spring-cloud-commons:3.0.0" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-crypto:5.4.5" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-core:10.10.1" level="project" />
<orderEntry type="library" name="Maven: io.github.openfeign:feign-slf4j:10.10.1" level="project" />
<orderEntry type="library" name="Maven: org.ehcache:ehcache:3.9.0" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" name="Maven: org.glassfish.jaxb:jaxb-runtime:2.3.3" level="project" />
<orderEntry type="library" name="Maven: org.glassfish.jaxb:txw2:2.3.3" level="project" />
<orderEntry type="library" name="Maven: com.sun.istack:istack-commons-runtime:3.0.11" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: com.sun.activation:jakarta.activation:1.2.2" level="project" />
<orderEntry type="library" name="Maven: javax.cache:cache-api:1.1.1" level="project" />
<orderEntry type="library" name="Maven: org.springframework.kafka:spring-kafka:2.6.6" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-messaging:5.3.4" level="project" />
<orderEntry type="library" name="Maven: org.springframework.retry:spring-retry:1.3.1" level="project" />
<orderEntry type="library" name="Maven: org.apache.kafka:kafka-clients:2.6.0" level="project" />
<orderEntry type="library" name="Maven: com.github.luben:zstd-jni:1.4.4-7" level="project" />
<orderEntry type="library" name="Maven: org.lz4:lz4-java:1.7.1" level="project" />
<orderEntry type="library" name="Maven: org.xerial.snappy:snappy-java:1.1.7.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-actuator:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator-autoconfigure:2.4.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-actuator:2.4.3" level="project" />
<orderEntry type="library" name="Maven: io.micrometer:micrometer-core:1.6.4" level="project" />
<orderEntry type="library" name="Maven: org.hdrhistogram:HdrHistogram:2.1.12" level="project" />
<orderEntry type="library" scope="RUNTIME" name="Maven: org.latencyutils:LatencyUtils:2.0.3" level="project" />
<orderEntry type="library" name="Maven: io.micrometer:micrometer-registry-prometheus:1.6.4" level="project" />
<orderEntry type="library" name="Maven: io.prometheus:simpleclient_common:0.9.0" level="project" />
<orderEntry type="library" name="Maven: io.prometheus:simpleclient:0.9.0" level="project" />
</component>
</module>
\ No newline at end of file
@startuml
title 한전엔터로부터 전체 회원(에챌서비스 동의회원)의 전기소비량을 조회해서 처리하는 시퀀스
participant KEPCOENTER_SERVICE
participant CACHE
participant MARIA_DB
participant KAFKA
participant KEPCO_ENTER
autonumber
KEPCOENTER_SERVICE -> KEPCO_ENTER: 한전엔터에 전체 회원의 특정일 전기소비량 통계 조회 요청\n 주기:시간당 1회\n 요청항목:통계조회일(yyyymmdd)
KEPCO_ENTER -> KEPCOENTER_SERVICE: 회원별로 통계조회일에 해당하는 소비량을 시간별로 응답\n 회원당 24개의 데이터\n 응답항목:가입자번호, 미터기번호,시간별 전기소비량(kwh)
KEPCOENTER_SERVICE -> CACHE: 휴라규격으로 변환하기 위해 필요한 디바이스정보를\n가입자번호와 미터기번호로 조회
CACHE -> KEPCOENTER_SERVICE: 디바이스 정보가 있으면 바로 응답
CACHE -> MARIA_DB: 디바이스 정보가 없으면, DB를 조회
MARIA_DB -> MARIA_DB: SVC_ADDR.CUST_NO 조회해서\n EGW_DEVICE_INFO 에서 조회
MARIA_DB -> CACHE : 조회된 정보를 캐시에 저장\n저장항목:가입자번호, 미터기번호,\n DEVICE_ID, VDEVICE_ID, INSTANCE...
CACHE -> KEPCOENTER_SERVICE: 디바이스 정보 응답
KEPCOENTER_SERVICE -> KEPCOENTER_SERVICE: 디바이스 정보를 이용하여 휴라규격으로 변환 후 카프카 메시지 생성\n메시지는 회원당 24개의 데이터로 생성\n카프카규격(http://dev.herit.net/projects/2021-newdeal-ami/wiki/SOURCE-AMI-TN)
KEPCOENTER_SERVICE -> KAFKA: 카프카 메시지를 produce
@enduml
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version> <!-- lookup parent from repository -->
</parent>
<groupId>net.herit</groupId>
<artifactId>dataportal-api</artifactId>
<version>0.1.0</version>
<name>dataportal-api</name>
<packaging>jar</packaging>
<description>공공데이터 포털 api들과 연동하는 서비스</description>
<properties>
<java.version>1.8</java.version>
<repository.url>http://10.101.101.192:28081/repository/hura-repo/</repository.url>
<maven.build.timestamp.format>yyyyMMdd_HHmmss</maven.build.timestamp.format>
<install.local.dir>${basedir}/target/${project.name}</install.local.dir>
<project.build.directory>${basedir}/target</project.build.directory>
<lib.dir>lib</lib.dir>
<package.jar.name>${project.artifactId}</package.jar.name>
<!--suppress UnresolvedMavenProperty -->
<build.number>${default.buildnumber}.default</build.number>
<created.group>avengers.herit</created.group>
</properties>
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profile.id>local</profile.id>
<package.install.path>${basedir}/target</package.install.path>
<package.jar.version>${version}</package.jar.version>
</properties>
</profile>
<profile>
<id>dev</id>
<properties>
<profile.id>dev</profile.id>
<package.install.path>${basedir}/target</package.install.path>
<package.jar.version>${version}</package.jar.version>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profile.id>prod</profile.id>
<package.install.path>${basedir}/target</package.install.path>
<package.jar.version>${version}</package.jar.version>
</properties>
</profile>
</profiles>
<build>
<finalName>${package.jar.name}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin><!-- create version.info -->
<groupId>ru.yaal.maven</groupId>
<artifactId>write-text-files-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<charset>UTF-8</charset>
<files>
<file>
<path>${package.install.path}/${project.artifactId}_${package.jar.version}.info</path>
<lines>
<line>===PACKAGE PROPERTIES ===</line>
<line>Name: ${project.name}</line>
<line>ArtifactId: ${project.artifactId}</line>
<line>Version: ${package.jar.version}</line>
<line>PackageFileName: ${package.jar.name}.${packaging}</line>
<line>Description: ${description}</line>
<line>ProfileId: ${profile.id}</line>
<line>BuildNumber: ${build.number}</line>
<!--suppress UnresolvedMavenProperty -->
<line>BuildTime: ${current.time}</line>
<line>BuildBy: ${created.group}</line>
</lines>
</file>
</files>
</configuration>
<executions>
<execution>
<id>write-text-files</id>
<phase>prepare-package</phase>
<goals>
<goal>write-text-files</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>build-helper-maven-plugin</artifactId>
<executions>
<execution>
<id>timestamp-property</id>
<goals>
<goal>timestamp-property</goal>
</goals>
<configuration>
<name>current.time</name>
<pattern>yyyy-MM-dd HH:mm:ss</pattern>
<timeZone>Asia/Seoul</timeZone>
</configuration>
</execution>
<execution>
<id>buildtime-property</id>
<goals>
<goal>timestamp-property</goal>
</goals>
<configuration>
<name>default.buildnumber</name>
<pattern>yyyyMMdd.HHmmss</pattern>
<timeZone>Asia/Seoul</timeZone>
</configuration>
</execution>
</executions>
</plugin>
<!-- For Spring SonarQube -->
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.6</version>
<executions>
<execution>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>prepare-package</phase>
<goals>
<goal>report</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<!-- mariaDB -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<scope>runtime</scope>
</dependency>
<!-- PostgreSql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<scope>compile</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>3.0.0</version>
</dependency>
<!-- ehcache -->
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
<!-- ehcache -->
<!-- kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<!-- 모니터링 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20210307</version>
</dependency>
</dependencies>
</project>
package net.herit.ami;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableFeignClients
@EnableCaching
@SpringBootApplication
public class SpringRookieQuartzApplication {
public static void main(String[] args) {
SpringApplication.run(SpringRookieQuartzApplication.class, args);
}
}
package net.herit.ami.commons.config;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.service.JobService;
import net.herit.ami.features.stat.service.Holiday.HoliDayDataJobService;
import net.herit.ami.features.stat.service.Holiday.HoliDayDataJobService2;
import net.herit.ami.features.stat.service.smp.SmpConsumeDataJobService;
import net.herit.ami.features.stat.service.snd.SndConsumeDataJobService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@RequiredArgsConstructor
public class QuartzStarter {
private final SndConsumeDataJobService sndConsumeDataJobService;
private final SmpConsumeDataJobService smpConsumeDataJobService;
private final HoliDayDataJobService holiDayDataJobService;
private final HoliDayDataJobService2 holiDayDataJobService2;
@Bean
public void startSmp(){
smpConsumeDataJobService.initBatch();
}
@Bean
public void startSnd(){
sndConsumeDataJobService.initBatch();
}
@Bean
public void startHoliDayBatch(){
holiDayDataJobService.initBatch();
}
@Bean
public void startHoliDay2Batch(){
holiDayDataJobService2.initBatch();
}
}
package net.herit.ami.commons.context;
import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.SpringBeanJobFactory;
import org.springframework.stereotype.Component;
@Component
public class ApplicationContextProvider extends SpringBeanJobFactory implements ApplicationContextAware {
private static ApplicationContext ctx = null;
AutowireCapableBeanFactory beanFactory;
public static ApplicationContext getApplicationContext() {
return ctx;
}
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
this.ctx = ctx;
this.beanFactory = ctx.getAutowireCapableBeanFactory();
}
@Override
protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
final Object job = super.createJobInstance(bundle);
beanFactory.autowireBean(job);
return job;
}
}
package net.herit.ami.commons.dto;
public enum ApiClasses {
DEFAULT("DATAPORTTALO00", "기본값"),
SMP_ENERGYDATA("SMP01", "배치 처리"),
SND_ENERGYDATA("SND01", "배치 처리"),
HOLIDAY_ENERGYDATA("HOLIDAY", "HoliDayService 배치 처리"),
;
String code;
String description;
ApiClasses(String code, String description) {
this.code= code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
}
package net.herit.ami.commons.dto;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class DateTimeFormatterObject {
public static DateTimeFormatter yyyyMM = DateTimeFormatter.ofPattern("uuuuMM", Locale.KOREA);
public static DateTimeFormatter yyyyMMdd = DateTimeFormatter.ofPattern("uuuuMMdd", Locale.KOREA);
public static DateTimeFormatter yyyyMMddHHmm = DateTimeFormatter.ofPattern("uuuuMMddHHmm", Locale.KOREA);
public static DateTimeFormatter yyyyMMddHHmmss = DateTimeFormatter.ofPattern("uuuuMMddHHmmss", Locale.KOREA);
public static DateTimeFormatter yyyyMMddHHmmssSSS = DateTimeFormatter.ofPattern("uuuuMMddHHmmssSSS", Locale.KOREA);
public static DateTimeFormatter yyyyMMddHHmmssSSSnnn = DateTimeFormatter.ofPattern("uuuuMMddHHmmssSSSN", Locale.KOREA);
public static DateTimeFormatter ISO8601 = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss", Locale.KOREA);
}
package net.herit.ami.commons.dto;
/**
* 통계데이터 insert 모드
*/
public enum InsertModes {
BULK("BULK", "mybatis bulk-insert"),
PROCEDURE("PROC", "db-procedure");
private String insertMode;
private String description;
private InsertModes(String insertMode, String description) {
this.insertMode = insertMode;
this.description = description;
}
public String getInsertMode() {
return insertMode;
}
public String getDescription() {
return description;
}
}
package net.herit.ami.commons.dto;
public enum ServiceMetaInfo {
SVC_ID("DATAPORTAL", "서비스아이디"),
APP_TYPE("BKND-BATCH", "배치서비스")
;
private String data;
private String description;
ServiceMetaInfo(String data, String description) {
this.data = data;
this.description = description;
}
public String getData() {
return data;
}
public String getDescription() {
return description;
}
}
package net.herit.ami.commons.dto;
public enum SvcClasses {
DEFAULT("DEFAULT", "기본값"),
REQUEST_SMP_CUST("DATA-SMP", "데이터 포털에서 가져오는 SMP 데이터 "),
REQUEST_SND_CUST("DATA-SND", "데이터 포털에서 가져오는 SND 데이터 "),
REQUEST_HOLIDAY_CUST("DATA-HOLIDAY", "데이터 포털에서 가져오는 공휴일 데이터"),
;
String code;
String description;
SvcClasses(String code, String description) {
this.code= code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
}
\ No newline at end of file
package net.herit.ami.commons.exception;
import net.herit.ami.commons.response.BackendServiceStatus;
import org.quartz.JobExecutionException;
import net.herit.ami.commons.util.BeanUtil;
public class CommonException extends RuntimeException {
private static final long serialVersionUID = -6079553227811321648L;
public final String message;
public final ExceptionType type;
public final boolean doExceptionJob;
private final BackendServiceStatus serviceStatus;
public CommonException(ExceptionType type) {
this(type, type.isExceptionJob());
}
/**
* ExceptionType에 isExceptionJob이 있더라도,
* 해당 메서드의 동작을 원하지 않는경우를 위하여 doExceptionJob을
* 추가 매개 변수로 생성
* @param type
* @param doExceptionJob
*/
public CommonException(ExceptionType type, boolean doExceptionJob) {
this.type = type;
this.message = null;
this.doExceptionJob = doExceptionJob;
this.serviceStatus = BackendServiceStatus.INTERNAL_SERVER_ERROR;
}
public CommonException(String message) {
this.message = message;
this.serviceStatus = BackendServiceStatus.INTERNAL_SERVER_ERROR;
this.type = null;
doExceptionJob = false;
}
public CommonException(BackendServiceStatus serviceStatus) {
this.message = serviceStatus.getReason();
this.serviceStatus = serviceStatus;
this.type = null;
doExceptionJob = false;
}
@Override
public String getMessage() {
return this.message;
}
public ExceptionType getType() {
return this.type;
}
public BackendServiceStatus getServiceStatus() {
return this.serviceStatus;
}
public void errorJob() throws JobExecutionException {
Object obj = BeanUtil.getBean("commonExceptionHandler");
CommonExceptionHandler commonExceptionHandler = null;
if (obj instanceof CommonExceptionHandler) {
commonExceptionHandler = (CommonExceptionHandler) obj;
if(serviceStatus != null) {
commonExceptionHandler.errorJob(serviceStatus);
} else if (message != null) {
commonExceptionHandler.errorJob(message);
} else {
commonExceptionHandler.errorJob(type, doExceptionJob);
}
} else {
throw new JobExecutionException();
}
}
}
package net.herit.ami.commons.exception;
import net.herit.ami.commons.response.BackendServiceStatus;
import org.springframework.stereotype.Component;
import net.herit.ami.commons.exception.job.CommonExceptionJobs;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.logger.oms.log.OmsLogger;
import lombok.RequiredArgsConstructor;
@Component
@RequiredArgsConstructor
public class CommonExceptionHandler {
private final OmsLogger omsLogger;
private final CallLogger callLogger;
private final CommonExceptionJobs commonExceptionJobs;
public void errorJob(BackendServiceStatus serviceStatus) {
omsLogger.setStatusAndResult(serviceStatus);
}
public void errorJob(String message) {
callLogger.error(message);
}
public void errorJob(ExceptionType type, boolean doExceptionType) {
omsLogger.setResultCode(type.getCode());
if (doExceptionType && type.isExceptionJob()) {
commonExceptionJobs.commonExceptionJob(type);
} else {
callLogger.error(type.getMessage());
}
}
}
package net.herit.ami.commons.exception;
import org.quartz.JobExecutionException;
import net.herit.ami.commons.exception.job.ExceptionJobs;
import net.herit.ami.commons.util.BeanUtil;
public class ExceptionHandler {
private ExceptionHandler() {
throw new IllegalAccessError();
}
public static void handle(Exception e) throws JobExecutionException {
if (e instanceof CommonException) {
CommonException ce = (CommonException) e;
ce.errorJob();
} else {
Object obj = BeanUtil.getBean("exceptionJobs");
if (obj instanceof ExceptionJobs) {
ExceptionJobs exceptionJobs = (ExceptionJobs) obj;
exceptionJobs.exceptionJob(e);
}
}
}
}
package net.herit.ami.commons.exception;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 에러 로그를 쉽게 찍기위한 ExceptionType
*/
public enum ExceptionType {
SUCCESS(0, "success", false),
DEFAULT_EXCEPTION(1, "default exception", true),
LOG_TRACER_IS_NOT_EXIST(2, "LogTracer is not exist", false),
RESPONSE_CANNOT_BE_NULL(3,"",false),
EXTERNAL_API_CALL_ERROR(4, "" , false),
RESPONE_CAUSE_EXCEPTION(5, "BufferedReader read line excetion" , false),
XML_TO_OBJECT_EXCEPTION(6, "RequstXml To Java Object Pasing excetion", false),
JSON_PROCESS_ONE(7, "One Day Process JSON process Excetion", false)
;
private int code;
private String message;
/**
* 예외 발생시 별도로 수행할 동작이 필요한 경우 true
*/
private boolean isExceptionJob;
private static final Map<Integer, ExceptionType> findExceptionTypeByCode;
static {
findExceptionTypeByCode = new ConcurrentHashMap<>();
for (ExceptionType status : ExceptionType.values()) {
findExceptionTypeByCode.put(status.getCode(), status);
}
}
ExceptionType(int code, String message, boolean isExceptionJob) {
this.code = code;
this.message = message;
this.isExceptionJob = isExceptionJob;
}
public String getMessage() {
return message;
}
public int getCode() {
return code;
}
public boolean isExceptionJob() {
return isExceptionJob;
}
}
\ No newline at end of file
package net.herit.ami.commons.exception.job;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.springframework.stereotype.Component;
import net.herit.ami.commons.exception.ExceptionType;
import net.herit.ami.commons.logger.call.log.CallLogger;
import lombok.RequiredArgsConstructor;
@Component
@RequiredArgsConstructor
public class CommonExceptionJobs {
private final CallLogger callLogger;
public boolean commonExceptionJob(ExceptionType type) {
Method[] methodArr = CommonExceptionJobs.class.getDeclaredMethods();
String typeName = type.name().toLowerCase();
for (Method method : methodArr) {
try {
if (typeName.equals(method.getName())) {
Object obj = method.invoke(this);
if (obj instanceof Boolean) {
return ((Boolean) obj).booleanValue();
}
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
return false;
}
@SuppressWarnings("unused")
private boolean default_exception() {
boolean result = true;
callLogger.error("CommonExceptionJobs!!!");
callLogger.error("exception is DEFAULT_EXCEPTION");
return result;
}
}
package net.herit.ami.commons.exception.job;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.springframework.stereotype.Component;
import net.herit.ami.commons.logger.call.log.CallLogger;
import lombok.RequiredArgsConstructor;
@Component
@RequiredArgsConstructor
public class ExceptionJobs {
private final CallLogger callLogger;
public boolean exceptionJob(Exception e) {
Method[] methodArr = ExceptionJobs.class.getDeclaredMethods();
for (Method method : methodArr) {
if (method.getParameterTypes()[0] == e.getClass()) {
try {
Object obj = method.invoke(this, e);
if (obj instanceof Boolean) {
return ((Boolean)obj).booleanValue();
}
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) {
}
}
}
e.printStackTrace();
return false;
}
@SuppressWarnings("unused")
private boolean nullPointerException(NullPointerException e) {
callLogger.info("null pointer exception Test!");
return true;
}
}
package net.herit.ami.commons.job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import net.herit.ami.commons.exception.ExceptionHandler;
import net.herit.ami.commons.logger.oms.aop.LogTrace;
public abstract class QuartzJobBeans extends QuartzJobBean {
@Override
@LogTrace
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
try {
initJob(context);
} catch(Exception e) {
ExceptionHandler.handle(e);
}
}
protected abstract void initJob(JobExecutionContext context);
}
package net.herit.ami.commons.logger;
import java.util.Map;
import ch.qos.logback.classic.pattern.ThrowableProxyConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.LayoutBase;
import ch.qos.logback.core.util.CachingDateFormatter;
public class DefaultLayout extends LayoutBase<ILoggingEvent> {
CachingDateFormatter cachingDateFormatter = new CachingDateFormatter("yyyy-MM-dd HH:mm:ss.SSS");
ThrowableProxyConverter tpc = new ThrowableProxyConverter();
@Override
public void start() {
tpc.start();
super.start();
}
@Override
public String doLayout(ILoggingEvent event) {
if (!isStarted()) {
return CoreConstants.EMPTY_STRING;
}
StringBuilder sb = new StringBuilder();
Map<String, String> map = event.getMDCPropertyMap();
sb.append(map.get("toLog"));
sb.append(event.getFormattedMessage());
sb.append(CoreConstants.LINE_SEPARATOR);
IThrowableProxy tp = event.getThrowableProxy();
if (tp != null) {
String stackTrace = tpc.convert(event);
sb.append(stackTrace);
}
return sb.toString();
}
}
package net.herit.ami.commons.logger;
public interface LogObject {
}
package net.herit.ami.commons.logger;
public enum LoggerType {
OMS_LOGGER,
CALL_LOGGER,
ERROR_LOGGER,
;
}
package net.herit.ami.commons.logger.aop;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.logger.call.log.CallObject;
import net.herit.ami.commons.logger.context.LoggerContext;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.jboss.logging.MDC;
import org.springframework.stereotype.Component;
@Aspect
@Component
@RequiredArgsConstructor
public class LoggerAop {
@Pointcut("within(net.herit.ami.commons.logger.call.log.CallLogger) || within(net.herit.ami.commons.logger.error.log.ErrorLogger)")
public void DefaultLogger() {};
@Before("DefaultLogger()")
public void beforeLog(JoinPoint joinPoint) {
CallObject callObj = LoggerContext.getCallLogger();
String level = joinPoint.getSignature().getName();
if (callObj == null) return;
callObj.setLogLevel(level);
MDC.put("toLog", callObj.getLogString());
}
}
package net.herit.ami.commons.logger.call.field;
public enum CallLogField {
LOG_TIME,
LOG_LEVEL,
LOG_ID,
}
package net.herit.ami.commons.logger.call.log;
import org.springframework.stereotype.Component;
import net.herit.ami.commons.logger.error.log.ErrorLogger;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@RequiredArgsConstructor
public class CallLogger {
private final ErrorLogger errorLogger;
public void trace(String msg) {
log.trace(msg);
}
public void trace(String format, Object arg) {
log.trace(format, arg);
}
public void trace(String format, Object arg1, Object arg2) {
log.trace(format, arg1, arg2);
}
public void trace(String format, Object... arguments) {
log.trace(format, arguments);
}
public void trace(String msg, Throwable t) {
log.trace(msg, t);
}
public void debug(String msg) {
log.debug(msg);
}
public void debug(String format, Object arg) {
log.debug(format, arg);
}
public void debug(String format, Object arg1, Object arg2) {
log.debug(format, arg1, arg2);
}
public void debug(String format, Object... arguments) {
log.debug(format, arguments);
}
public void debug(String msg, Throwable t) {
log.debug(msg, t);
}
public void info(String msg) {
log.info(msg);
}
public void info(String format, Object arg) {
log.info(format, arg);
}
public void info(String format, Object arg1, Object arg2) {
log.info(format, arg1, arg2);
}
public void info(String format, Object... arguments) {
log.info(format, arguments);
}
public void info(String msg, Throwable t) {
log.info(msg, t);
}
public void warn(String msg) {
log.warn(msg);
}
public void warn(String format, Object arg) {
log.warn(format, arg);
}
public void warn(String format, Object... arguments) {
log.warn(format, arguments);
}
public void warn(String format, Object arg1, Object arg2) {
log.warn(format, arg1, arg2);
}
public void warn(String msg, Throwable t) {
log.warn(msg, t);
}
public void error(String msg) {
log.error(msg);
errorLogger.error(msg);
}
public void error(String format, Object arg) {
log.error(format, arg);
errorLogger.error(format, arg);
}
public void error(String format, Object arg1, Object arg2) {
log.error(format, arg1, arg2);
errorLogger.error(format, arg1, arg2);
}
public void error(String format, Object... arguments) {
log.error(format, arguments);
errorLogger.error(format, arguments);
}
public void error(String msg, Throwable t) {
log.error(msg, t);
errorLogger.error(msg, t);
}
}
\ No newline at end of file
package net.herit.ami.commons.logger.call.log;
import java.util.EnumMap;
import java.util.Map;
import net.herit.ami.commons.logger.LogObject;
import net.herit.ami.commons.logger.call.field.CallLogField;
import net.herit.ami.commons.util.DateTimeUtil;
public class CallObject implements LogObject{
Map<CallLogField, String> callData;
DateTimeUtil dateTimeUtil;
public CallObject() {
callData = new EnumMap<>(CallLogField.class);
dateTimeUtil = new DateTimeUtil();
}
public String getCallData(CallLogField key) {
return callData.get(key);
}
protected void setCallData(CallLogField key, String value) {
callData.put(key, value);
}
public void setLogId(String logId) {
callData.put(CallLogField.LOG_ID, logId);
}
public void setLogLevel(String logLevel) {
callData.put(CallLogField.LOG_LEVEL, logLevel);
}
public String getLogString() {
callData.put(CallLogField.LOG_TIME, dateTimeUtil.getNow_yyyyMMddHHmmssSSS());
StringBuilder sb = new StringBuilder();
for (CallLogField callLogField : CallLogField.values()) {
sb.append("[").append(callData.get(callLogField)).append("]");
}
return sb.toString();
}
}
package net.herit.ami.commons.logger.context;
import java.util.EnumMap;
import java.util.Map;
import net.herit.ami.commons.logger.LogObject;
import net.herit.ami.commons.logger.LoggerType;
import net.herit.ami.commons.logger.call.log.CallObject;
import net.herit.ami.commons.logger.oms.field.OmsLogField;
import net.herit.ami.commons.logger.oms.log.OmsObject;
public class LoggerAttributes {
private Map<LoggerType, LogObject> txAttribMap = new EnumMap<>(LoggerType.class);
public LoggerAttributes() {
OmsObject omsObject = new OmsObject();
CallObject callObject = new CallObject();
callObject.setLogId(omsObject.getOmsData(OmsLogField.TX_ID));
put(LoggerType.OMS_LOGGER, omsObject);
put(LoggerType.CALL_LOGGER, callObject);
}
public Object get(LoggerType key) {
if(txAttribMap.containsKey(key)) {
return txAttribMap.get(key);
}else {
return null;
}
}
public LoggerAttributes put(LoggerType key, LogObject value) {
txAttribMap.put(key,value);
return this;
}
}
package net.herit.ami.commons.logger.context;
import net.herit.ami.commons.logger.LoggerType;
import net.herit.ami.commons.logger.call.log.CallObject;
import net.herit.ami.commons.logger.oms.log.OmsObject;
public class LoggerContext {
private static ThreadLocal<LoggerAttributes> threadLocal;
static {
threadLocal = new InheritableThreadLocal<>();
}
private LoggerContext() {
throw new IllegalAccessError();
}
public static LoggerAttributes getTxAttributes() {
return threadLocal.get();
}
public static OmsObject getTxLogger() {
return (OmsObject) threadLocal.get().get(LoggerType.OMS_LOGGER);
}
public static CallObject getCallLogger() {
return (CallObject) threadLocal.get().get(LoggerType.CALL_LOGGER);
}
public static void remove() {
threadLocal.remove();
}
public static void set() {
threadLocal.set(new LoggerAttributes());
}
}
package net.herit.ami.commons.logger.error.log;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
public class ErrorLogger {
public void error(String msg) {
log.error(msg);
}
public void error(String format, Object arg) {
log.error(format, arg);
}
public void error(String format, String msg) {
log.error(format, msg);
}
public void error(String format, Object arg1, Object arg2) {
log.error(format, arg1, arg2);
}
public void error(String format, Object arg1, String msg) {
log.error(format, arg1, msg);
}
public void error(String format, Object... arguments) {
log.error(format, arguments);
}
public void error(String msg, Throwable t) {
log.error(msg, t);
}
}
package net.herit.ami.commons.logger.oms.aop;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogTrace {
}
package net.herit.ami.commons.logger.oms.aop;
import net.herit.ami.commons.dto.ApiClasses;
import net.herit.ami.commons.dto.SvcClasses;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogTracer {
ApiClasses apiClass() default ApiClasses.DEFAULT;
SvcClasses svcClass() default SvcClasses.DEFAULT;
}
package net.herit.ami.commons.logger.oms.aop;
import java.lang.reflect.Method;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.quartz.JobExecutionContext;
import org.springframework.stereotype.Component;
import net.herit.ami.commons.exception.CommonExceptionHandler;
import net.herit.ami.commons.exception.ExceptionType;
import net.herit.ami.commons.logger.context.LoggerContext;
import net.herit.ami.commons.logger.oms.field.OmsLogField;
import net.herit.ami.commons.logger.oms.log.OmsLogger;
import lombok.RequiredArgsConstructor;
@Aspect
@Component
@RequiredArgsConstructor
public class OmsAop {
private final OmsLogger omsLogger;
private final CommonExceptionHandler commonExceptionHandler;
@Pointcut("@annotation(net.herit.ami.commons.logger.oms.aop.LogTrace)")
public void LogTrace() {};
@Around("LogTrace()")
public Object omsAop(ProceedingJoinPoint pjp) throws Throwable {
LoggerContext.set();
Object obj = null;
Method method = getMethod(pjp);
if (method == null) {
return logTracerIsNull(obj);
}
LogTracer logTracer = method.getAnnotation(LogTracer.class);
if (logTracer == null) {
return logTracerIsNull(obj);
} else {
omsLogger.setApiClass(logTracer.apiClass());
omsLogger.setSvcClass(logTracer.svcClass());
}
obj = pjp.proceed();
if (omsLogger.getOmsData(OmsLogField.RESULT_CODE).equals("")) {
omsLogger.setResultCode(0);
}
return writeOms(obj);
}
private Method getMethod(ProceedingJoinPoint pjp) throws NoSuchMethodException, SecurityException {
Class<?> clz = pjp.getTarget().getClass();
return clz.getDeclaredMethod("initJob", JobExecutionContext.class);
}
private Object logTracerIsNull(Object obj) {
omsLogger.setResultCode(1);
commonExceptionHandler.errorJob(ExceptionType.LOG_TRACER_IS_NOT_EXIST, false);
omsLogger.setResultCode(ExceptionType.LOG_TRACER_IS_NOT_EXIST.getCode());
return writeOms(obj);
}
private Object writeOms(Object obj) {
omsLogger.writeLog();
return obj;
}
}
package net.herit.ami.commons.logger.oms.field;
public enum OmsLogField {
LOG_TIME,
LOG_TYPE,
SVC_ID,
STATUS_CODE,
RESULT_CODE,
REQ_TIME,
RES_TIME,
APP_TYPE,
TX_ID,
API_CLASS,
SVC_CLASS,
R1,
R2,
R3
;
}
package net.herit.ami.commons.logger.oms.log;
import java.time.LocalDateTime;
import net.herit.ami.commons.dto.ApiClasses;
import net.herit.ami.commons.dto.SvcClasses;
import net.herit.ami.commons.response.BackendServiceStatus;
import org.springframework.stereotype.Component;
import net.herit.ami.commons.logger.context.LoggerContext;
import net.herit.ami.commons.logger.oms.field.OmsLogField;
import net.herit.ami.commons.util.DateTimeUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component
@RequiredArgsConstructor
public class OmsLogger {
private final DateTimeUtil dateTimeUtil;
public void writeLog() {
OmsObject oms = LoggerContext.getTxLogger();
log.info(oms.getLogString());
}
public void writeLog(OmsObject oms) {
log.info(oms.getLogString());
}
public OmsObject cloneOmsObject() {
OmsObject oms = LoggerContext.getTxLogger();
return oms.cloneOms();
}
public void setStatusAndResult(BackendServiceStatus backendServiceStatus) {
addOmsData(OmsLogField.STATUS_CODE, String.valueOf(backendServiceStatus.getStatusCode()));
addOmsData(OmsLogField.RESULT_CODE, String.valueOf(backendServiceStatus.getDetailCode()));
}
public void setCloneOmsStatusAndResult(OmsObject cloneOms, BackendServiceStatus backendServiceStatus) {
addCloneOmsData(cloneOms, OmsLogField.STATUS_CODE, String.valueOf(backendServiceStatus.getStatusCode()));
addCloneOmsData(cloneOms, OmsLogField.RESULT_CODE, String.valueOf(backendServiceStatus.getDetailCode()));
}
public void setResultCode(int resultCode) {
addOmsData(OmsLogField.RESULT_CODE, String.valueOf(resultCode));
}
public void setLogTime() {
addOmsData(OmsLogField.LOG_TIME, dateTimeUtil.getNow_yyyyMMddHHmmssSSS());
}
public void setLogTime(LocalDateTime date) {
addOmsData(OmsLogField.LOG_TIME, dateTimeUtil.get_yyyyMMddHHmmssSSS(date));
}
public void setReqTime() {
addOmsData(OmsLogField.REQ_TIME, dateTimeUtil.getNow_yyyyMMddHHmmssSSS());
}
public void setReqTime(LocalDateTime date) {
addOmsData(OmsLogField.REQ_TIME, dateTimeUtil.get_yyyyMMddHHmmssSSS(date));
}
public void setResTime(LocalDateTime date) {
addOmsData(OmsLogField.RES_TIME, dateTimeUtil.get_yyyyMMddHHmmssSSS(date));
}
public void setSvcId(String svcId) {
addOmsData(OmsLogField.SVC_ID, svcId);
}
public void setApiClass(ApiClasses apiClass) {
addOmsData(OmsLogField.API_CLASS, apiClass.getCode());
}
public void setSvcClass(SvcClasses svcClass) {
addOmsData(OmsLogField.SVC_CLASS, svcClass.getCode());
}
public void addOmsData(OmsLogField key, String value) {
OmsObject oms = LoggerContext.getTxLogger();
oms.setOmsData(key, value);
}
public String getOmsData(OmsLogField key) {
OmsObject oms = LoggerContext.getTxLogger();
return oms.getOmsData(key);
}
public void addCloneOmsData(OmsObject cloneOms, OmsLogField key, String value) {
cloneOms.setOmsData(key, value);
}
}
package net.herit.ami.commons.logger.oms.log;
import java.util.EnumMap;
import java.util.Map;
import net.herit.ami.commons.dto.ServiceMetaInfo;
import net.herit.ami.commons.logger.LogObject;
import net.herit.ami.commons.logger.call.field.CallLogField;
import net.herit.ami.commons.logger.context.LoggerContext;
import net.herit.ami.commons.logger.oms.field.OmsLogField;
import net.herit.ami.commons.util.DateTimeUtil;
import net.herit.ami.commons.util.UuidUtil;
import org.apache.commons.lang3.RandomStringUtils;
public class OmsObject implements LogObject {
private static final String DELIM = "|";
Map<OmsLogField, String> omsData;
DateTimeUtil dateTimeUtil;
UuidUtil uuidUtil;
public OmsObject() {
omsData = new EnumMap<>(OmsLogField.class);
dateTimeUtil = new DateTimeUtil();
uuidUtil = new UuidUtil(dateTimeUtil);
initOmsData();
omsData.put(OmsLogField.REQ_TIME, dateTimeUtil.getNow_yyyyMMddHHmmssSSS());
}
private void initOmsData() {
omsData.clear();
for(OmsLogField field : OmsLogField.values()) {
omsData.put(field, "");
}
omsData.put(OmsLogField.TX_ID,
dateTimeUtil.getNow_yyyyMMddHHmm() +"-"+ RandomStringUtils.randomAlphanumeric(5));
omsData.put(OmsLogField.LOG_TYPE, "SVC");
omsData.put(OmsLogField.SVC_ID, ServiceMetaInfo.SVC_ID.getData());
omsData.put(OmsLogField.APP_TYPE, ServiceMetaInfo.APP_TYPE.getData());
}
public String getOmsData(OmsLogField key) {
return omsData.get(key);
}
public void setOmsData(OmsLogField key, String data) {
omsData.put(key, data);
}
protected String getLogString() {
omsData.put(OmsLogField.RES_TIME, dateTimeUtil.getNow_yyyyMMddHHmmssSSS());
omsData.put(OmsLogField.LOG_TIME, dateTimeUtil.getNow_yyyyMMddHHmmssSSS());
StringBuilder sb = new StringBuilder();
for (OmsLogField txLogField : OmsLogField.values()) {
sb.append(omsData.get(txLogField)).append(DELIM);
}
return sb.toString();
}
public OmsObject cloneOms() {
OmsObject omsClone = new OmsObject();
omsClone.setOmsData(OmsLogField.TX_ID, LoggerContext.getCallLogger().getCallData(CallLogField.LOG_ID));
omsClone.setOmsData(OmsLogField.REQ_TIME, dateTimeUtil.getNow_yyyyMMddHHmmssSSS());
omsClone.setOmsData(OmsLogField.API_CLASS, this.omsData.get(OmsLogField.API_CLASS));
omsClone.setOmsData(OmsLogField.SVC_CLASS, this.omsData.get(OmsLogField.SVC_CLASS));
omsClone.setOmsData(OmsLogField.R1, this.omsData.get(OmsLogField.R1));
return omsClone;
}
}
package net.herit.ami.commons.response;
public enum BackendServiceStatus {
SUCCESS(200, 0, ""),
INTERNAL_SERVER_ERROR(500, 0, "internal server error"),
DB_INSERT_ERROR(500, 3, "db insert error"),
SMP_SERVER_RECV_NULL(502, 850, "SMP List Null"),
SND_SERVER_RECV_NULL(502, 850, "SMP List Null"),
;
private int statusCode;
private int detailCode;
String reason;
BackendServiceStatus(int statusCode, int detailCode, String reason) {
this.statusCode = statusCode;
this.detailCode = detailCode;
this.reason = reason;
}
public int getStatusCode() {
return statusCode;
}
public int getDetailCode() {
return detailCode;
}
public String getReason() {
return reason;
}
}
package net.herit.ami.commons.service;
import org.ehcache.event.CacheEvent;
import org.ehcache.event.CacheEventListener;
public class CacheEventLoggerService implements CacheEventListener<Object, Object>{
@Override
public void onEvent(CacheEvent<? extends Object, ? extends Object> arg0) {
System.out.println("cached-old. key:"+ arg0.getKey() +" value:"+ arg0.getOldValue());
System.out.println("cached-new. key:"+ arg0.getKey() +" value:"+ arg0.getNewValue());
}
}
package net.herit.ami.commons.service;
import java.util.Map;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import net.herit.ami.commons.job.QuartzJobBeans;
public interface JobService {
void initBatch();
default Trigger buildJobTrigger(String scheduleExp) {
return TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(scheduleExp)).build();
}
default JobDetail buildJobDetail(Class<? extends QuartzJobBeans> job, String name, String group, Map<String, ?> param) {
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.putAll(param);
return JobBuilder.newJob(job).withIdentity(name, group).usingJobData(jobDataMap)
.build();
}
}
package net.herit.ami.commons.util;
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import net.herit.ami.commons.context.ApplicationContextProvider;
import net.herit.ami.commons.job.QuartzJobBeans;
public class BeanUtil {
private BeanUtil() {
throw new IllegalAccessError();
}
public static Object getBean(String beanId) {
ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
if( applicationContext == null ) {
throw new NullPointerException("Spring의 ApplicationContext init fail");
}
return applicationContext.getBean(beanId);
}
}
package net.herit.ami.commons.util;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.springframework.stereotype.Component;
import net.herit.ami.commons.dto.DateTimeFormatterObject;
@Component
public class DateTimeUtil {
public String generateTimeStamp(String format) {
return generateTimeStamp(LocalDateTime.now(), format);
}
public String generateTimeStamp(LocalDate localDate, String format) {
return localDate.format(DateTimeFormatter.ofPattern(format));
}
public String generateTimeStamp(LocalDateTime localDateTime, String format) {
return localDateTime.format(DateTimeFormatter.ofPattern(format));
}
public long getExecuteSecond(LocalDateTime startTime, LocalDateTime endTime) {
Duration duration = Duration.between(startTime, endTime);
return duration.getSeconds();
}
public String getNow_yyyyMMddHHmmssSSS() {
return get_yyyyMMddHHmmssSSS(LocalDateTime.now());
}
public String getNow_yyyyMMddHHmmss() {
return get_yyyyMMddHHmmss(LocalDateTime.now());
}
public String getNow_yyyyMMddHHmm() {
return get_yyyyMMddHHmmss(LocalDateTime.now());
}
public String getNow_yyyyMMdd() {
return get_yyyyMMdd(LocalDate.now());
}
public String getNow_yyyyMMdd(int moveDay) {
return get_yyyyMMdd(LocalDate.now().plusDays(moveDay));
}
public String getNow_yyyyMM(int moveMonth) {
return get_yyyyMM(LocalDate.now().plusMonths(moveMonth));
}
public String get_yyyyMMddHHmmssSSS(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatterObject.yyyyMMddHHmmssSSS);
}
public String get_yyyyMMddHHmmss(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatterObject.yyyyMMddHHmmss);
}
public String get_yyyyMMddHHmm(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatterObject.yyyyMMddHHmm);
}
public String get_yyyyMMdd(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatterObject.yyyyMMdd);
}
public String get_Iso8601(LocalDateTime localDateTime) {
return localDateTime.format(DateTimeFormatterObject.ISO8601);
}
public String get_yyyyMMdd(LocalDate localDate) {
return localDate.format(DateTimeFormatterObject.yyyyMMdd);
}
public String get_yyyyMM(LocalDate localDate) {
return localDate.format(DateTimeFormatterObject.yyyyMM);
}
public long getNow_epochMillis() {
return Instant.now().toEpochMilli();
}
public long getNow_epochNano() {
return System.nanoTime();
}
public String getNow_yyyyMMddHHmmssSSSnnn() {
return LocalDateTime.now().format(DateTimeFormatterObject.yyyyMMddHHmmssSSSnnn);
}
}
package net.herit.ami.commons.util;
import org.springframework.stereotype.Component;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
@Component
public class JsonUtil {
private ObjectMapper objectMapper;
public static boolean isNull(Object o){
return( o == null);
}
public JsonUtil() {
objectMapper = new ObjectMapper();
}
public String objectToJson(Object object){
String requestBody = null;
try {
requestBody = objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return requestBody;
}
public String stringToPrettyJson(String message) throws JsonProcessingException {
Object jsonObject = objectMapper.readValue(message, Object.class);
return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonObject);
}
public ObjectMapper getObjectMapper() {
return objectMapper;
}
}
package net.herit.ami.commons.util;
import java.nio.ByteBuffer;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.RandomStringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class UuidUtil {
private final DateTimeUtil dateTimeUtil;
/**
*
* @return uuid 문자열 중 앞에 10자리
*/
public String getUuid() {
String uuid = UUID.randomUUID().toString();
uuid = uuid.replaceAll("-", "").substring(0, 9);
return uuid;
}
/**
*
* @return uuid 문자열에서
*/
public String makeShortUUID() {
return makeShortUUID(32);
}
/**
*
* @param radix 변환할 진수
* @return 지정한 radix 로 변환된 문자열
*/
public String makeShortUUID(int radix) {
if(radix > Character.MAX_RADIX) {
radix = Character.MAX_RADIX;
}
UUID uuid = UUID.randomUUID();
long l = ByteBuffer.wrap(uuid.toString().getBytes()).getLong();
return Long.toString(l, radix);
}
/**
*
* @return uuid 문자열
*/
public String makeUUID() {
return UUID.randomUUID().toString();
}
/**
*
* @return uuid 문자열에서 하이픈(-)을 제외한 문자열
*/
public String makeUUIDWithoutHypen() {
return makeUUID().replaceAll("-", "");
}
/**
*
* @return 날짜(yyyyMMddHHmmss)와 숫자/영문포함한 10자리 문자열
*/
public String makeTxId() {
return dateTimeUtil.getNow_yyyyMMddHHmmss() +"."+ makeRandomAlphaNumeric(10);
}
/**
* 알파벳(대소문자)+숫자로 조합된 문자열을 반환합니다.
*
* @param length : 문자열 길이(최소값 5, 최대값 64)
* @return 주어진 length 의 알파벳+숫자 문자열
*/
public String makeRandomAlphaNumeric(int length) {
if(length < 5) {
length = 5;
}
if(length > 64) {
length = 64;
}
return RandomStringUtils.randomAlphanumeric(length);
}
/**
* 알파벳(대소문자)으로 조합된 문자열을 반환합니다.
*
* @param length : 문자열 길이(최소값 5, 최대값 64)
* @return 주어진 length 의 알파벳 문자열
*/
public String makeRandomAlpha(int length) {
if(length < 5) {
length = 5;
}
if(length > 64) {
length = 64;
}
return RandomStringUtils.randomAlphabetic(length);
}
}
package net.herit.ami.features.stat.config;
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public Retryer retryer(){
return new Retryer.Default();
}
}
package net.herit.ami.features.stat.dto.Holiday;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import net.herit.ami.features.stat.dto.response_model.HolidayDataItem;
import java.util.List;
@Data
public class HolidayData {
@JsonProperty("item")
private List<HolidayDataItem> item;
}
package net.herit.ami.features.stat.dto.Holiday;
import lombok.Data;
@Data
public class HolidayDataDAO {
private String locdate;//공휴일 날짜
private String dateName; // 공휴일 이름
private String dateKind; //공휴일 타입(01:국경일, 02:기념일)
public HolidayDataDAO( String locdate, String dateName, String dateKind){
this.locdate = locdate;
this.dateName = dateName;
this.dateKind = dateKind;
}
}
package net.herit.ami.features.stat.dto.SmpXmlDTO;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name = "body")
public class SmpBody {
private SmpItems items;
@Autowired
public void SukubBody(SmpItems items){
this.items =items;
}
}
package net.herit.ami.features.stat.dto.SmpXmlDTO;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
@Data
@Builder
@AllArgsConstructor@RequiredArgsConstructor
public class SmpDTO {
private Long idx;
private String areaCd;//지역코드
private String smp;//smp
private String tradeHour;//거래시간대
private String tradeDay;//거래일자
private String created_at;// 조회시간
}
package net.herit.ami.features.stat.dto.SmpXmlDTO;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
@Data
@XmlRootElement(name = "Items")
public class SmpItems {
private ArrayList<SmpDTO> item;
@Autowired
public void SukubItems(ArrayList<SmpDTO> item){
this.item = item;
}
}
package net.herit.ami.features.stat.dto.SmpXmlDTO;
import lombok.Data;
import net.herit.ami.features.stat.dto.XmlHeader;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name = "response")
@XmlAccessorType(XmlAccessType.NONE)
public class SmpRoot {
@XmlElement(name = "header")
private XmlHeader header;
@XmlElement(name = "body")
private SmpBody body;
}
package net.herit.ami.features.stat.dto.SndXmlDTO;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name = "body")
public class SndBody {
private SndItems items;
@Autowired
public void SukubBody(SndItems items){
this.items =items;
}
}
package net.herit.ami.features.stat.dto.SndXmlDTO;
import lombok.Data;
@Data
public class SndDTO {
private Long idx;
private String created_at;// 조회시간
private String baseDatetime;//기쥰일시
private String suppAbility;//공급능력
private String currPwrTot;//현재수요
private String forecastLoad;//최대예측수요
private String suppReservePwr;//공급예비력
private String suppReserveRate;//공급예비율
private String operReservePwr;//운영예비력
private String operReserveRate;//운영예비율
}
package net.herit.ami.features.stat.dto.SndXmlDTO;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name = "Items")
public class SndItems {
private SndDTO item;
@Autowired
public void SndItems(SndDTO item){
this.item = item;
}
}
package net.herit.ami.features.stat.dto.SndXmlDTO;
import lombok.Data;
import net.herit.ami.features.stat.dto.XmlHeader;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name = "response")
@XmlAccessorType(XmlAccessType.FIELD)
public class SndRoot {
@XmlElement(name = "header")
private XmlHeader header;
@XmlElement(name = "body")
private SndBody body;
}
package net.herit.ami.features.stat.dto;
import lombok.Data;
import javax.xml.bind.annotation.XmlRootElement;
@Data
@XmlRootElement(name = "header")
public class XmlHeader {
private String resultCode;
private String resultMsg;
private String pageNo;
private String numOfRows;
private String totalCount;
private String pageSize;
private String startPage;
}
package net.herit.ami.features.stat.dto.request_model;
public interface FeignRequest {
}
package net.herit.ami.features.stat.dto.response_model;
import lombok.Data;
@Data
public class ExternalResponse implements FeignResponse {
private Integer status;
private HolidaRootResponse body;
public ExternalResponse(Integer status, HolidaRootResponse body) {
this.status = status;
this.body = body;
}
@Override
public HolidaRootResponse getBody() {
return this.body;
}
@Override
public Integer getStatus() {
return this.status;
}
}
package net.herit.ami.features.stat.dto.response_model;
public interface FeignResponse {
HolidaRootResponse getBody();
Integer getStatus();
}
package net.herit.ami.features.stat.dto.response_model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import net.herit.ami.features.stat.dto.Holiday.HolidayData;
@Data
public class FeignResponseBody {
@JsonProperty("items")
private HolidayData items;
@JsonProperty("numOfRows")
private String numOfRows;//페이지당 항목수
@JsonProperty("pageNo")
private String pageNo;//페이지
@JsonProperty("totalCount")
private String totalCount;//모든 항목수
}
package net.herit.ami.features.stat.dto.response_model;
import lombok.Data;
@Data
public class FeignResponseHeader {
private String resultCode;
private String resultMsg;
}
package net.herit.ami.features.stat.dto.response_model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class HolidaRootResponse {
@JsonProperty("response")
private HolidayResponse response;
}
package net.herit.ami.features.stat.dto.response_model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class HolidayDataItem {
@JsonProperty("dateKind")
private String dateKind;
@JsonProperty("dateName")
private String dateName;
@JsonProperty("isHoliday")
private String isHoliday;
@JsonProperty("locdate")
private String locdate;
@JsonProperty("seq")
private String seq;
}
package net.herit.ami.features.stat.dto.response_model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public abstract class HolidayOnlyData {
@JsonProperty("response")
private Response response;
public static class Response {
@JsonProperty("body")
private Body body;
@JsonProperty("header")
private Header header;
}
@Data
public static class Body {
@JsonProperty("totalCount")
private int totalcount;
@JsonProperty("pageNo")
private int pageno;
@JsonProperty("numOfRows")
private int numofrows;
@JsonProperty("items")
private Items items;
}
@Data
public static class Items {
@JsonProperty("item")
private Item item;
}
@Data
public static class Item {
@JsonProperty("seq")
private int seq;
@JsonProperty("locdate")
private int locdate;
@JsonProperty("isHoliday")
private String isholiday;
@JsonProperty("dateName")
private String datename;
@JsonProperty("dateKind")
private String datekind;
}
@Data
public static class Header {
@JsonProperty("resultMsg")
private String resultmsg;
@JsonProperty("resultCode")
private String resultcode;
}
}
package net.herit.ami.features.stat.dto.response_model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class HolidayResponse {
@JsonProperty("header")
private FeignResponseHeader resHeader;
@JsonProperty("body")
private FeignResponseBody resBody;
}
package net.herit.ami.features.stat.dto.response_model;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class SoloHolidayDataItem {
@JsonProperty("totalCount")
private int totalcount;
@JsonProperty("pageNo")
private int pageno;
@JsonProperty("numOfRows")
private int numofrows;
@JsonProperty("items")
private Items items;
@Data
public static class Items {
@JsonProperty("item")
private HolidayDataItem item;
}
}
package net.herit.ami.features.stat.job;
import feign.Response;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.dto.ApiClasses;
import net.herit.ami.commons.dto.SvcClasses;
import net.herit.ami.commons.job.QuartzJobBeans;
import net.herit.ami.commons.logger.call.field.CallLogField;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.logger.call.log.CallObject;
import net.herit.ami.commons.logger.context.LoggerContext;
import net.herit.ami.commons.logger.oms.aop.LogTracer;
import net.herit.ami.commons.logger.oms.field.OmsLogField;
import net.herit.ami.commons.logger.oms.log.OmsLogger;
import net.herit.ami.commons.response.BackendServiceStatus;
import net.herit.ami.commons.util.DateTimeUtil;
import net.herit.ami.features.stat.dto.Holiday.HolidayDataDAO;
import net.herit.ami.features.stat.dto.response_model.*;
import net.herit.ami.features.stat.repository.dataportal.HolidayRepository;
import net.herit.ami.features.stat.service.ConnectionService;
import net.herit.ami.features.stat.service.Holiday.HolidayFeignClient;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Value;
/**
*
*/
@RequiredArgsConstructor
public class HoliDayDataJob extends QuartzJobBeans{
private final CallLogger call;
private final OmsLogger oms;
private final DateTimeUtil dateTimeUtil;
private final String JOB_NAME = this.getClass().getSimpleName();
private final HolidayRepository holidayRepository;
private final HolidayFeignClient holidayFeignClient;
private final ConnectionService connectionService;
@Value("${dataportal.serviceKey}")
private String serviceKey;
/**
*
* @param context
*/
@Override
@LogTracer(apiClass = ApiClasses.HOLIDAY_ENERGYDATA, svcClass = SvcClasses.REQUEST_HOLIDAY_CUST)
protected void initJob(JobExecutionContext context) {
call.info("{}: {}", JOB_NAME, dateTimeUtil.getNow_yyyyMMddHHmmss());
call.debug("{} init log "+ JOB_NAME, dateTimeUtil.getNow_yyyyMMddHHmmss());
CallObject cObj = LoggerContext.getCallLogger();
String callId = cObj.getCallData(CallLogField.LOG_ID);
String date = dateTimeUtil.getNow_yyyyMM(+1);
String year = date.substring(0,4);
String month = date.substring(4,6);
connectionService.connect(holidayFeignClient.requestHolidayDataByAll(year, month, serviceKey,"json"));
call.info("callId:{}", callId);
oms.setStatusAndResult(BackendServiceStatus.SUCCESS);
}
}
\ No newline at end of file
package net.herit.ami.features.stat.job;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.dto.ApiClasses;
import net.herit.ami.commons.dto.SvcClasses;
import net.herit.ami.commons.job.QuartzJobBeans;
import net.herit.ami.commons.logger.call.field.CallLogField;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.logger.call.log.CallObject;
import net.herit.ami.commons.logger.context.LoggerContext;
import net.herit.ami.commons.logger.oms.aop.LogTracer;
import net.herit.ami.commons.logger.oms.field.OmsLogField;
import net.herit.ami.commons.logger.oms.log.OmsLogger;
import net.herit.ami.commons.response.BackendServiceStatus;
import net.herit.ami.commons.util.DateTimeUtil;
import net.herit.ami.features.stat.service.smp.SmpService;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Value;
/**
*
*/
@RequiredArgsConstructor
public class SmpEnterConsumeDataJob extends QuartzJobBeans{
private final CallLogger call;
private final OmsLogger oms;
private final DateTimeUtil dateTimeUtil;
private final String JOB_NAME = this.getClass().getSimpleName();
private final SmpService smpService;
int[] areaCd = {1,9};
@Value("${dataportal.serviceKey}")
private String serviceKey;
/**
*
* @param context
*/
@Override
@LogTracer(apiClass = ApiClasses.SMP_ENERGYDATA, svcClass = SvcClasses.REQUEST_SMP_CUST)
protected void initJob(JobExecutionContext context) {
call.info("{}: {}", JOB_NAME, dateTimeUtil.getNow_yyyyMMddHHmmss());
CallObject cObj = LoggerContext.getCallLogger();
String callId = cObj.getCallData(CallLogField.LOG_ID);
call.info("callId:{}", callId);
int resultCount = 0;
for (int i = 0; i < areaCd.length; ++i) resultCount += smpService.toDoGetSmpDataAndInsert(areaCd[i], serviceKey);
oms.addOmsData(OmsLogField.R1, String.valueOf(resultCount));
oms.setStatusAndResult(BackendServiceStatus.SUCCESS);
};
}
\ No newline at end of file
package net.herit.ami.features.stat.job;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.dto.ApiClasses;
import net.herit.ami.commons.dto.SvcClasses;
import net.herit.ami.commons.job.QuartzJobBeans;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.logger.oms.aop.LogTracer;
import net.herit.ami.commons.logger.oms.field.OmsLogField;
import net.herit.ami.commons.logger.oms.log.OmsLogger;
import net.herit.ami.commons.response.BackendServiceStatus;
import net.herit.ami.commons.util.DateTimeUtil;
import net.herit.ami.features.stat.repository.dataportal.SndRepository;
import net.herit.ami.features.stat.service.ResponseService;
import net.herit.ami.features.stat.service.snd.SndService;
import org.quartz.JobExecutionContext;
import org.springframework.beans.factory.annotation.Value;
/**
*
*/
@RequiredArgsConstructor
public class SndEnterConsumeDataJob extends QuartzJobBeans{
private final CallLogger call;
private final OmsLogger oms;
private final DateTimeUtil dateTimeUtil;
private final String JOB_NAME = this.getClass().getSimpleName();
private final SndService sndService;
@Value("${dataportal.serviceKey}")
private String serviceKey;
/**
*
* @param context
*/
@Override
@LogTracer(apiClass = ApiClasses.SND_ENERGYDATA, svcClass = SvcClasses.REQUEST_SND_CUST)
protected void initJob(JobExecutionContext context) {
call.info("{}: {}", JOB_NAME, dateTimeUtil.getNow_yyyyMMddHHmmss());
int result= 0;
try {
result = sndService.makeSndDTO(serviceKey);
}catch (Exception e){
call.error(e.getMessage(),e.getCause());
oms.addOmsData(OmsLogField.API_CLASS, String.valueOf(result));
// oms.setStatusAndResult(BackendServiceStatus.DB_INSERT_ERROR);
}
endOms(result);
}
public void endOms(int result){
if(result < 1){
oms.addOmsData(OmsLogField.API_CLASS, String.valueOf(result));
oms.setStatusAndResult(BackendServiceStatus.DB_INSERT_ERROR);
}else {
oms.addOmsData(OmsLogField.R1, String.valueOf(result));
oms.setStatusAndResult(BackendServiceStatus.SUCCESS);
}
}
}
\ No newline at end of file
package net.herit.ami.features.stat.property;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Getter
@Setter
@Component
@ConfigurationProperties(prefix="quartz-holiday.consumedata-property")
public class HolidayDataProperty {
private boolean enable;
private String schedule;
}
package net.herit.ami.features.stat.property;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Getter
@Setter
@Component
@ConfigurationProperties(prefix="quartz-holiday-second.consumedata-property")
public class HolidayDataPropertySecond {
private boolean enable;
private String schedule;
}
package net.herit.ami.features.stat.property;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Getter
@Setter
@Component
@ConfigurationProperties(prefix="quartz-smp.consumedata-property")
public class SmpEnterConsumeDataProperty {
private boolean enable;
private String schedule;
}
package net.herit.ami.features.stat.property;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Getter
@Setter
@Component
@ConfigurationProperties(prefix="quartz-snd.consumedata-property")
public class SndEnterConsumeDataProperty {
private boolean enable;
private String schedule;
}
package net.herit.ami.features.stat.repository.dataportal;
import net.herit.ami.features.stat.dto.Holiday.HolidayDataDAO;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
//@MysqlDataSourceMapper
@Mapper
@Repository
public interface HolidayRepository {
int insertHoliDayData(HolidayDataDAO holidayDataDAO);
}
package net.herit.ami.features.stat.repository.dataportal;
import net.herit.ami.features.stat.dto.SmpXmlDTO.SmpDTO;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
//@MysqlDataSourceMapper
@Mapper
@Repository
public interface SmpRepository {
int insertSmp(SmpDTO smp);
}
package net.herit.ami.features.stat.repository.dataportal;
import net.herit.ami.features.stat.dto.SndXmlDTO.SndDTO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SndRepository {
int insertSnd(SndDTO snd);
}
package net.herit.ami.features.stat.service;
import feign.Response;
import net.herit.ami.features.stat.dto.response_model.FeignResponse;
public interface ConnectionService {
void connect(Response response);
}
package net.herit.ami.features.stat.service;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import feign.Response;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.exception.CommonException;
import net.herit.ami.commons.exception.ExceptionType;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.logger.oms.field.OmsLogField;
import net.herit.ami.commons.logger.oms.log.OmsLogger;
import net.herit.ami.commons.util.JsonUtil;
import net.herit.ami.features.stat.dto.Holiday.HolidayDataDAO;
import net.herit.ami.features.stat.dto.response_model.HolidaRootResponse;
import net.herit.ami.features.stat.dto.response_model.HolidayDataItem;
import net.herit.ami.features.stat.dto.response_model.SoloHolidayDataItem;
import net.herit.ami.features.stat.repository.dataportal.HolidayRepository;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
@RequiredArgsConstructor
public class DefaultConnectService implements ConnectionService{
private final CallLogger call;
private final HolidayRepository holidayRepository;
private final OmsLogger oms;
private final ObjectMapper mapper = new ObjectMapper();
@Override
public void connect(Response connect)throws CommonException {
call.debug("\n---- Start to Connection And Convert----");
isnull(connect);
apiConnectLog(connect);
commonProcess(connect);
}
public void commonProcess(Response connect) throws CommonException{
try {
Map<String, String> map = segregate(builderResponseBody(connect));
int totalCount = Integer.parseInt(map.get("item"));
if(totalCount > 1){
HolidaRootResponse resBody = mapper.readValue(map.get("anotherDaybody"), HolidaRootResponse.class);
anotherDayProcess(resBody.getResponse().getResBody().getItems().getItem(), resBody.getResponse().getResBody().getTotalCount());
}else if(totalCount == 1){
onlyDayProcess(map.get("oneDayBody"));
}else {
oms.addOmsData(OmsLogField.R1, "0");
oms.addOmsData(OmsLogField.R2, "0");
}
}catch (Exception ex){
call.error("Error Occurred with External Server request. cause: ", ex);
throw new CommonException(ExceptionType.EXTERNAL_API_CALL_ERROR);
}
}
private void apiConnectLog(Response connect) {
final String printRequest = connect.request().toString();
final String printResponse = connect.toBuilder()
.headers(connect.headers())
.body(connect.body())
.build()
.toString();
call.info("\nConnection:\n\n{}", getConnectionLog(printRequest, printResponse));
}
private String builderResponseBody(Response connect) {
try {
BufferedReader reader = new BufferedReader(connect.body().asReader(Charset.defaultCharset()));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null){
builder.append(line);
}
return builder.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/*
* oneDayBody : 하나일때 사용
* anotherDaybody : 공유일이 많을때 사용하기 위함
* itmeMap : 공유일이 없는 경우를 확인하기 위함
* */
private Map<String, String> segregate(String oneDayBody) {
Map<String, String> buildMap = new HashMap<>();
try {
Map<String,Map<String,Object>> anotherDaybody = mapper.readValue(oneDayBody, new TypeReference<Map<String,Map<String,Object>>>() {});
Map<String, Object> itmeMap = mapper.readValue(mapper.writeValueAsString(anotherDaybody.get("response").get("body")), new TypeReference<Map<String,Object>>(){});
buildMap.put("oneDayBody", oneDayBody);
buildMap.put("anotherDaybody", anotherDaybody.toString());
buildMap.put("item", itmeMap.get("totalCount").toString());
return buildMap;
} catch (IOException e) {
throw new CommonException(e.getMessage());
}
}
private void isnull(Response connect) {
if(JsonUtil.isNull(connect)){
call.info("Failed Connect to External Server.");
throw new CommonException(ExceptionType.RESPONSE_CANNOT_BE_NULL);
}
if(connect.body() == null){
call.info("response of Conntion. {} , {}"+ connect, connect.body());
throw new CommonException(ExceptionType.RESPONSE_CANNOT_BE_NULL);
}
}
private void anotherDayProcess(List<HolidayDataItem> resBody, String count) {
int successCount = 0;
for (HolidayDataItem a : resBody){
int success = 0;
HolidayDataDAO holidayanotherDataDAO = builAnotherHoliDayData(a);
success += holidayRepository.insertHoliDayData(holidayanotherDataDAO);
if(success >= 1){
successCount += success;
}else {
call.debug("INSERT ERROR Parameters : " + holidayanotherDataDAO);
}
}
oms.addOmsData(OmsLogField.R2, String.valueOf(successCount));
oms.addOmsData(OmsLogField.R1, String.valueOf(count));
}
private HolidayDataDAO builAnotherHoliDayData(HolidayDataItem a) {
return new HolidayDataDAO(
makeLocaldate(a.getLocdate()),
a.getDateName(),
a.getDateKind()
);
}
private void onlyDayProcess(String objectBody) {
int success = 0;
try {
HolidayDataDAO holidayDataDAO = buildHolidayDataDAO(mapper.readValue(objectBody, SoloHolidayDataItem.class));
success = holidayRepository.insertHoliDayData(holidayDataDAO);
} catch (JsonProcessingException e) {
throw new CommonException(ExceptionType.JSON_PROCESS_ONE);
}
finally {
oms.addOmsData(OmsLogField.R1, "1");
oms.addOmsData(OmsLogField.R2, String.valueOf(success));
}
}
private HolidayDataDAO buildHolidayDataDAO(SoloHolidayDataItem readValue) {
return new HolidayDataDAO(
makeLocaldate(readValue.getItems().getItem().getLocdate()),
readValue.getItems().getItem().getDateName(),
readValue.getItems().getItem().getDateKind()
);
}
private String makeLocaldate(String responseDate) {
return responseDate.substring(0,4)+"-"+responseDate.substring(4, 6)+"-"+responseDate.substring(6, 8);
}
public String getConnectionLog (final String request,final String response) {
StringBuilder builder = new StringBuilder();
String NEW = "\n";
builder
.append("===== External API Service Connection log =====").append(NEW)
.append(NEW)
.append("Request:").append(NEW)
.append(NEW)
.append(request).append(NEW)
.append(NEW)
.append("===============================================").append(NEW)
.append(NEW)
.append("Response:").append(NEW)
.append(NEW)
.append(response).append(NEW)
.append(NEW)
.append("===============================================").append(NEW)
.append(NEW);
return builder.toString();
}
}
package net.herit.ami.features.stat.service.Holiday;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.service.JobService;
import net.herit.ami.features.stat.job.HoliDayDataJob;
import net.herit.ami.features.stat.job.SndEnterConsumeDataJob;
import net.herit.ami.features.stat.property.HolidayDataProperty;
import net.herit.ami.features.stat.property.HolidayDataPropertySecond;
import net.herit.ami.features.stat.property.SndEnterConsumeDataProperty;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
@Service
@RequiredArgsConstructor
public class HoliDayDataJobService implements JobService {
private static final String NAME ="HoliDayDataJobService";
private static final String GROUP = "STAT";
private final HolidayDataProperty property;
private final Scheduler scheduler;
private final CallLogger call;
@Override
public void initBatch() {
JobDetail jobDetail = buildJobDetail(HoliDayDataJob.class, NAME, GROUP, new HashMap<>());
try {
if(property.isEnable())
scheduler.scheduleJob(jobDetail, buildJobTrigger(property.getSchedule()));
} catch (SchedulerException e) {
call.error("FileReaderService :: scheduler error :: {}", LocalDateTime.now());
}
}
}
package net.herit.ami.features.stat.service.Holiday;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.service.JobService;
import net.herit.ami.features.stat.job.HoliDayDataJob;
import net.herit.ami.features.stat.property.HolidayDataProperty;
import net.herit.ami.features.stat.property.HolidayDataPropertySecond;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
@Service
@RequiredArgsConstructor
public class HoliDayDataJobService2 implements JobService {
private static final String NAME ="HoliDay2DataJobService";
private static final String GROUP = "STAT";
private final HolidayDataPropertySecond propertySecond;
private final Scheduler scheduler;
private final CallLogger call;
@Override
public void initBatch() {
JobDetail jobDetail = buildJobDetail(HoliDayDataJob.class, NAME, GROUP, new HashMap<>());
try {
if(propertySecond.isEnable())
scheduler.scheduleJob(jobDetail, buildJobTrigger(propertySecond.getSchedule()));
} catch (SchedulerException e) {
call.error("FileReaderService :: scheduler error :: {}", LocalDateTime.now());
}
}
}
package net.herit.ami.features.stat.service.Holiday;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.FeignClientProperties;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Service
@FeignClient(value = "holidaty-data", url = "${open.host}", configuration = FeignClientProperties.FeignClientConfiguration.class)
public interface HolidayFeignClient {
/**
* 월별로 구분(공휴일), 요일, 공휴일 여부 등의 정보를 제공한다.
*
* @param solYear : 연 ex) 2019
* @param solMonth : 월 ex) 03
* @param serviceKey : api 인증키
* @param dataType : json 타입 (디폴트 XML)
* @return
*/
@GetMapping(value = "${open.url-request-holiday-data}")
Response requestHolidayDataByAll(
@RequestParam(name = "solYear") String solYear,
@RequestParam(name = "solMonth") String solMonth,
@RequestParam("serviceKey") String serviceKey,
@RequestParam(name = "_type") String dataType
);
}
package net.herit.ami.features.stat.service;
import feign.Response;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.exception.CommonException;
import net.herit.ami.commons.exception.ExceptionType;
import net.herit.ami.commons.logger.call.log.CallLogger;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
@Service
@RequiredArgsConstructor
public class ResponseService {
private final CallLogger call;
private final String JOB_NAME = this.getClass().getSimpleName();
private final DefaultConnectService defaultconnectService;
String line = null;
public String responseXmlToString(Response response) {
StringBuilder builder = new StringBuilder();
logStamp(response);
try {
BufferedReader reader = new BufferedReader(response.body().asReader(Charset.defaultCharset()));
while ((line = reader.readLine()) != null){
builder.append(line);
}
call.info("conectApi result {} : {}","explorerSnd", builder.toString());
return builder.toString();
} catch (IOException ex){
call.error("Exceprion point {} , massge ",JOB_NAME, ex.getMessage());
throw new CommonException(ExceptionType.RESPONE_CAUSE_EXCEPTION);
}
}
public void logStamp(Response response){
final String printRequest = response.request().toString();
final String printResponse = response.toBuilder()
.headers(response.headers())
.body(response.body())
.build()
.toString();
call.info("\nConnection:\n\n{}", defaultconnectService.getConnectionLog(printRequest, printResponse));
}
}
\ No newline at end of file
package net.herit.ami.features.stat.service.smp;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.service.JobService;
import net.herit.ami.features.stat.job.SmpEnterConsumeDataJob;
import net.herit.ami.features.stat.property.SmpEnterConsumeDataProperty;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
@Service
@RequiredArgsConstructor
public class SmpConsumeDataJobService implements JobService {
private static final String NAME ="SmpConsumeDataJobService";
private static final String GROUP = "STAT";
private final SmpEnterConsumeDataProperty property;
private final Scheduler scheduler;
private final CallLogger call;
@Override
public void initBatch() {
JobDetail jobDetail = buildJobDetail(SmpEnterConsumeDataJob.class, NAME, GROUP, new HashMap<>());
try {
if(property.isEnable())
scheduler.scheduleJob(jobDetail, buildJobTrigger(property.getSchedule()));
} catch (SchedulerException e) {
call.error("FileReaderService :: scheduler error :: {}", LocalDateTime.now());
}
}
}
package net.herit.ami.features.stat.service.smp;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Service
@FeignClient(value = "smp-enter", url = "${dataportal.host}")
public interface SmpEnterFeignClient {
/**
* 서비스에 동의한 회원 전체의 date 전기소비량을 조회합니다.
*
* @param area : 지역구분 (육지 : 1, 제주도 : 9)
* @param serviceKey : api 인증키
* @return
*/
@GetMapping(value = "${dataportal.smp.uri-request-consume-data}")
Response requestConsumeDataByAll(
@RequestParam(name = "areaCd") int area,
@RequestParam("serviceKey") String serviceKey
);
}
package net.herit.ami.features.stat.service.smp;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.exception.CommonException;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.logger.oms.log.OmsLogger;
import net.herit.ami.commons.response.BackendServiceStatus;
import net.herit.ami.features.stat.dto.SmpXmlDTO.SmpDTO;
import net.herit.ami.features.stat.dto.SmpXmlDTO.SmpRoot;
import net.herit.ami.features.stat.repository.dataportal.SmpRepository;
import net.herit.ami.features.stat.service.ResponseService;
import org.springframework.stereotype.Service;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.util.ArrayList;
@Service
@RequiredArgsConstructor
public class SmpService {
private final CallLogger call;
private final OmsLogger oms;
private final SmpRepository smpRepository;
private final ResponseService responseService;
private final SmpEnterFeignClient smpEnterFeignClient;
public int toDoGetSmpDataAndInsert(int i, String serviceKey) {
;
ArrayList<SmpDTO> smpList = getRresponseItme(i, serviceKey);
return sendSmp(smpList, i);
}
//관심사 분리 실패 ....
private ArrayList<SmpDTO> getRresponseItme(int area, String serviceKeys) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(SmpRoot.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
SmpRoot smpResponse = (SmpRoot) unmarshaller.unmarshal( new StringReader(responseService.responseXmlToString(smpEnterFeignClient.requestConsumeDataByAll(area, serviceKeys))));
return smpResponse.getBody().getItems().getItem();
} catch (JAXBException e) {
call.error("ResponseService class in method explorerSnd JAXBException : {}", e.getMessage());
throw new CommonException(e.getMessage());
}
}
private int sendSmp(ArrayList<SmpDTO> smpList, int areaCd) {
int insertCount = 0;
for (int i = 0; i < smpList.size(); ++i){
insertCount += insertCall(buildSmpDto( smpList.get(i)));
}
call.debug("smpList insert SUCCESS point : {}, areaCd : {}", insertCount, areaCd);
return insertCount;
}
private SmpDTO buildSmpDto(SmpDTO smpDTO) {
return new SmpDTO().builder()
.idx(smpDTO.getIdx())
.areaCd(smpDTO.getAreaCd())
.smp(smpDTO.getSmp())
.tradeHour(String.format("%02d", Integer.parseInt(smpDTO.getTradeHour())))
.tradeDay(smpDTO.getTradeDay())
.created_at(smpDTO.getCreated_at())
.build();
}
private int insertCall(SmpDTO params){
int success = 0;
try {
success = smpRepository.insertSmp(params);
}catch (Exception e){
oms.setStatusAndResult(BackendServiceStatus.DB_INSERT_ERROR);
}
return success;
}
}
package net.herit.ami.features.stat.service.snd;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.commons.service.JobService;
import net.herit.ami.features.stat.job.SndEnterConsumeDataJob;
import net.herit.ami.features.stat.property.SndEnterConsumeDataProperty;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.HashMap;
@Service
@RequiredArgsConstructor
public class SndConsumeDataJobService implements JobService {
private static final String NAME ="SndConsumeDataJobService";
private static final String GROUP = "STAT";
private final SndEnterConsumeDataProperty property;
private final Scheduler scheduler;
private final CallLogger call;
@Override
public void initBatch() {
JobDetail jobDetail = buildJobDetail(SndEnterConsumeDataJob.class, NAME, GROUP, new HashMap<>());
try {
if(property.isEnable())
scheduler.scheduleJob(jobDetail, buildJobTrigger(property.getSchedule()));
} catch (SchedulerException e) {
call.error("FileReaderService :: scheduler error :: {}", LocalDateTime.now());
}
}
}
package net.herit.ami.features.stat.service.snd;
import feign.Response;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Service
@FeignClient(value = "snd-enter", url = "${dataportal.host}")
public interface SndEnterFeignClient {
/**
* 서비스에 동의한 회원 전체의 date 전기소비량을 조회합니다.
*
* @param serviceKey : api 인증키
* @return
*/
@GetMapping(value = "${dataportal.snd.uri-request-consume-data}")
Response requestConsumeData(
@RequestParam("serviceKey") String serviceKey
);
}
package net.herit.ami.features.stat.service.snd;
import lombok.RequiredArgsConstructor;
import net.herit.ami.commons.exception.CommonException;
import net.herit.ami.commons.exception.ExceptionType;
import net.herit.ami.commons.logger.call.log.CallLogger;
import net.herit.ami.features.stat.dto.SndXmlDTO.SndDTO;
import net.herit.ami.features.stat.dto.SndXmlDTO.SndRoot;
import net.herit.ami.features.stat.repository.dataportal.SndRepository;
import net.herit.ami.features.stat.service.ResponseService;
import org.springframework.stereotype.Service;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
@Service
@RequiredArgsConstructor
public class SndService {
private final CallLogger call;
private final ResponseService responseService;
private final SndEnterFeignClient sndEnterFeignClient;
private final SndRepository sndRepository;
public int makeSndDTO (String serviceKeys) {
SndDTO snd = xmlToSndRoot(serviceKeys).getBody().getItems().getItem();
call.debug("explorerSnd item pasing : {}", snd);
return sndRepository.insertSnd(snd);
}
//애도 관심사를 분리하는게 어렵네...
public SndRoot xmlToSndRoot(String serviceKeys) {
try {
JAXBContext jaxbContext = JAXBContext.newInstance(SndRoot.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
return (SndRoot) unmarshaller.unmarshal(new StringReader(responseService.responseXmlToString(sndEnterFeignClient.requestConsumeData(serviceKeys))));
} catch (JAXBException e) {
throw new CommonException(ExceptionType.XML_TO_OBJECT_EXCEPTION);
}
}
}
<?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="net.herit.ami.features.stat.repository.dataportal.HolidayRepository">
<sql id="holidayColumns">
HOLIDAY_DATE
,NAME
,DAY_TYPE
</sql>
<insert id="insertHoliDayData" parameterType="net.herit.ami.features.stat.dto.Holiday.HolidayDataDAO">
INSERT INTO HOLIDAY_INFO (
<include refid="holidayColumns"></include>
)
values(
#{locdate}
,#{dateName}
,#{dateKind}
) ON DUPLICATE KEY UPDATE
NAME = VALUES(NAME)
,DAY_TYPE = VALUES(DAY_TYPE)
</insert>
</mapper>
<?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="net.herit.ami.features.stat.repository.dataportal.SmpRepository">
<sql id="SmpColumns">
ID
,SMP_DATE
,SMP_ARED_CD
,SMP_HOUR
,SMP_VALUE
,CREATE_TIME
</sql>
<sql id="UK">
SMP_DATE
,SMP_ARED_CD
,SMP_HOUR
,SMP_VALUE
</sql>
<insert id="insertSmp" parameterType="net.herit.ami.features.stat.dto.SmpXmlDTO.SmpDTO">
INSERT INTO SM_SMP(
<include refid="UK"></include>
)
values (
#{tradeDay}
,#{areaCd}
,#{tradeHour}
,#{smp}
)
ON DUPLICATE KEY UPDATE
SMP_VALUE = VALUES(SMP_VALUE)
</insert>
</mapper>
<?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="net.herit.ami.features.stat.repository.dataportal.SndRepository">
<sql id="SndColumns">
ID
,BASE_DATETIME
,SUPPLY_ABILITY
,CURRENT_PWR_TOTAL
,FORCAST_LOAD
,SUPPLY_RESERVE_PWR
,SUPPLY_RESERVE_RATE
,OPERATION_RESERVE_PWR
,OPERATION_RESERVE_RATE
,CREATE_TIME
</sql>
<sql id="UK">
BASE_DATETIME
,SUPPLY_ABILITY
,CURRENT_PWR_TOTAL
,FORCAST_LOAD
,SUPPLY_RESERVE_PWR
,SUPPLY_RESERVE_RATE
,OPERATION_RESERVE_PWR
,OPERATION_RESERVE_RATE
</sql>
<insert id="insertSnd" parameterType="net.herit.ami.features.stat.dto.SndXmlDTO.SndDTO">
INSERT INTO SM_ELEC_SUPPLY_STATUS(
<include refid="UK"></include>
)
values (
#{baseDatetime}
,#{suppAbility}
,#{currPwrTot}
,#{forecastLoad}
,#{suppReservePwr}
,#{suppReserveRate}
,#{operReservePwr}
,#{operReserveRate}
)
ON DUPLICATE KEY UPDATE
SUPPLY_ABILITY = VALUES(SUPPLY_ABILITY)
,CURRENT_PWR_TOTAL = VALUES(CURRENT_PWR_TOTAL)
,FORCAST_LOAD = VALUES(FORCAST_LOAD)
,SUPPLY_RESERVE_PWR = VALUES(SUPPLY_RESERVE_PWR)
,SUPPLY_RESERVE_RATE = VALUES(SUPPLY_RESERVE_RATE)
,OPERATION_RESERVE_PWR = VALUES(OPERATION_RESERVE_PWR)
,OPERATION_RESERVE_RATE = VALUES(OPERATION_RESERVE_RATE)
</insert>
</mapper>
package net.herit.ami.base.bases;
import org.junit.jupiter.api.BeforeEach;
import org.springframework.test.context.ActiveProfiles;
@ActiveProfiles(value = {"local"})
public class BaseTest {
@BeforeEach
void setUp() {
//LoggerContext.set();
}
}
package net.herit.ami.base.bases;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.test.web.servlet.MockMvc;
import com.fasterxml.jackson.databind.ObjectMapper;
@AutoConfigureMockMvc
@ExtendWith(MockitoExtension.class)
public class MockitoBase extends BaseTest {
protected MockMvc mockMvc;
protected static ObjectMapper objectMapper;
@BeforeEach
public void setUp() {
objectMapper = new ObjectMapper();
}
}
package net.herit.ami.base.bases;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
import net.herit.ami.commons.logger.call.log.CallLogger;
/**
* SpringBootTest의 경우 필요한 의존성(@Autowired)을 여기에 선언해야 웹서버가 한번만 뜬다.
* 하위 클래스에 선언시, 여러 개의 서버가 뜸.
*/
@Transactional(value = "mysqlTxManager")
@SpringBootTest
public class MysqlRepositoryBase extends BaseTest {
@Autowired
protected CallLogger callLogger;
}
package net.herit.ami.base.bases;
import net.herit.ami.commons.logger.call.log.CallLogger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.transaction.annotation.Transactional;
/**
* SpringBootTest의 경우 필요한 의존성(@Autowired)을 여기에 선언해야 웹서버가 한번만 뜬다.
* 하위 클래스에 선언시, 여러 개의 서버가 뜸.
*/
@SpringBootTest
public class MysqlRepositoryBaseNonTx extends BaseTest {
@Autowired
protected CallLogger callLogger;
}
package net.herit.ami.base.bases;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.herit.ami.commons.exception.job.CommonExceptionJobs;
import net.herit.ami.commons.exception.job.ExceptionJobs;
/**
* SpringBootTest의 경우 필요한 의존성(@Autowired)을 여기에 선언해야 웹서버가 한번만 뜬다.
* 하위 클래스에 선언시, 여러 개의 서버가 뜸.
*/
@SpringBootTest
@AutoConfigureMockMvc
@ExtendWith(SpringExtension.class)
public class SpringBootBase extends BaseTest {
@Autowired
protected MockMvc mockMvc;
@Autowired
protected ObjectMapper objectMapper;
@Autowired
protected CommonExceptionJobs commonExceptionJobs;
@Autowired
protected ExceptionJobs exceptionJobs;
}
package net.herit.ami.commons.exception.job;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import net.herit.ami.base.bases.SpringBootBase;
import net.herit.ami.commons.exception.ExceptionType;
@Disabled
class CommonExceptionJobsTests extends SpringBootBase {
@Test
void commonExceptionJobTest() {
boolean result = commonExceptionJobs.commonExceptionJob(ExceptionType.DEFAULT_EXCEPTION);
assertTrue(result);
}
}
package net.herit.ami.commons.exception.job;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import net.herit.ami.base.bases.SpringBootBase;
@Disabled
class ExceptionJobsTests extends SpringBootBase {
@Test
void exceptionJobTest() {
boolean result = exceptionJobs.exceptionJob(new NullPointerException());
assertTrue(result);
}
}
package net.herit.ami.commons.util;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import net.herit.ami.base.bases.SpringBootBase;
class BeanUtilTests extends SpringBootBase {
@Test
@DisplayName("bean 획득 테스트")
void getBeanTest() {
Object obj = BeanUtil.getBean("mockMvc");
assertNotNull(obj);
assertEquals(obj, mockMvc);
int a = 1052054428;
}
}
package net.herit.ami.commons.util;
import net.herit.ami.commons.dto.DateTimeFormatterObject;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.sql.Timestamp;
import java.time.LocalDateTime;
public class DateTimeTests {
@Test
@DisplayName("시간 연산에 대한 확인을 합니다.")
void getPrevTime() {
String datatime = "202202082400";
LocalDateTime localDateTime = LocalDateTime.parse(datatime, DateTimeFormatterObject.yyyyMMddHHmm);
System.out.println(localDateTime);
System.out.println(Timestamp.valueOf(localDateTime).getTime());
LocalDateTime before5 = localDateTime.minusMinutes(5);
System.out.println(before5);
System.out.println(Timestamp.valueOf(before5).getTime());
}
@Test
@DisplayName("오늘날짜를 기준으로 Day 연산을 확인합니다.")
void getMoveDay() {
DateTimeUtil dateTimeUtil = new DateTimeUtil();
System.out.println(dateTimeUtil.getNow_yyyyMMdd(-1));
}
}
package net.herit.ami.commons.util;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class StringTests {
@Test
public void test() {
String ids = "300, 310, 320, , ";
// Arrays.asList(ids.split(",")).forEach(r-> System.out.println(r.trim()));
Arrays.asList(ids.split(",")).stream().filter(r->r.trim().isEmpty()==false).forEach(r-> System.out.println(r.trim()));
List<String> list = Arrays.asList(ids.split(",")).stream().filter(r->r.trim().isEmpty()==false).map(r->r.trim()).collect(Collectors.toList());
System.out.println("----");
list.forEach(System.out::println);
System.out.println("exit");
}
@Test
void test1(){
if(JsonUtil.isNull("")){
System.out.println("null");
}else if(JsonUtil.isNull("not null")){
System.out.println("not null");
}else if(JsonUtil.isNull(null)){
System.out.println("null1");
}
}
}
package net.herit.ami.commons.util;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
@Slf4j
public class UuidUtilTests {
@Test
public void test() {
UuidUtil uuidUtil = new UuidUtil(new DateTimeUtil());
log.info("makeUUID:{}", uuidUtil.makeUUID());
log.info("makeUUIDWithoutHypen:{}", uuidUtil.makeUUIDWithoutHypen());
log.info("makeTxId:{}", uuidUtil.makeTxId());
for(int i=0; i<10; i++) {
log.info("makeTxId:{}", uuidUtil.makeShortUUID());
}
}
@Test
public void testIdGenerator() {
UuidUtil uuidUtil = new UuidUtil(new DateTimeUtil());
final int length = 10;
for(int i=0; i<10; i++) {
log.info("alphaNumeric: {}", uuidUtil.makeRandomAlphaNumeric(length));
log.info("alpha: {}", uuidUtil.makeRandomAlpha(length));
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment