PHpullh
학습 라이브러리/Java/설정 외부화

JAVA · 디자인패턴

설정 외부화

애플리케이션 설정을 코드에서 분리하여 환경별로 관리합니다.

디자인패턴중급설정외부화Properties환경변수12Factor

핵심 설명

애플리케이션 설정을 코드에서 분리하여 환경별로 관리합니다.

Java code

import java.util.*;
import java.io.*;
import java.nio.file.*;

public class ExternalConfig {
    // 설정 소스 계층: 환경변수 > 시스템 프로퍼티 > 파일 > 기본값
    static class Config {
        private final Properties props = new Properties();

        Config(String configPath) {
            // 1. 기본값 로드
            props.setProperty("server.port", "8080");
            props.setProperty("db.url", "jdbc:h2:mem:default");

            // 2. 파일에서 로드
            try {
                if (Files.exists(Path.of(configPath))) {
                    props.load(new FileInputStream(configPath));
                }
            } catch (IOException e) {
                System.err.println("설정 파일 로드 실패: " + e.getMessage());
            }
        }

        String get(String key) {
            // 3. 환경변수 우선 (KEY_NAME 형식)
            String envKey = key.toUpperCase().replace('.', '_');
            String envVal = System.getenv(envKey);
            if (envVal != null) return envVal;

            // 4. 시스템 프로퍼티
            String sysVal = System.getProperty(key);
            if (sysVal != null) return sysVal;

            // 5. 파일 / 기본값
            return props.getProperty(key, "");
        }

        int getInt(String key, int defaultVal) {
            try { return Integer.parseInt(get(key)); }
            catch (NumberFormatException e) { return defaultVal; }
        }
    }

    public static void main(String[] args) {
        Config config = new Config("application.properties");
        System.out.println("포트: " + config.getInt("server.port", 8080));
        System.out.println("DB: " + config.get("db.url"));
    }
}

학습 팁

Spring Boot는 이와 동일한 설정 우선순위를 사용합니다. @Value@ConfigurationProperties로 타입 안전하게 바인딩합니다.

주의할 점

설정 파일에 비밀번호를 평문으로 저장하지 마세요. 환경 변수, Vault, 암호화된 설정을 사용하세요.

자주 묻는 질문

설정 외부화란 무엇인가요?

애플리케이션 설정을 코드에서 분리하여 환경별로 관리합니다.

설정 외부화 학습 시 주의할 점은 무엇인가요?

설정 파일에 비밀번호를 평문으로 저장하지 마세요. 환경 변수, Vault, 암호화된 설정을 사용하세요.