spring boot configuartion processor 에 대한 정리는 밸덩의 내용과 동일하다는 점을 참고하기 바랍니다.
Spring Boot Configuration Processor는 Spring Boot 애플리케이션에서 @ConfigurationProperties
어노테이션을 사용할 때 도움을 주는 라이브러리입니다. @ConfigurationProperties
를 사용하면 YAML 또는 Properties 파일과 같은 외부 구성 소스에서 속성을 읽어와서 Java 객체에 매핑할 수 있습니다. 이를 통해 손쉽게 구성 정보를 다룰 수 있습니다.
Spring Boot Configuration Processor는 이러한 구성 속성을 다루는 데 도움을 주는 메타데이터를 생성합니다. 이 메타데이터는 개발자가 구성 속성을 올바르게 사용하고, IDE에서 지원을 받을 수 있도록 도와줍니다. 또한 런타임 시에 유효성 검사를 수행하여 잘못된 구성 값이 있을 경우 경고를 표시할 수도 있습니다.
주로 spring-boot-configuration-processor
의존성을 프로젝트에 추가하여 사용합니다. 이 의존성을 추가하면 소스 코드 컴파일 시에 메타데이터가 생성되어 IDE에서 구성 속성을 쉽게 사용할 수 있게 됩니다.
예를 들어, 다음은 application.properties
파일에서 설정된 구성 속성을 사용하는 Java 클래스의 간단한 예제입니다:
@ConfigurationProperties(prefix = "example")
public class MyConfig {
private String name;
private int age;
// getters and setters
}
이 클래스를 사용하는 다른 곳에서는 IDE에서 구성 속성의 자동 완성 및 문서화가 지원되어 더 편리하게 사용할 수 있습니다. Spring Boot Configuration Processor는 이러한 자동 완성 및 문서화를 가능하게 해주는 도구 중 하나입니다.
Spring Boot Configuration Processor
의 소개에 대해 정리하면 다음과 같습니다.
Configuration
메타데이터를 처리하는데 도움을 주기 위한 도구이다.우리는 보통 프로퍼티의 값을 설정할 때, 어떤 기능을 하는지, 기본 값이 있는지, 더이상 사용되지 않는지, 속성이 존재하는지조차 모르는 경우가 많다. Spring Boot Configuration Processor
를 통해 이러한 불편함을 해결할 수 있다.
Gradle을 사용하면 다음 예제와 같이 주석 프로세서 구성에서 종속성을 선언해야 합니다:
dependencies {
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
}
@ConfigurationProperties
애노테이션을 꼭 사용해주어야 한다.@Configuration
@ConfigurationProperties(prefix = "database")
public class DatabaseProperties {
public static class Server {
private String ip;
private int port;
// standard getters and setters
}
private String username;
private String password;
private Server server;
// standard getters and setters
}
#Simple Properties
database.username=baeldung
database.password=password
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AnnotationProcessorApplication.class)
@TestPropertySource("classpath:databaseproperties-test.properties")
public class DatabasePropertiesIntegrationTest {
@Autowired
private DatabaseProperties databaseProperties;
@Test
public void whenSimplePropertyQueriedThenReturnsPropertyValue()
throws Exception {
Assert.assertEquals("Incorrectly bound Username property",
"username", databaseProperties.getUsername());
Assert.assertEquals("Incorrectly bound Password property",
"password", databaseProperties.getPassword());
}
}
target/classes/META-INF/spring-configuration-metadata.json
경로에 해당 파일이 생긴다.{
"groups": [
{
"name": "database",
"type": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties",
"sourceType": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties"
},
{
"name": "database.server",
"type": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
"sourceType": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties",
"sourceMethod": "getServer()"
}
],
"properties": [
{
"name": "database.password",
"type": "java.lang.String",
"sourceType": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties"
},
{
"name": "database.server.ip",
"type": "java.lang.String",
"sourceType": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties$Server"
},
{
"name": "database.server.port",
"type": "java.lang.Integer",
"sourceType": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
"defaultValue": 0
},
{
"name": "database.username",
"type": "java.lang.String",
"sourceType": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties"
}
],
"hints": []
}
database.server.port
필드에 기본값을 부여하고 마지막으로 @Min
및 @Max
주석을 추가합니다.public static class Server {
/**
* The IP of the database server
*/
private String ip;
/**
* The Port of the database server.
* The Default value is 443.
* The allowed values are in the range 400-4000.
*/
@Min(400)
@Max(800)
private int port = 443;
// standard getters and setters
}
Spring-configuration-metadata.json
파일을 확인하면 다음과 같은 추가 정보가 반영됩니다:
{
"groups": [
{
"name": "database",
"type": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties",
"sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
},
{
"name": "database.server",
"type": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
"sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties",
"sourceMethod": "getServer()"
}
],
"properties": [
{
"name": "database.password",
"type": "java.lang.String",
"sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
},
{
"name": "database.server.ip",
"type": "java.lang.String",
"description": "The IP of the database server",
"sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server"
},
{
"name": "database.server.port",
"type": "java.lang.Integer",
"description": "The Port of the database server. The Default value is 443.
The allowed values are in the range 400-4000",
"sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
"defaultValue": 443
},
{
"name": "database.username",
"type": "java.lang.String",
"sourceType": "com.baeldung.autoconfiguration.annotationprocessor.DatabaseProperties"
}
],
"hints": []
}
database.server.ip
및 database.server.port
필드로 차이점을 확인할 수 있습니다. 실제로 추가 정보가 상당히 도움이 됩니다. 결과적으로 개발자와 IDE는 각 속성이 수행하는 작업을 훨씬 쉽게 이해할 수 있습니다.
JSON 메타데이터 파일을 자세히 살펴보고 그 구성 요소에 대해 살펴봅니다.
groups
은 값 자체를 지정하지 않고 다른 속성을 그룹화하는 데 사용되는 상위 항목입니다. 예제에서는 데이터베이스 그룹을 사용했는데, 이것은 구성 속성의 접두사이기도 합니다. 또한 서버 그룹을 사용하여 내부 클래스를 통해 생성하고 IP 및 포트 속성을 그룹화했습니다.
속성은 값을 지정할 수 있는 구성 항목입니다. 이러한 속성은 .properties
또는 .yml
파일로 설정되며 위 예제에서 본 기본값 및 유효성 검사와 같은 추가 정보를 가질 수 있습니다.
힌트는 사용자가 속성 값을 설정하는 데 도움이 되는 추가 정보입니다. 예를 들어, 속성에 허용되는 값 집합이 있으면 각 속성이 수행하는 작업에 대한 설명을 제공할 수 있습니다. IDE는 이러한 힌트에 대해 자동 경쟁 도움말을 제공할 것입니다.
구성 메타데이터의 각 구성 요소에는 구성 속성을 더 자세히 설명하기 위한 고유한 속성이 있습니다.