ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot configuration
    카테고리 없음 2023. 4. 22. 14:39
    오늘은 Spring boot 의 설정에 관하여 알아보자. 대단한건 아니고 Spring boot의 설정에 대해서 몇가지만 알아보자.

    @SpringBootApplication

    Spring boot의 없어서는 안될 어노테이션 설정이다. 물론 해당 어노테이션은 Spring boot가 처음 나올 때는 존재 하지 않은 어노테이션이다. 주석을 보니 1.2에 만들어졌다. 해당 어노테이션은 @EnableAutoConfiguration@ComponentScan 두 가지를 메타 어노테이션으로 가지고 있다. @SpringBootApplication 어노테이션은 속성이 4가지가 있는데 2개의 속성은 @EnableAutoConfiguration 어노테이션의 속성이고 나머지 2개는 @ComponentScan어노테이션의 속성이다. 그 중에서 excludeexcludeName 속성에 대해서 알아보자. @ComponentScan의 속성은 spring boot에 추가된 것이 아니므로 생략한다. 그리고 잘 알 듯해서.. @EnableAutoConfiguration 어노테이션에는 2가지 속성이 있다. excludeexcludeName이라는 속성이다. 이것이 실제로 Spring boot의 핵심적인 어노테이션이며 자동 설정을 담당한다. 만약 자동 설정을 하고 싶지 않는 클래스가 있다면 해당 속성을 이용하여 자동설정에서 제외 시킬 수 있다.
    //...
    public @interface EnableAutoConfiguration {
      Class<?>[] exclude() default {};
      String[] excludeName() default {};
    //...
    }
    
    위는 @EnableAutoConfiguration 어노테이션의 일부분이다. exclude는 클래스 형태이며 excludeName은 String 형태이다. 만약 JacksonAutoConfiguration 클래스의 자동설정을 제외 시키고 싶다면 다음과 같이 하면 된다.
    @EnableAutoConfiguration(exclude = JacksonAutoConfiguration.class)
    
    위 의 방법은 exclude를 이용해서 JacksonAutoConfiguration 설정을 제외 시킨 방법이다.
    @EnableAutoConfiguration(excludeName = "org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration")
    
    다음은 excludeName을 이용해서 JacksonAutoConfiguration 설정을 제외 시킨 방법이다. 근데 필자는 거의 사용하지 않는 속성이다. 아직까지는..

    ConfigurationProperties

    두 번째는 @ConfigurationProperties 어노테이션과 관련된 설정이다. @ConfigurationProperties 속성에 대해서 알아볼 건 아니고 관련된 설정방법들을 알아볼 예정이다.
    @ConfigurationProperties("foo")
    public class FooProperties {
      private String name = "100";
      //getter setter ...
    }
    
    만약 위와 같은 프로퍼티가 있다고 가정하자. 위와 같이해서 컴파일을 해보면 foo라는 prefix로 json 파일이 자동으로 만들어진다. 물론 configuration-processor를 디펜더스 받아야 한다. name 이라는 프로퍼티는 100이라는 기본값을 갖고 있다. application.properties 파일에 foo.name이라는 속성을 입력할 수 있다. IDEA 경우에는 자동완성도 해준다. 기본적으로는 위와 같이 하면 자동으로 만들어 주지만 약간의 설정을 추가할 수 있다. /resources/META-INF 경로 아래에 additional-spring-configuration-metadata.json 파일을 만들어 추가하여 속성을 정의해주면 좀 더 나은 프로퍼티를 설정할 수 있다.
    {
      "properties": [
        {
          "name": "foo.name",
          "type": "java.lang.String",
          "description": "Description for foo.name.",
          "defaultValue": "100"
        }
      ],
      "hints": [
        {
          "name": "foo.name",
          "values": [
            {
              "value": "100",
              "description": "blabla 100"
            },
            {
              "value": "200",
              "description": "blabla 200"
            }
          ]
        }
      ]
    }
    
    위와 같이 설정해준다면 foo.name에는 100200만 들어갈 수 있다는 힌트를 제공해준다. 하지만 이건 힌트일 뿐인지 다른 값을 넣어도 에러는 나지 않는다. 만약 IDEA를 사용한다면(이클립스와 넷빈즈는 테스트를 해보지 않았음) 힌트 자동완성도 제공해준다. 그리고 다른 값을 넣는다면 빨간색으로 문자색이 바뀐다. 더 많은 속성은 해당 문서를 참고 하면 되겠다. 만약 본인이 라이브러리를 만든다면 유용한 어노테이션이다. 뭐 라이브러리가 아니더라도 큰 프로젝트에서는 유용한 어노테이션일 듯하다. java의 @Deprecated 어노테이션과 동일하다. @DeprecatedConfigurationProperty 이라는 어노테이션인데 추후에 삭제 대상이 될 프로퍼티에 선언해주면 된다.
    @ConfigurationProperties("foo")
    public class FooProperties {
      private String name = "100";
      private String firstName = "100";
    
      @DeprecatedConfigurationProperty(reason = "just" , replacement = "foo.firstName")
      public String getName() {
        return name;
      }
      // getter setter ...
    }
    
    위와 같이 @DeprecatedConfigurationProperty 어노테이션을 getter 혹은 setter에 선언해주면 되고 replacement 속성은 해당 바뀐 대상의 속성을 넣어주면 된다. 만약 그런다면 IDEA에서는 손쉽게 바꿀 수도 있다. properties에는 여러가지 방법으로 키를 선언할 수 있는데 canonical, camel case, underscore, upper case 등 여러가지 방법으로 선언할 수 있다. 예를 다음과 같다.
    foo.FIRST-NAME=800
    foo.firstName=100
    foo.first-name=400
    foo.first_name=900
    

    AutoConfigureAfter, AutoConfigureBefore

    필자가 예전에 Spring boot의 자동설정에 대해서 잠깐 설명한 것이 있었다. spring-boot-autoconfiguration 하지만 위의 포스팅에서는 설명하지 않는 어노테이션이 있다. 그게 바로 AutoConfigureAfterAutoConfigureBefore 어노테이션이다. 본인이 자동 설정 라이브러리를 만든다면 자주 사용될 어노테이션일 듯 싶다. 어노테이션 이름과 동일하게 설정의 특정한 순서를 정할 수 있다. @AutoConfigureAfter 어노테이션 경우에는 설정한 클래스 다음에 선언한 해당 클래스를 설정하는 것이다. @AutoConfigureBefore 경우에는 그 반대이다. 예를들어 보자.
    @Configuration
    @AutoConfigureBefore(JacksonAutoConfiguration.class)
    public class SpringAutoConfiguration {
    }
    
    
    만약 위와 같은 설정 클래스가 있다고 가정하면 JacksonAutoConfiguration 클래스 전에 SpringAutoConfiguration 클래스가 설정된다. 반대로 @AutoConfigureAfter 경우에는 JacksonAutoConfiguration 클래스 후에 SpringAutoConfiguration 클래스가 설정된다. 오늘은 이렇게 Spring boot의 다양한 설정 방법에 대해서 알아봤다!

    댓글

Designed by Tistory.