application.yml 관련 어노테이션 - @Value , @ConditionalOnProperty , @ConfigurationProperties , @EnableConfigurationProperties , @Profile

TopOfTheHead·2025년 10월 24일

Spring Boot

목록 보기
14/25

application.yml 파일 내 작성된 property어플리케이션으로 반영하는 어노테이션

@Value("${prefix명.property명}")
SpringEL 방식을 통해 applications.yml에 정의된 property값field주입

@Value컴파일이 아닌 런타임값 할당이 수행되므로 final 변수에는 선언 불가능하여 불변성 보장 불가능.
final 변수컴파일단계에 값을 할당해야함
yml 파일에서 가져온 데이터불변성을 보장하기 위해서는 @ConfigurationProperties를 활용한 방법을 사용

@Value("${db.select}")
private String select; // select = "mariadb" 로 설정

db.select: mariadb인 경우

@ConditionalOnProperty(prefix="prefix명" , name = "property명", value="property값")
applications.yml에 정의된 변수와 값에 따라서 반환되는 Spring BeanSpring Context 등록여부를 결정

Spring Bean으로 등록하는 기능이 없으므로 @Bean 또는 @Component와 함께 사용

	@Bean
    @ConditionalOnProperty(prefix = "db", name = "select", havingValue = "maridb")
    public MariaDBJdbcConnector mariaDBJdbcConnector(){
        return new MariaDBJdbcConnector();
    }

db.select=mariadb인 경우 Spring Bean으로 등록

@ConfigurationProperties(prefix="prefix명")
application.yml에 정의된 property 중 제공된 prefix를 가진 property만을 선별해서 Spring Bean 클래스의 각각의 fieldmappingSpring Bean을 생성하는 어노테이션
@Component 선언하거나 @EnableConfigurationProperties를 통해 Spring Bean으로 등록
fieldproperty를 할당해야하므로 Setter를 정의

# application.yml
kt:
  techup:
    id: 1
    name: "lee"
    age: 28
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Setter;
import lombok.ToString;
@ConfigurationProperties(prefix = "kt.techup")
@Component
@ToString
@Setter
public class MappedByConfig {
	private int id;
	private String name;
	private int age;
}
@Component
class Runner implements CommandLineRunner {
	private MappedByConfig mc; // Spring Bean 주입
	public Runner(MappedByConfig mc) {
		this.mc = mc;
	}
	public void run(String[] args) {
		System.out.println(mc.toString()); // id=1, name=lee, age=28
	}
}

prefix : kt.techupid, name, age 를 각각 클래스field로 정의 및 Spring Bean으로 등록
Runner 클래스에 해당 Spring BeanDI한 후 출력 시 id=1, name=lee, age=28로 설정됨을 확인

。이때, MappedByConfig필드final 선언이 불가능하며 Setter를 정의해야 yml파일property바인딩할 수 있으므로 불변성을 보장할 수 없다

  • yml파일에서 property를 가져올때 가져온 불변성을 보장하는 방법
    @EnableConfigurationProperties를 선언한 Spring Bean과 함께 사용 시 application.yml과 바인딩한 불변객체를 생성 가능
    @Value와 달리 불변성 보장
// application.yml의 property와 데이터를 바인딩하는 클래스
@ConfigurationProperties(prefix = "kt.techup")
public record MappedByConfig(int id, String name, int age) { }
@Getter
@Component
// @ConfigurationProperties 클래스를 Spring Bean으로 등록 및 선언된 클래스로 바인딩 수행
@EnableConfigurationProperties(MappedByConfig.class)
class PojoForConfig {
	// application.yml의 property와 데이터를 바인딩한 불변객체
	private final MappedByConfig mappedByConfig;
	// 스프링빈 의존성주입
	public PojoForConfig(MappedByConfig mappedByConfig) {
		this.mappedByConfig = mappedByConfig;
	}
}
@Component
class Runner implements CommandLineRunner {
	private PojoForConfig mc; // Spring Bean 의존성주입
	public Runner(PojoForConfig mc) {
		this.mc = mc;
	}
	public void run(String[] args) {
		System.out.println(mc.getMappedByConfig().name()); // 불변객체에서 lee 출력
	}
}

record를 활용하여 yml파일데이터바인딩을 설정한 @ConfigurationProperties 클래스 선언
Getter , Setter , 생성자를 자동 정의

@EnableConfigurationProperties를 선언한 클래스데이터바인딩불변객체 선언 및 의존성주입
@EnableConfigurationProperties(클래스명.class)을 통해 해당 클래스Spring Bean으로 등록

@EnableConfigurationProperties(@ConfigurationProperties클래스.class)
@ConfigurationProperties가 선언된 클래스Spring Bean으로 등록 및 application.ymlproperty를 해당 클래스바인딩하는 역할을 대신 수행하는 어노테이션
▶ 해당 바인딩을 대신 수행하여 @ConfigurationProperties가 선언된 클래스필드final을 선언 및 Setter를 정의를 안할 수 있다.

@Profile
。특정 환경( dev, qa 등 )의 프로필활성화된 경우에만 선언된 Spring Bean을 등록하도록 조건을 설정하는 어노테이션
Spring Bean으로 등록할 클래스에 선언

@Component
@Profile({"test", "qa"})
class Runner implements CommandLineRunner {
	private MappedByConfig mc;
	public Runner(MappedByConfig mc) {
		this.mc = mc;
	}
	public void run(String[] args) {
		System.out.println(mc.toString()); // id=1, name=lee, age=28
	}
}

qa, test 환경프로필인 경우에만 Spring Bean으로 등록하여 CommanLineRunner 실행

  • 선언방법
    @Profile("환경명") :
    。해당 환경프로필활성화된 경우 Spring Bean으로 등록

    @Profile({"환경명1", "환경명2", ... }) :
    。정의된 환경프로필활성화된 경우 Spring Bean으로 등록

    @Profile("!환경명")
    。해당 환경프로필활성화되지 않은 경우 Spring Bean으로 등록
profile
공부기록 블로그

0개의 댓글