@Getter
@Setter
@ConfigurationProperties(prefix = "separate")
public class SeparateProperties {
private Map<String, String> sourceRootMap = new HashMap<>();
private String targetRoot;
private int retentionYears;
private int failMaxCount;
private int processPageSize;
private int custIdBatchSize;
private int cleanupBatchSize;
private int tempFileAgeMinutes;
private int sourceDeletionMaxDays;
private int dbRetryMaxAttempts;
private long dbRetryBaseDelayMs;
private Schedule schedule = new Schedule();
@Getter
@Setter
public static class Schedule {
private String separate;
private String cleanup;
private String oracle;
private String orphanTmp;
}
}
SeparateProperties 에 @ConfigurationProperties(prefix = "separate") 작성
application.properties
separate.source-root-map[01]=S:/recfile
separate.source-root-map[02]=D:/RECFILE
RecordDto 에는 systemCode 가 필드로 존재
String sourceRoot = properties.getSourceRootMap().get(record.getSystemCode());
if (sourceRoot == null) {
log.warn("알 수 없는 system_code: {}, rec_seq={}", record.getSystemCode(), record.getRecSeq());
postgresqlMapper.updateSeparateError(record);
return ProcessResult.ERROR;
}
sourceRoot에 어떤 값이 들어오는지?
Spring Boot가 시작될 때 application.properties의 모든 separate.*를 읽어서, SeparateProperties 클래스의 필드명과 매칭해 자동으로 값을 주입
properteis의 kebab-case -> Java의 camelCase로 자동 변환
separate.source-root-map -> sourceRootMap (Map<String,String>)
필드가 Map<String, String>이면 [괄호 안]을 Map의 key로, 오른쪽 값을 value로 넣음
결과
sourceRootMap = { "01" : "S:/recfile", "02" : "D:/RECFILE" }
prefix = "separate" 는 네임스페이스 지정이고, 그 아래 키들을 필드명 기준으로 하나씩 찾아서 타입에 맞게 주입합니다. separate.source-root-map만 sourceRootMap에 들어가고, 나머지 키들은 각자 해당 필드(targetRoot, failMaxCount 등)에 분리되어 들어감.
필드가 없는 키는 그냥 무시
application.propeties
separate.target-root=S:/separate
separate.fail-max-count=3
이렇게 돼있음