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

TopOfTheHead·2025년 10월 24일

Spring Boot

목록 보기
14/26

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만을 선별해서 자바 클래스의 각각의 fieldmapping자바 객체를 생성하는 어노테이션

진입점 클래스@ConfigurationPropertiesScan를 선언하여 해당 @ConfigurationProperties 클래스를 식별하도록 해야한다.

# application.yml
custom:
  jwt:
    secrets:
      appkey: ${secret}
      originkey: ${origin}
    validations:
      access: 1800000
      refresh: 604800000
@SpringBootApplication
@ConfigurationPropertiesScan
public class JwtApplication {
    public static void main(String[] args) {
        SpringApplication.run(JwtApplication.class, args);
    }
}

진입점 클래스@ConfigurationPropertiesScan를 선언

@RequiredArgsConstructor
@Getter
@ConfigurationProperties(prefix = "custom.jwt")
public class JwtProperties {
    private final Validations validations;
    private final Secrets secrets;
    @Getter
    @RequiredArgsConstructor
    public static class Secrets{
        private final String appkey;
        private final String originkey;
    }
    @Getter
    @RequiredArgsConstructor
    public static class Validations{
        private final Long access;
        private final Long refresh;
    }
}

중첩 클래스로 선언 시 final 키워드를 선언하여 불변성을 보장 가능

application.yml 이하 prefix로 지정된 custom.jwt 이하 각 속성필드로 선언
▶ 해당 속성속성이 추가로 존재시, 중첩클래스로 표현

。해당 @ConfigurationProperties 클래스는 보통 ~/properties 디렉토리 내 저장

  • 필드final이 아닌 경우, @Setter을 설정해야 yml파일에서 자동으로 주입
@Getter
@Setter
@ConfigurationProperties(prefix = "custom.redis")
public class RedisProperties {
    private String host;
    private String port;
}

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개의 댓글