|
|
|
|
|
|
|
## 전자정부 프레임워크 호환성
|
|
|
|
[호환성 가이드 문서](./egov_compatibility_guide.md)
|
|
|
|
|
|
|
|
### log 설정 : application-${spring.profiles.active}.yml
|
|
|
|
|
|
|
|
```yml
|
|
|
|
# application-local.yml 파일 기준
|
|
|
|
app:
|
|
|
|
# parameter 로그 출력
|
|
|
|
param.log.enabled: true
|
|
|
|
# parameter custom 로그 출력(LoggerAspect)
|
|
|
|
param.log.custom.enabled: false
|
|
|
|
# MDC logging trace 활성
|
|
|
|
mdc.log.trace.enabled: true
|
|
|
|
|
|
|
|
# SQL 로그 : p6spy
|
|
|
|
sql.logging.enabled: true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 로그 파일 위치
|
|
|
|
logging:
|
|
|
|
level:
|
|
|
|
root: debug
|
|
|
|
file:
|
|
|
|
path: D:/data/mens/logs
|
|
|
|
```
|
|
|
|
### SQL 로그 : p6spy 또는 log4jdbc
|
|
|
|
```yml
|
|
|
|
# SQL 로그를 log4jdbc로 교체할 경우
|
|
|
|
# pom.xml 변경 : 아래 comment 제거
|
|
|
|
<!-- p6spy 사용으로 comment 처리
|
|
|
|
<dependency>
|
|
|
|
<groupId>org.bgee.log4jdbc-log4j2</groupId>
|
|
|
|
<artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
|
|
|
|
<version>1.16</version>
|
|
|
|
</dependency>
|
|
|
|
-->
|
|
|
|
# application-local.yml 파일 spring.datasouce의 driver 와 url 변경
|
|
|
|
# ================ log4jdbc ===========================
|
|
|
|
#driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
|
|
|
|
#url: jdbc:log4jdbc:mariadb://211.119.124.122:3306/xplatform?useUnicode=true&characterEncoding=utf-8
|
|
|
|
# =====================================================
|
|
|
|
# =============== p6spy ===============================
|
|
|
|
driver-class-name: org.mariadb.jdbc.Driver
|
|
|
|
url: jdbc:mariadb://211.119.124.122:3306/xplatform?useUnicode=true&characterEncoding=utf-8
|
|
|
|
# =====================================================
|
|
|
|
|
|
|
|
# sql.logging.enabled: true -> false로 변경 : p6spy log disalbled
|
|
|
|
# /resources/logback-spring-log4jdbc.xml -> logback-spring.xml 으로 변경
|
|
|
|
```
|
|
|
|
|
|
|
|
### JPA 활성 : application-jpa.yml
|
|
|
|
```yml
|
|
|
|
app:
|
|
|
|
# jpa 활성 여부
|
|
|
|
jpa:
|
|
|
|
enabled: false -> true
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## 암호화(license) 적용
|
|
|
|
### 모듈 package : kr.xit.init
|
|
|
|
-> 복호화 메소드만 제공
|
|
|
|
```text
|
|
|
|
1. /resources/META-INF/spring.factories 파일 생성
|
|
|
|
|
|
|
|
# META-INF/spring.factories : xit-init
|
|
|
|
org.springframework.context.ApplicationContextInitializer=kr.xit.core.init.custom.CustomContextInitalizer
|
|
|
|
```
|
|
|
|
### 정보(license) 암호화
|
|
|
|
```text
|
|
|
|
# 암호화 필요 정보 encoding : 전자서명 알고리즘- RSA, 블록암호화알고리즘 - SEEDEngine
|
|
|
|
kr.xit.core.spring.config.custom.bouncy.BouncyUtils 사용
|
|
|
|
-> packaging시 제외되는 클래스로 로컬에서만 사용
|
|
|
|
ex) app:
|
|
|
|
license:
|
|
|
|
path: ${app.data.root.path}/ens/.pem/
|
|
|
|
key: 'mxLAM1fAEDPWkFz8'
|
|
|
|
data1: 'jz5LT6TlZtewv1GRVN3cI6CgoPgS89Sfh7qSKkCVjjMPOyBKkT386tlnMnjXluTSr8OIvI1pHd96fHxRZHNUBuLeQOkUeWuzkfxlP8C7nDyIrG36T2aontjroAxoNk3oYdIYRVWNs1Iqw39v9xF8NYFFLGqtfv/wnCGxlwTsDwCf9bjAtyd9cTiS27dVrIbrAVKnchgxIF/DUQQc901l4DZ5gsT6aLx6TmzhvAewPK1HfiG9WrMWxpw0TMxt++0Vedh+oZEs48ACMpuHFFh406LynyxxE7boRVbKmh7Tn87gKa6+zzdzIN1kS8sk58Ms1HPvBfvwwnD8qiJItXO6DQ=='
|
|
|
|
data2: 'Te3bfmvdiMZdpfRwC3OO9UjwbNkvbf16kqEqn9VqwbVztizA9rvMFshlI0vuqai9Hml31IsNINKg+OYkhmkH6ic1I10r6MNIVl3WL5YxfeK7YBmjvNuGZtKwchlWzhMODsgNAq0aIQVi4kLk5filDaZESY10xlNdbf9c/SKGfJeLZxY7DCchkAgj/ZnmZNqOE2kDAoC+O1ksDNTS0+cr+WsKsoFON0EpNI5B2ElBtnT1LmQQ3R+FNCtp7YJaRZA3RPsata05kKH7sL1J0M6A6HIVxisOU3bjH0hB+60BHJfdlEiXo6RJvsPyXotwe8MYVrHJbIQgsepxSDpMFZe8HA=='
|
|
|
|
data3: 't9qYJTU49dbaeezJkzpM2uY3iLIcy/V/VnyVsWIcd0f4QMLJ3cmLZ0QcMyKoR7CL2CuHMnPJz8j7KFOTQRPpeN/Dl4bCpOu+BM3foYpn4wb5HcLdHJxp5CuFmhTfqRGuUxurv6jcqkwmRzPW35UjQLjeKSdv6m+2b84PN4sZSNeMjQDH0QC85yKphHKV8m6bzqUbHLiZwDXndgpq2/YGKdWjPinlH7PZ+L2xfrfhdWXoY9QrHYVOSPogd81EizzyQseif8GAkeUG1OKAOomhyEuTOxtdGbUew59YuuBlUpORgj/Koclyd2shHyne9CJdqnQqAA2mh61V1ZzBUvSIWQ=='
|
|
|
|
|
|
|
|
|
|
|
|
# 암호화된 정보 등록 : ens-api 모듈에 적용
|
|
|
|
/resources/config/application-${profiles}.yml
|
|
|
|
- app.license 속성
|
|
|
|
|
|
|
|
# 필요시 xit-init 모듈 AppInitHelper.init() method 재정의
|
|
|
|
```
|
|
|
|
@ Class Property 대소문자
|
|
|
|
Swagger API 사용시 대문자 필드 사용 불가
|
|
|
|
대문자 필드 사용시 @Schema 속성 및 데이타 전달 불가
|
|
|
|
@JsonProperty 또는 전체 클래스 필드인 경우 @JsonNaming 사용
|
|
|
|
json <-> java class 변환 적용
|
|
|
|
```text
|
|
|
|
@JsonNaming(value = PropertyNamingStrategies.UpperSnakeCaseStrategy.class)
|
|
|
|
public static class RequestDataHeader {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* <pre>
|
|
|
|
* TRAN_ID : 요청한값 그대로 return
|
|
|
|
* 고유번호 : 최대 24
|
|
|
|
* </pre>
|
|
|
|
*/
|
|
|
|
@Schema(requiredMode = RequiredMode.AUTO, title = "TRAN_ID", example = "20230906120000")
|
|
|
|
@Size(min = 0, max = 24, message = "TRAN_ID는 24자를 넘을 수 없습니다.")
|
|
|
|
//@JsonProperty("TRAN_ID")
|
|
|
|
private String tran_id;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* CNTY_ID : 요청한값 그대로 return
|
|
|
|
*/
|
|
|
|
@Schema(requiredMode = RequiredMode.AUTO, title = "CNTY_ID", example = "kr")
|
|
|
|
@Size(min = 0, max = 2, message = "CNTY_ID는 2자를 넘을 수 없습니다.")
|
|
|
|
//@JsonProperty("CNTY_ID")
|
|
|
|
private String cnty_id;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
{
|
|
|
|
"TRAN_ID": "20230906120000",
|
|
|
|
"CNTY_ID": "kr"
|
|
|
|
}
|
|
|
|
-> getTranId, getCntyId
|
|
|
|
*/
|
|
|
|
|
|
|
|
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
|
|
|
|
public static class PublickeyReqDataBody {
|
|
|
|
/**
|
|
|
|
* 공개키 요청일시 (YYYYMMDDHH24MISS)
|
|
|
|
*/
|
|
|
|
@Schema(requiredMode = RequiredMode.REQUIRED, title = "공개키 요청일시", example = "2023090612122259")
|
|
|
|
@Size(min = 16, max = 16, message = "요청일시(req_dtim)는 필수 입니다(16자리)")
|
|
|
|
private String reqDtim;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
{
|
|
|
|
"req_dtim": "20230906120000",
|
|
|
|
}
|
|
|
|
-> getReqDtim
|
|
|
|
*/
|
|
|
|
```
|
|
|
|
## Json 데이타 null 필드 제외
|
|
|
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
|
|
|
```text
|
|
|
|
@JsonInclude(JsonInclude.Include.NON_NULL)
|
|
|
|
@JsonNaming(PropertyNamingStrategies.UpperSnakeCaseStrategy.class)
|
|
|
|
public static class RequestDataHeader {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* <pre>
|
|
|
|
* TRAN_ID : 요청한값 그대로 return
|
|
|
|
* 고유번호 : 최대 24
|
|
|
|
* </pre>
|
|
|
|
*/
|
|
|
|
@Schema(requiredMode = RequiredMode.AUTO, title = "TRAN_ID", example = "20230906120000")
|
|
|
|
@Size(min = 0, max = 24, message = "TRAN_ID는 24자를 넘을 수 없습니다.")
|
|
|
|
private String tranId;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* CNTY_ID : 요청한값 그대로 return
|
|
|
|
*/
|
|
|
|
@Schema(requiredMode = RequiredMode.AUTO, title = "CNTY_ID", example = "kr")
|
|
|
|
@Size(min = 0, max = 2, message = "CNTY_ID는 2자를 넘을 수 없습니다.")
|
|
|
|
private String cntyId;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
{TRAN_ID : null or ""} --> tranId 필드 제외
|
|
|
|
*/
|
|
|
|
```
|
|
|
|
## SecondaryDB 설정 주의
|
|
|
|
SecondaryDatasourceConfig
|
|
|
|
```text
|
|
|
|
@MapperScan(
|
|
|
|
basePackages = {
|
|
|
|
"kr.xit.other.mapper"
|
|
|
|
},
|
|
|
|
sqlSessionFactoryRef = Constants.SECONDARY_SQL_SESSION
|
|
|
|
)
|
|
|
|
|
|
|
|
@MapperScan - basePackages설정 시 PrimaryDatasourceConfig 와 중복이 발생하지 않도록 주의
|
|
|
|
예) "kr.xit.biz.**.mapper"를 Primary에 설정
|
|
|
|
"kr.xit.biz.other.mapper"를 Secondary에 설정할 경우
|
|
|
|
Primary는 **로 인해 kr.xit.biz.other.mapper를 불러오고 Secondary도 kr.xit.biz.other.mapper를 불러와서 중복 발생
|
|
|
|
이로 인해서 mapper의 Name이 중복되어 정상 인식이 불가능.
|
|
|
|
|
|
|
|
```
|
|
|
|
## SecondaryDB 설정 주의
|
|
|
|
SecondaryDatasourceConfig
|
|
|
|
```text
|
|
|
|
@MapperScan(
|
|
|
|
basePackages = {
|
|
|
|
"kr.xit.other.mapper"
|
|
|
|
},
|
|
|
|
sqlSessionFactoryRef = Constants.SECONDARY_SQL_SESSION
|
|
|
|
)
|
|
|
|
|
|
|
|
@MapperScan - basePackages설정 시 PrimaryDatasourceConfig 와 중복이 발생하지 않도록 주의
|
|
|
|
예) "kr.xit.biz.**.mapper"를 Primary에 설정
|
|
|
|
"kr.xit.biz.other.mapper"를 Secondary에 설정할 경우
|
|
|
|
Primary는 **로 인해 kr.xit.biz.other.mapper를 불러오고 Secondary도 kr.xit.biz.other.mapper를 불러와서 중복 발생
|
|
|
|
이로 인해서 mapper의 Name이 중복되어 정상 인식이 불가능.
|
|
|
|
|
|
|
|
```
|