@ConfigurationProperties는 스프링 부트에서 제공하는 어노테이션으로, 외부 설정(예: properties 파일, YAML 파일, 환경 변수 등)을 자바 객체에 바인딩할 때 사용됩니다.
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private String description;
private int version;
// getters and setters
}
그리고 application.properties 또는 application.yml 파일에서:
app.name=MyApp
app.description=This is my application
app.version=1
@ConfigurationProperties는 여러 관련 프로퍼티를 하나의 클래스로 바인딩할 때 유용합니다. 반면 @Value는 개별 프로퍼티를 주입할 때 사용됩니다.
// @ConfigurationProperties 사용
@Component
@ConfigurationProperties(prefix = "mail")
public class MailProperties {
private String host;
private int port;
private String username;
private String password;
// getters and setters
}
// @Value 사용
@Component
public class MailConfig {
@Value("${mail.host}")
private String host;
@Value("${mail.port}")
private int port;
// ...
}
중첩 클래스를 사용하여 복잡한 프로퍼티 구조를 매핑할 수 있습니다:
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private String name;
private Security security = new Security();
public static class Security {
private String username;
private String password;
private List<String> roles = new ArrayList<>();
// getters and setters
}
// getters and setters
}
이는 다음과 같은 YAML 설정과 매핑됩니다:
app:
name: MyApp
security:
username: admin
password: secret
roles:
- USER
- ADMIN
@Validated 어노테이션과 함께 사용하여 프로퍼티 값의 유효성을 검사할 수 있습니다:
import javax.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@ConfigurationProperties(prefix = "app")
@Validated
public class AppProperties {
@NotNull
private String name;
@Min(0)
@Max(100)
private int threshold;
// getters and setters
}
@ConfigurationProperties는 동적으로 프로퍼티를 바인딩할 수 있습니다. 예를 들어, Map을 사용하여 알 수 없는 프로퍼티들을 캡처할 수 있습니다:
@ConfigurationProperties(prefix = "app")
public class AppProperties {
private Map<String, String> additionalHeaders = new HashMap<>();
// getter and setter
}
이는 다음과 같은 프로퍼티와 매핑됩니다:
app.additional-headers.header1=value1
app.additional-headers.header2=value2
@ConfigurationProperties와 프로파일을 함께 사용하여 환경별로 다른 설정을 할 수 있습니다:
app:
name: MyApp
---
spring:
profiles: development
app:
name: MyApp-Dev
---
spring:
profiles: production
app:
name: MyApp-Prod
@ConfigurationProperties 클래스를 테스트할 때는 @EnableConfigurationProperties 어노테이션을 사용할 수 있습니다:
@SpringBootTest
@EnableConfigurationProperties(value = AppProperties.class)
@TestPropertySource("classpath:test-app.properties")
class AppPropertiesTest {
@Autowired
private AppProperties appProperties;
@Test
void testAppProperties() {
assertEquals("TestApp", appProperties.getName());
assertEquals(50, appProperties.getThreshold());
}
}
@ConfigurationProperties 클래스 간의 순환 의존성을 피하세요.@ConfigurationProperties는 빈 생성 시점에 바인딩되므로, 동적 변경이 필요한 경우 다른 방법을 고려해야 합니다.@ConfigurationProperties는 스프링 부트 애플리케이션의 설정을 타입 안전하고 구조화된 방식으로 관리할 수 있게 해주는 강력한 기능입니다. 이를 통해 애플리케이션의 설정을 더 쉽게 관리하고, 오류를 줄이며, 코드의 가독성을 높일 수 있습니다.
@Value
@Configuration
@Profile
@PropertySource
@EnableConfigurationProperties