Spring Boot Configuration Processor 란?
- Configuration 메타데이터를 처리하는데 도움을 주기 위한 도구이다.
- 프로퍼티의 속성을 수동으로 추적하기 까다롭고 오류가 발생하기 쉬운 대규모 프로젝트에 용이하다.
- 메타데이터 생성을 자동화함으로써 더 나은 코딩 관행을 장려하고 개발자 생산성을 향상시킨다.
사용하는 이유
- 우리는 보통 프로퍼티의 값을 설정할 때, 어떤 기능을 하는지, 기본 값이 있는지, 더이상 사용되지 않는지, 속성이 존재하는지조차 모르는 경우가 많다.
- Spring Boot Configuration Processor 를 통해 이러한 불편함을 해결할 수 있다.
IDE 의 자동 완성 (Auto-Completion in IDEs)
- IDE 는 메타데이터를 제공받음으로써, 개발자에게 자동 완성 및 유효성 검사 기능을 제공할 수 있다.
- 구성정보 옵션이 설명, 유형 및 기본 값과 함께 IDE 에 표기되므로 개발자가 애플리케이션의 구성 옵션을 훨씬 쉽게 이해하고 사용 가능하다.
문서 생성 (Documentation Generation)
- 구성정보 프로퍼티에 대한 문서를 생성할 수 있다.
- 속성, 설명, 기본 값 등이 자동으로 문서화되어 코드의 유지보수 및 투명성을 높일 수 있다.
유효성 검사 및 타입 변환 (Validation and Type Conversion)
- 유효성 검사 규칙을 적용하고 사용자 지정 구성 유형에 대한 유형 변환을 처리할 수 있다.
사용 방법
의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
Configuration Properties 정의
@ConfigurationProperties
애노테이션을 꼭 사용해주어야 한다.- configuration processor 는 이 애노테이션이 붙은 클래스 및 메서드를 검색하여 configuration 메타데이터를 생성한다.
@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
}
database.username=username
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());
}
}
프로젝트 컴파일 후 메타데이터 결과 보기
- 프로젝트를 빌드하면, 프로세서가 json 파일을 생성한다.
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": []
}
(옵셔널) 이외 메타데이터 추가하기
- JavaDoc 커멘트를 추가하고, 기본 값, 최소 값, 최대 값 등을 설정할 수 있다.
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
}
{
"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",
"description": "The IP of the database server",
"sourceType": "com.example.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.example.autoconfiguration.annotationprocessor.DatabaseProperties$Server",
"defaultValue": 443
},
{
"name": "database.username",
"type": "java.lang.String",
"sourceType": "com.example.autoconfiguration.annotationprocessor.DatabaseProperties"
}
],
"hints": []
}
힌트는 지금은 사용되지 않았지만, 사용할 수 있는 값의 집합 등으로 사용자가 어떤 값을 사용할지에 대한 힌트를 제공할 수 있다.
IDE 사용하기
- 일단 셋업이 된 이후에는 개발자는 자동완성, 검증, 문서화 기능 등의 혜택을 볼 수 있다.
레퍼런스
반응형
'프레임워크 > 스프링 프레임워크' 카테고리의 다른 글
@TestConfiguration 애노테이션이란? (0) | 2023.08.03 |
---|---|
@DataJpaTest 애노테이션이란? (0) | 2023.08.03 |
@EnableGlobalMethodSecurity 애노테이션이란? (0) | 2023.07.31 |
@EnableWebSecurity 애노테이션이란? (0) | 2023.07.31 |
@EnableWebMvc 애노테이션이란? (0) | 2023.07.31 |