@ConfigurationProperties

송지윤·2일 전

Spring Boot

목록 보기
77/77

@ConfigurationProperties

@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에 어떤 값이 들어오는지?

@ConfigurationProperties(prefix = "separate")

동작 원리

Spring Boot가 시작될 때 application.properties의 모든 separate.*를 읽어서, SeparateProperties 클래스의 필드명과 매칭해 자동으로 값을 주입

매칭 규칙 (Relaxed Binding)

properteis의 kebab-case -> Java의 camelCase로 자동 변환

separate.source-root-map -> sourceRootMap (Map<String,String>)

Map 타입은 [key] 문법으로 바인딩

필드가 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

이렇게 돼있음

0개의 댓글