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만을 선별해서자바 클래스의 각각의field로mapping한자바 객체를 생성하는어노테이션
。진입점 클래스에@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.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으로 등록