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 Bean의Spring 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 클래스의 각각의field로mapping한Spring Bean을 생성하는어노테이션
▶@Component선언하거나@EnableConfigurationProperties를 통해Spring Bean으로 등록
▶field에property를 할당해야하므로Setter를 정의# application.yml kt: techup: id: 1 name: "lee" age: 28import 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.techup의id,name,age를 각각클래스의field로 정의 및Spring Bean으로 등록
▶Runner 클래스에 해당Spring Bean을DI한 후 출력 시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.yml의property를 해당클래스에바인딩하는 역할을 대신 수행하는어노테이션
▶ 해당바인딩을 대신 수행하여@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으로 등록