Backend/SpringBoot

yaml 이나 env 에서 설정값 가져오기

Dean83 2025. 9. 3. 10:59

민감정보 등 은 env 파일에 따로 빼놓고, git에는 올리지 않는다. yaml을 통해 스프링부트 세부 설정을 할 수 있다.

코드레벨 혹은 yaml 에서 env 의 설정값을 가져와야 하는 경우가 있다. 

 

1. @Value 어노테이션을 사용

  • 타입이 반드시 일치해야 한다. 그렇지 않으면 오류 난다
  • yaml 혹은 properties의 server.url = 값 으로 명시한 값을 가져오기
    • "${..}" 는 값을 가져다 쓴다는 의미
...

@Value("${server.url}")
private String url;

...

//생성자 주입 - 가장 권장됨
public testClass(@Value("${server.url}) String value)
{
	this.value = value;
}

...

//기본값 설정 가능 값이 없으면 localhost 를 기본값으로 한다
@Value("${server.url}:localhost")
pritave String url;

...

 

  • SpEL
    • @Value 에 동적 계산이나 문자열 조합등 을 가능하도록 하는 언어
    • "#{...}" 로 사용
    • "#{ 조건식 등 추가 ${...}}" 
      • 프로퍼티 값을 가져와서 연산 혹은 조합을 하여 변수에 배정하는 경우.
    • 메서드 호출도 가능하다. 
      • 예 String의 split 메서드 호출 : "#{${server.id}.Split(',')}"
    • Bean 참조 가능
      • 예 : "#{@SystemProperties['java.version']}"

 

2. ConfigurationProperties

  • @Component 어노테이션이나 @EnableConfigurationProperties 어노테이션, 이 붙은 클래스에 사용할 수 있다.
  • Validation 을 이용할 수 있다
  • 클래스 자체에 설정값을 반영한다.
  • 변수에 대응하는 getter, setter 가 있어야 한다.
  • depth에 따라 클래스 내부에 내부 클래스를 만들어야 한다.
//설정파일
my:
  storage:
    path: /data/files
    s3:
      bucket: my-bucket
      region: ap-northeast-2
    
-----
    
@Component
@ConfigurationProperties(prefix = "my.storage")
public class StorageProperties {

    private String path;
    private final S3 s3 = new S3();

    public static class S3 {
        private String bucket;
        private String region;

        // Getter/Setter 필요
    }

    // Getter/Setter 필요
}

 

  • 리스트 항목이 있는 경우
my:
  servers:
    - host: 주소1
      port: 8080
    - host: 주소2
      port: 80
    - host: 주소3
      port: 8888
      
      
@ConfigurationProperties(prefix = "my")
public class ServerListProperties {

    private List<Server> servers;

    public static class Server {
        private String host;
        private int port;
        // Getter/Setter
    }

    // Getter/Setter
}

 

 

3. Environment

  • environment 에 yaml 뿐 아니라 환경변수, 명령줄 인수, jvm 속성 등도 포함되어 있다. 
  • 단순히 읽는것 뿐 아니라 추가 할 수도 있다.
@Service
public class testService {

    private final Environment environment;

    public testService(Environment environment) {
        this.environment = environment;
    }

    public void testMethod() {
        String port = environment.getProperty("server.url");
    }
}

 

4. env 파일의 내용을 yaml 에서 불러오기

  • 중요정보 (비밀번호, API 키값등) 은 env에 적어두고, git에 올리지 말아야 한다. 해당 값을 yaml 설정파일에서 읽어서 사용하도록 해야 한다. 
  • env 파일은 properties 형식으로 작성해야 한다.
//env 파일

DB_URL=jdbc:mysql://localhost:3306/test
DB_USER=myuser
DB_PASS=secret

----
//docker-compose.yaml 파일
...
SPRING_DB_URL : ${DB_URL}
SPRING_DB_USER : ${DB_USER}
SPRING_DB_PASS : ${DB_PASS}
....
-------


//yaml 파일
spring:
  config:
    import: optional:file:.env[.properties]

spring:
  datasource:
    url: ${SPRING_DB_URL}
    username: ${SPRING_DB_USER}
    password: ${SPRING_DB_PASS}
  • 위의 예제에서는 env 내용을 docker-compose 에서 읽고, docker-compose 내용을 yaml에 env 파일을 불러오도록 설정되었으나, 환경변수에 추가하거나 AWS 에서 추가 설정을 해주면 해당 작업 없이도 불러올 수 있다. 
  • 또는, implementation 'me.paulschwarz:spring-dotenv:3.0.0' 를 build.gradle 에 추가 하여 env -> application.yaml 에서 사용할 수 있게 한다.