본문 바로가기

IT/SpringBoot

스프링 부트 #10. 부록 B : 구성 메타 데이터

반응형

부록 B : 구성 메타 데이터

Spring Boot jar에는 지원되는 모든 구성 속성에 대한 세부 정보를 제공하는 메타 데이터 파일이 포함되어 있습니다. 이 파일은 IDE 개발자가 사용자가 작업 application.properties하거나 application.yml파일을 작업 할 때 상황에 맞는 도움말과 "코드 완성"을 제공 할 수 있도록 설계되었습니다 .

메타 데이터 파일의 대부분은에 주석이 달린 모든 항목을 처리하여 컴파일 타임에 자동으로 생성됩니다 @ConfigurationProperties. 그러나 코너 사례 나 고급 사용 사례 에 대해서는 메타 데이터의 일부를 수동으로 작성할 수 있습니다.

10.B.1. 메타 데이터 형식

구성 메타 데이터 파일은의 jar 안에 있습니다 META-INF/spring-configuration-metadata.json. 다음 예제와 같이 "그룹"또는 "속성"으로 분류 된 항목과 "힌트"로 분류 된 추가 값 힌트와 함께 간단한 JSON 형식을 사용합니다.

{"groups": [
    {
        "name": "server",
        "type": "org.springframework.boot.autoconfigure.web.ServerProperties",
        "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    },
    {
        "name": "spring.jpa.hibernate",
        "type": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate",
        "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties",
        "sourceMethod": "getHibernate()"
    }
    ...
],"properties": [
    {
        "name": "server.port",
        "type": "java.lang.Integer",
        "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    },
    {
        "name": "server.address",
        "type": "java.net.InetAddress",
        "sourceType": "org.springframework.boot.autoconfigure.web.ServerProperties"
    },
    {
          "name": "spring.jpa.hibernate.ddl-auto",
          "type": "java.lang.String",
          "description": "DDL mode. This is actually a shortcut for the \"hibernate.hbm2ddl.auto\" property.",
          "sourceType": "org.springframework.boot.autoconfigure.orm.jpa.JpaProperties$Hibernate"
    }
    ...
],"hints": [
    {
        "name": "spring.jpa.hibernate.ddl-auto",
        "values": [
            {
                "value": "none",
                "description": "Disable DDL handling."
            },
            {
                "value": "validate",
                "description": "Validate the schema, make no changes to the database."
            },
            {
                "value": "update",
                "description": "Update the schema if necessary."
            },
            {
                "value": "create",
                "description": "Create the schema and destroy previous data."
            },
            {
                "value": "create-drop",
                "description": "Create and then destroy the schema at the end of the session."
            }
        ]
    }
]}

각“속성”은 사용자가 지정된 값으로 지정하는 구성 항목입니다. 예를 들어, server.portserver.address에 지정 될 수있는 application.properties다음과 같은 :

server.port=9090
server.address=127.0.0.1

"그룹"은 자체적으로 값을 지정하지 않고 대신 속성에 대한 컨텍스트 그룹을 제공하는 상위 레벨 항목입니다. 예를 들어 server.portserver.address속성은 server그룹의 일부입니다 .

  모든“재산”이“그룹”을 가질 필요는 없습니다. 일부 속성은 자체적으로 존재할 수 있습니다.

마지막으로 "힌트"는 사용자가 지정된 속성을 구성하는 데 도움이되는 추가 정보입니다. 개발자가 구성 될 때 예를 들어, spring.jpa.hibernate.ddl-auto속성을 도구는 몇 가지 자동 완성 도움을 제공하기 위해 힌트를 사용할 수 있습니다 none, validate, update, create, 및 create-drop값을.

그룹 속성

groups배열에 포함 된 JSON 객체 는 다음 표에 표시된 속성을 포함 할 수 있습니다.

이름 유형 목적

name

그룹의 전체 이름 이 속성은 필수입니다.

type

그룹 데이터 유형의 클래스 이름입니다. 예를 들어 그룹이로 주석이 달린 클래스를 기반으로하는 @ConfigurationProperties경우 속성에는 해당 클래스의 정규화 된 이름이 포함됩니다. @Bean메소드를 기반으로 한 경우 해당 메소드의 리턴 유형이됩니다. 유형을 알 수없는 경우 속성을 생략 할 수 있습니다.

description

사용자에게 표시 할 수있는 그룹에 대한 간단한 설명입니다. 설명이 없으면 생략 할 수 있습니다. 설명은 짧은 단락으로 작성하고 첫 번째 행은 간결한 요약을 제공하는 것이 좋습니다. 설명의 마지막 줄은 마침표 ( .)로 끝나야 합니다.

sourceType

이 그룹에 기여한 소스의 클래스 이름입니다. 예를 들어 그룹이로 @Bean주석 @ConfigurationProperties달린 메소드를 기반으로하는 경우이 속성 @Configuration에는 메소드가 포함 된 클래스 의 완전한 이름 이 포함됩니다. 소스 유형을 알 수없는 경우 속성을 생략 할 수 있습니다.

sourceMethod

이 그룹에 기여한 메소드의 전체 이름 (괄호 및 인수 유형 포함) (예 : @ConfigurationProperties어노테이션이있는 @Bean메소드 의 이름 ) 소스 방법을 모르는 경우 생략 할 수 있습니다.

속성 속성

properties배열에 포함 된 JSON 객체 는 다음 표에 설명 된 속성을 포함 할 수 있습니다.

이름 유형 목적

name

속성의 전체 이름 이름은 소문자로 구분 된 형식입니다 (예 server.address:). 이 속성은 필수입니다.

type

(예,의 속성의 데이터 유형의 전체 서명 java.lang.String뿐만 아니라 전체 제네릭 형식 (예) java.util.Map<java.lang.String,acme.MyEnum>). 이 속성을 사용하여 사용자가 입력 할 수있는 값 유형을 사용자에게 안내 할 수 있습니다. 일관성을 위해 기본 요소의 유형은 랩퍼 상대방을 사용하여 지정됩니다 (예 : booleanjava.lang.Boolean). 이 클래스는 String값이 바인드됨에 따라 변환되는 복합 유형일 수 있습니다 . 유형이 알려지지 않은 경우 생략 될 수 있습니다.

description

사용자에게 표시 할 수있는 속성에 대한 간단한 설명입니다. 설명이 없으면 생략 할 수 있습니다. 설명은 짧은 단락으로 작성하고 첫 번째 행은 간결한 요약을 제공하는 것이 좋습니다. 설명의 마지막 줄은 마침표 ( .)로 끝나야 합니다.

sourceType

이 속성을 제공 한 소스의 클래스 이름입니다. 예를 들어 속성이로 주석 @ConfigurationProperties달린 클래스의 속성 인 경우이 속성에는 해당 클래스의 정규화 된 이름이 포함됩니다. 소스 유형을 알 수없는 경우 생략 할 수 있습니다.

defaultValue

목적

특성이 지정되지 않은 경우 사용되는 기본값입니다. 속성 유형이 배열 인 경우 값 배열 일 수 있습니다. 기본값을 알 수없는 경우 생략 할 수 있습니다.

deprecation

천칭

특성이 더 이상 사용되지 않는지 지정하십시오. 해당 필드가 더 이상 사용되지 않거나 해당 정보를 알 수없는 경우 생략 할 수 있습니다. 다음 표는 deprecation속성 에 대한 자세한 정보를 제공 합니다.

deprecationproperties요소 속성에 포함 된 JSON 객체 는 다음 속성을 포함 할 수 있습니다.

이름 유형 목적

level

지원 중단 수준 warning(기본값) 또는 error입니다. 속성에 warning더 이상 사용되지 않는 수준 이있는 경우 여전히 환경에 바인딩되어 있어야합니다. 그러나 error사용 중단 레벨이있는 ​​경우 해당 속성은 더 이상 관리되지 않으며 바인딩되지 않습니다.

reason

속성이 더 이상 사용되지 않는 이유에 대한 간단한 설명입니다. 사용 가능한 이유가없는 경우 생략 할 수 있습니다. 설명은 짧은 단락으로 작성하고 첫 번째 행은 간결한 요약을 제공하는 것이 좋습니다. 설명의 마지막 줄은 마침표 ( .)로 끝나야 합니다.

replacement

사용되지 않는이 속성을 대체 하는 속성의 전체 이름입니다 . 이 속성을 대체하지 않으면 생략해도됩니다.

  Spring Boot 1.3 이전 deprecated에는 deprecation요소 대신 단일 부울 속성을 사용할 수 있습니다 . 이것은 더 이상 사용되지 않는 방식으로 지원되며 더 이상 사용해서는 안됩니다. 사용 가능한 이유와 교체가없는 경우 빈 deprecation개체를 설정해야합니다.

@DeprecatedConfigurationProperty더 이상 사용되지 않는 속성을 노출시키는 게터에 주석을 추가하여 코드에서 사용 중단을 선언적으로 지정할 수도 있습니다 . 예를 들어, app.acme.target속성이 혼란스럽고 이름이 바뀐 것으로 가정합니다 app.acme.name. 다음 예제는 해당 상황을 처리하는 방법을 보여줍니다.

@ConfigurationProperties("app.acme")
public class AcmeProperties {

    private String name;

    public String getName() { ... }

    public void setName(String name) { ... }

    @DeprecatedConfigurationProperty(replacement = "app.acme.name")
    @Deprecated
    public String getTarget() {
        return getName();
    }

    @Deprecated
    public void setTarget(String target) {
        setName(target);
    }
}
  를 설정할 수있는 방법이 없습니다 level. warning코드는 여전히 속성을 처리하므로 항상 가정됩니다.

앞의 코드는 더 이상 사용되지 않는 속성이 여전히 작동하는지 확인합니다 ( name장면 뒤의 속성으로 위임 ). 한때 getTargetsetTarget방법이 공개 API에서 제거 할 수 있습니다, 메타 데이터의 자동 중단 힌트도 사라집니다. 힌트를 유지하려면 error사용 중단 수준으로 수동 메타 데이터를 추가 하면 해당 속성에 대한 정보를 사용자에게 계속 알릴 수 있습니다. 그렇게하면 a replacement가 제공 될 때 특히 유용합니다 .

힌트 속성

hints배열에 포함 된 JSON 객체 는 다음 표에 표시된 속성을 포함 할 수 있습니다.

이름 유형 목적

name

이 힌트가 참조하는 속성의 전체 이름입니다. 이름은 소문자로 구분 된 형식 (예 :) spring.mvc.servlet.path입니다. 속성이지도 (예 :)를 참조하는 경우 system.contexts힌트 는지도 ( system.contexts.keys) 또는 지도 ( system.contexts.values)에 적용됩니다. 이 속성은 필수입니다.

values

ValueHint []

ValueHint객체가 정의한 유효한 값 목록 (다음 표에 설명) 각 항목은 값을 정의하며 설명이있을 수 있습니다.

providers

ValueProvider []

ValueProvider개체에 의해 정의 된 공급자 목록 (이 문서의 뒷부분에서 설명) 각 항목은 공급자 이름과 해당 매개 변수 (있는 경우)를 정의합니다.

valueshint요소 속성에 포함 된 JSON 객체 는 다음 표에 설명 된 속성을 포함 할 수 있습니다.

이름 유형 목적

value

목적

힌트가 참조하는 요소의 유효한 값입니다. 속성 유형이 배열이면 값 배열 일 수도 있습니다. 이 속성은 필수입니다.

description

사용자에게 표시 할 수있는 값에 대한 간단한 설명입니다. 설명이 없으면 생략 할 수 있습니다. 설명은 짧은 단락으로 작성하고 첫 번째 행은 간결한 요약을 제공하는 것이 좋습니다. 설명의 마지막 줄은 마침표 ( .)로 끝나야 합니다.

providershint요소 속성에 포함 된 JSON 객체 는 다음 표에 설명 된 속성을 포함 할 수 있습니다.

이름 유형 목적

name

힌트가 참조하는 요소에 대한 추가 컨텐츠 지원을 제공하는 데 사용할 제공자의 이름입니다.

parameters

JSON 객체

제공자가 지원하는 추가 매개 변수 (자세한 내용은 제공자의 문서를 확인하십시오).

반복 메타 데이터 항목

“속성”과“그룹”이름이 동일한 개체는 메타 데이터 파일 내에서 여러 번 나타날 수 있습니다. 예를 들어 두 개의 개별 클래스를 동일한 접두사에 바인딩 할 수 있으며 각 클래스에는 잠재적으로 겹치는 속성 이름이 있습니다. 메타 데이터에 동일한 이름이 여러 번 나타나는 것은 일반적이지 않지만 메타 데이터 소비자는 메타 데이터를 지원하도록주의를 기울여야합니다.

10.B.2. 수동 힌트 제공

사용자 환경을 개선하고 사용자가 지정된 속성을 구성하는 데 도움을주기 위해 다음과 같은 추가 메타 데이터를 제공 할 수 있습니다.

  • 속성의 잠재적 값 목록을 설명합니다.
  • 도구가 프로젝트 컨텍스트를 기반으로 잠재적 인 값 목록을 발견 할 수 있도록 잘 정의 된 의미를 특성에 첨부하도록 제공자를 연관시킵니다.
가치 힌트

name각 힌트 속성은 속성을 나타냅니다 name. 에서 이전 같이 초기 예를 들어 , 우리는 다섯 개 값을 제공 spring.jpa.hibernate.ddl-auto재산 : none, validate, update, create,와 create-drop. 각 값에는 설명이있을 수 있습니다.

속성이 유형 Map인 경우 키와 값 모두에 대한 힌트를 제공 할 수 있습니다 (단, 맵 자체는 아님). 특수 .keys.values접미사는 각각 키와 값을 참조해야합니다.

다음 예제와 같이 sample.contexts매직 String값을 정수에 매핑 한다고 가정합니다 .

@ConfigurationProperties("sample")
public class SampleProperties {

    private Map<String,Integer> contexts;
    // getters and setters
}

매직 값은 (이 예제에서) sample1sample2입니다. 키에 대한 추가 컨텐츠 지원을 제공하기 위해 모듈의 수동 메타 데이터에 다음 JSON을 추가 할 수 있습니다 .

{"hints": [
    {
        "name": "sample.contexts.keys",
        "values": [
            {
                "value": "sample1"
            },
            {
                "value": "sample2"
            }
        ]
    }
]}
  Enum대신이 두 값에 대해 를 사용하는 것이 좋습니다 . IDE에서 지원하는 경우, 이는 자동 완성에 대한 가장 효과적인 접근법입니다.
가치 제공자

공급자는 시맨틱을 속성에 첨부 할 수있는 강력한 방법입니다. 이 섹션에서는 자신의 힌트에 사용할 수있는 공식 공급자를 정의합니다. 그러나 선호하는 IDE는 이들 중 일부를 구현하거나 구현하지 않을 수 있습니다. 또한 결국 자체적으로 제공 할 수도 있습니다.

  이것은 새로운 기능이므로 IDE 공급 업체는 작동 방식을 따라야합니다. 입양 시간은 자연스럽게 다릅니다.

다음 표에는 지원되는 공급자 목록이 요약되어 있습니다.

이름 기술

any

추가 값을 제공 할 수 있습니다.

class-reference

프로젝트에서 사용 가능한 클래스를 자동 완성합니다. 일반적으로 target매개 변수 로 지정된 기본 클래스에 의해 제한됩니다 .

handle-as

필수 target매개 변수로 정의 된 유형에 의해 정의 된 것처럼 특성을 처리합니다 .

logger-name

유효한 로거 이름 및 로거 그룹을 자동 완성합니다 . 일반적으로 현재 프로젝트에서 사용 가능한 패키지 및 클래스 이름과 정의 된 그룹을 자동 완성 할 수 있습니다.

spring-bean-reference

현재 프로젝트에서 사용 가능한 Bean 이름을 자동 완성합니다. 일반적으로 target매개 변수 로 지정된 기본 클래스에 의해 제한됩니다 .

spring-profile-name

프로젝트에서 사용 가능한 Spring 프로파일 이름을 자동 완성합니다.

  특정 속성에 대해 하나의 공급자 만 활성화 할 수 있지만 모든 방법으로 속성 관리 할 수있는 경우 여러 공급자를 지정할 수 있습니다 . IDE는 처리 할 수있는 JSON 섹션의 첫 번째 공급자를 사용해야하므로 가장 강력한 공급자를 먼저 배치해야합니다. 지정된 속성에 대한 공급자가 지원되지 않으면 특별한 콘텐츠 지원도 제공되지 않습니다.
어떤

특수한 모든 제공자 값을 사용하면 추가 값을 제공 할 수 있습니다. 지원되는 경우 속성 유형을 기반으로 정기적 인 값 유효성 검사를 적용해야합니다.

이 공급자는 일반적으로 값 목록이 있고 추가 값이 여전히 유효한 것으로 간주되는 경우에 사용됩니다.

다음 예제 제공 onoff대한 자동 완성 값으로 system.state:

{"hints": [
    {
        "name": "system.state",
        "values": [
            {
                "value": "on"
            },
            {
                "value": "off"
            }
        ],
        "providers": [
            {
                "name": "any"
            }
        ]
    }
]}

앞의 예에서 다른 값도 허용됩니다.

클래스 레퍼런스

클래스 참조 프로젝트에서 사용할 수 제공자 자동 완료 클래스. 이 제공자는 다음 매개 변수를 지원합니다.

모수 유형 기본값 기술

target

String( Class)

none

선택한 값에 할당 할 수있는 정규화 된 클래스 이름입니다. 일반적으로 비 후보 클래스를 필터링하는 데 사용됩니다. 이 정보는 적절한 상한을 가진 클래스를 노출시켜 유형 자체에 의해 제공 될 수 있습니다.

concrete

boolean

진실

구체적인 클래스 만 유효한 후보로 간주할지 여부를 지정하십시오.

다음 메타 데이터 스 니펫은 사용할 클래스 이름을 server.servlet.jsp.class-name정의하는 표준 특성에 해당합니다 JspServlet.

{"hints": [
    {
        "name": "server.servlet.jsp.class-name",
        "providers": [
            {
                "name": "class-reference",
                "parameters": {
                    "target": "javax.servlet.http.HttpServlet"
                }
            }
        ]
    }
]}
처리

핸들로 제공 업체는보다 높은 수준의 유형 속성의 유형을 대체 할 수 있습니다. java.lang.String구성 클래스가 클래스 경로에 없을 수있는 클래스에 의존하지 않기를 원하기 때문에 일반적으로 속성에 유형 이있을 때 발생합니다 . 이 제공자는 다음 매개 변수를 지원합니다.

모수 유형 기본값 기술

target

String( Class)

none

특성에 대해 고려할 완전한 유형의 이름입니다. 이 매개 변수는 필수입니다.

다음과 같은 유형을 사용할 수 있습니다.

  • Any java.lang.Enum: 속성에 가능한 값을 나열합니다. EnumIDE가 값을 자동 완성하는 데 추가 힌트가 필요하지 않으므로 유형으로 속성을 정의하는 것이 좋습니다.
  • java.nio.charset.Charset: 값을 부호화 / 문자 세트의 자동 완성 기능을 지원한다 (예 UTF-8)
  • java.util.Locale: 로케일의 자동 완성 (예 en_US)
  • org.springframework.util.MimeType: 콘텐츠 형식 값의 자동 완성 기능 지원 (예 text/plain)
  • org.springframework.core.io.Resource: 파일 시스템 또는 클래스 경로에 파일을 참조 Spring의 자원 추상화의 자동 완성 기능 지원 (예 classpath:/sample.properties)
  여러 값을 제공 할 수있는 경우 IDE 유형에 대해 Collection또는 배열 유형을 사용 하십시오.

다음 메타 데이터 스 니펫은 spring.liquibase.change-log사용할 변경 로그의 경로를 정의하는 표준 특성에 해당합니다. 실제로 내부적으로 사용 org.springframework.core.io.Resource되지만 Liquibase API에 전달하려면 원래 문자열 값을 유지해야하므로 노출 될 수 없습니다.

{"hints": [
    {
        "name": "spring.liquibase.change-log",
        "providers": [
            {
                "name": "handle-as",
                "parameters": {
                    "target": "org.springframework.core.io.Resource"
                }
            }
        ]
    }
]}
로거 이름

로거 이름의 제공자 유효한 로거 이름과 자동 - 완료 로거 그룹을 . 일반적으로 현재 프로젝트에서 사용 가능한 패키지 및 클래스 이름은 자동 완성 될 수 있습니다. 그룹이 사용 가능하고 (기본값) 구성에서 사용자 정의 로거 그룹이 식별되면 자동 완성이 제공되어야합니다. 특정 프레임 워크에는 지원 가능한 추가 매직 로거 이름이있을 수 있습니다.

이 제공자는 다음 매개 변수를 지원합니다.

모수 유형 기본값 기술

group

boolean

true

알려진 그룹을 고려해야하는지 여부를 지정하십시오.

로거 이름은 임의의 이름이 될 수 있으므로이 공급자는 모든 값을 허용해야하지만 프로젝트의 클래스 경로에서 사용할 수없는 유효한 패키지 및 클래스 이름을 강조 표시 할 수 있습니다.

다음 메타 데이터 스 니펫은 표준 logging.level속성에 해당 합니다. 키는 로거 이름 이며 값은 표준 로그 수준 또는 모든 사용자 지정 수준에 해당합니다. Spring Boot는 기본적으로 몇 개의 로거 그룹을 정의함에 따라 전용 값 힌트가 추가되었습니다.

{"hints": [
    {
        "name": "logging.level.keys",
        "values": [
            {
                "value": "root",
                "description": "Root logger used to assign the default logging level."
            },
            {
                "value": "sql",
                "description": "SQL logging group including Hibernate SQL logger."
            },
            {
                "value": "web",
                "description": "Web logging group including codecs."
            }
        ],
        "providers": [
            {
                "name": "logger-name"
            }
        ]
    },
    {
        "name": "logging.level.values",
        "values": [
            {
                "value": "trace"
            },
            {
                "value": "debug"
            },
            {
                "value": "info"
            },
            {
                "value": "warn"
            },
            {
                "value": "error"
            },
            {
                "value": "fatal"
            },
            {
                "value": "off"
            }

        ],
        "providers": [
            {
                "name": "any"
            }
        ]
    }
]}
스프링 빈 참조

스프링 빈 참조 제공자는 현재 프로젝트의 구성에 정의 된 콩을 자동-완료됩니다. 이 제공자는 다음 매개 변수를 지원합니다.

모수 유형 기본값 기술

target

String( Class)

none

후보에게 지정할 수있는 Bean 클래스의 완전한 이름입니다. 일반적으로 후보가 아닌 Bean을 필터링하는 데 사용됩니다.

다음 메타 데이터 스 니펫은 사용할 Bean spring.jmx.server의 이름을 정의하는 표준 특성에 해당합니다 MBeanServer.

{"hints": [
    {
        "name": "spring.jmx.server",
        "providers": [
            {
                "name": "spring-bean-reference",
                "parameters": {
                    "target": "javax.management.MBeanServer"
                }
            }
        ]
    }
]}
  바인더가 메타 데이터를 인식하지 못합니다. 해당 힌트를 제공하는 경우 여전히를 사용하여 Bean 이름을 실제 Bean 참조로 변환해야합니다 ApplicationContext.
스프링 프로파일 이름

스프링 프로파일 이름 제공자 자동 완료 현재 프로젝트의 구성에 정의 된 봄 프로파일.

다음 메타 데이터 스 니펫 spring.profiles.active은 사용할 스프링 프로파일의 이름을 정의 하는 표준 특성에 해당합니다.

{"hints": [
    {
        "name": "spring.profiles.active",
        "providers": [
            {
                "name": "spring-profile-name"
            }
        ]
    }
]}

10.B.3. 어노테이션 프로세서를 사용하여 고유 한 메타 데이터 생성

jar @ConfigurationProperties를 사용하여 주석이 달린 항목에서 자체 구성 메타 데이터 파일을 쉽게 생성 할 수 있습니다 spring-boot-configuration-processor. 이 jar에는 프로젝트가 컴파일 될 때 호출되는 Java 주석 프로세서가 포함되어 있습니다. 프로세서를 사용하려면에 대한 종속성을 포함하십시오 spring-boot-configuration-processor.

Maven을 사용하면 다음 예제와 같이 종속성을 선택적으로 선언해야합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

Gradle 4.5 및 이전 버전에서는 compileOnly다음 예제와 같이 구성 에서 종속성을 선언해야합니다 .

dependencies {
    compileOnly "org.springframework.boot:spring-boot-configuration-processor"
}

Gradle 4.6 이상 annotationProcessor에서는 다음 예제와 같이 구성 에서 종속성을 선언해야합니다 .

dependencies {
    annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
}

additional-spring-configuration-metadata.json파일을 사용하는 경우 다음 예제와 같이 작업 compileJavaprocessResources작업 에 의존하도록 구성되어야합니다 .

compileJava.inputs.files(processResources)

이러한 종속성으로 인해 컴파일 중에 주석 프로세서가 실행될 때 추가 메타 데이터를 사용할 수 있습니다.

프로세서는 주석이 달린 클래스와 메소드를 모두 선택합니다 @ConfigurationProperties. 구성 클래스 내의 필드 값에 대한 Javadoc은 description속성 을 채우는 데 사용됩니다 .

  @ConfigurationPropertiesJSON에 추가되기 전에 처리되지 않으므로 Javadoc 필드 와 함께 간단한 텍스트 만 사용해야합니다 .

클래스에 하나 이상의 매개 변수가있는 단일 생성자가 있으면 생성자 매개 변수 당 하나의 속성이 만들어집니다. 그렇지 않으면, 컬렉션 유형에 대한 특별한 처리 기능이있는 표준 게터 및 세터가 존재하여 속성이 검색됩니다 (게터 만있는 경우에도 감지 됨).

주석 프로세서는 또한의 사용 지원 @Data, @Getter그리고 @Setter롬복 주석을.

주석 처리기가 Enums 및 Collectionss 기본값을 자동 감지 할 수 없습니다 . 상기의 경우 Collection또는 Enum속성이 비어 있지 않은 기본값이, 수동 메타 데이터가 제공되어야한다.

다음 클래스를 고려하십시오.

@ConfigurationProperties(prefix = "acme.messaging")
public class MessagingProperties {

    private List<String> addresses = new ArrayList<>(Arrays.asList("a", "b"));

    private ContainerType containerType = ContainerType.SIMPLE;

    // ... getter and setters

    public enum ContainerType {

        SIMPLE,
        DIRECT

    }

}

위 클래스의 속성에 대한 기본값을 문서화하기 위해 다음 내용을 모듈의 수동 메타 데이터에 추가 할 수 있습니다 .

{"properties": [
    {
        "name": "acme.messaging.addresses",
        "defaultValue": ["a", "b"]
    },
    {
        "name": "acme.messaging.container-type",
        "defaultValue": "simple"
    }
]}

name수동 메타 데이터가있는 추가 필드를 문서화하려면 속성 중 하나만 필요합니다.

 

프로젝트에서 AspectJ를 사용하는 경우 주석 프로세서가 한 번만 실행되도록해야합니다. 이를 수행하는 몇 가지 방법이 있습니다. Maven을 사용하면 maven-apt-plugin명시 적으로 구성 하고 주석 프로세서에만 종속성을 추가 할 수 있습니다 . AspectJ 플러그인이 maven-compiler-plugin다음과 같이 구성 에서 모든 처리를 실행하고 주석 처리를 비활성화하도록 할 수도 있습니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <proc>none</proc>
    </configuration>
</plugin>
중첩 속성

주석 처리기는 내부 클래스를 중첩 속성으로 자동 간주합니다. 다음 클래스를 고려하십시오.

@ConfigurationProperties(prefix="server")
public class ServerProperties {

    private String name;

    private Host host;

    // ... getter and setters

    public static class Host {

        private String ip;

        private int port;

        // ... getter and setters

    }

}

앞의 예는 정보에 대한 메타 데이터 생성 server.name, server.host.ipserver.host.port특성. @NestedConfigurationProperty필드 주석을 사용하여 내부 (비 내부) 클래스가 중첩 된 것처럼 처리되어야 함을 나타낼 수 있습니다.

  이러한 유형은 자동으로 식별되고 각각에 대해 단일 메타 데이터 속성이 생성되므로 컬렉션 및 맵에는 영향을 미치지 않습니다.
추가 메타 데이터 추가

Spring Boot의 구성 파일 처리는 매우 유연하며 @ConfigurationProperties빈에 바인딩되지 않은 속성이 존재할 수 있습니다 . 기존 키의 일부 속성을 조정해야 할 수도 있습니다. 이러한 경우를 지원하고 사용자 정의 "힌트"를 제공하기 위해 주석 처리기는 항목을 META-INF/additional-spring-configuration-metadata.json기본 메타 데이터 파일로 자동 병합 합니다.

자동으로 감지 된 특성을 참조하면, 설명, 기본값 및 더 이상 사용되지 않는 정보가 지정된 경우 대체됩니다. 수동 속성 선언이 현재 모듈에서 식별되지 않으면 새 속성으로 추가됩니다.

additional-spring-configuration-metadata.json파일 의 형식은 일반 형식과 정확히 동일합니다 spring-configuration-metadata.json. 추가 특성 파일은 선택 사항입니다. 추가 속성이 없으면 파일을 추가하지 마십시오.

 
 

Spring Boot Reference Documentation

Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, Christian Dupuis, Sébastien Deleuze, Michael Simons, Vedran Pavić, Jay Bryant, Madhura Bhave, Eddú Meléndez, Scott Frederick

2.3.1.RELEASE

Copyright © 2012-2020

Copies of this document may be made for your own use and for distribution to others, provided that you do not charge any fee for such copies and further provided that each copy contains this Copyright Notice, whether distributed in print or electronically.

반응형