오늘은 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의 다양한 설정 방법에 대해서 알아봤다!