오늘은 Spring boot 의 설정에 관하여 알아보자. 대단한건 아니고 Spring boot의 설정에 대해서 몇가지만 알아보자.
@SpringBootApplication
Spring boot의 없어서는 안될 어노테이션 설정이다. 물론 해당 어노테이션은 Spring boot가 처음 나올 때는 존재 하지 않은 어노테이션이다. 주석을 보니 1.2에 만들어졌다. 해당 어노테이션은
@EnableAutoConfiguration
과
@ComponentScan
두 가지를 메타 어노테이션으로 가지고 있다.
@SpringBootApplication
어노테이션은 속성이 4가지가 있는데 2개의 속성은
@EnableAutoConfiguration
어노테이션의 속성이고 나머지 2개는
@ComponentScan
어노테이션의 속성이다. 그 중에서
exclude
와
excludeName
속성에 대해서 알아보자.
@ComponentScan
의 속성은 spring boot에 추가된 것이 아니므로 생략한다. 그리고 잘 알 듯해서..
@EnableAutoConfiguration
어노테이션에는 2가지 속성이 있다.
exclude
와
excludeName
이라는 속성이다. 이것이 실제로 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에는
100
과
200
만 들어갈 수 있다는 힌트를 제공해준다. 하지만 이건 힌트일 뿐인지 다른 값을 넣어도 에러는 나지 않는다. 만약 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
하지만 위의 포스팅에서는 설명하지 않는 어노테이션이 있다. 그게 바로
AutoConfigureAfter
와
AutoConfigureBefore
어노테이션이다. 본인이 자동 설정 라이브러리를 만든다면 자주 사용될 어노테이션일 듯 싶다.
어노테이션 이름과 동일하게 설정의 특정한 순서를 정할 수 있다.
@AutoConfigureAfter
어노테이션 경우에는 설정한 클래스 다음에 선언한 해당 클래스를 설정하는 것이다.
@AutoConfigureBefore
경우에는 그 반대이다. 예를들어 보자.
@Configuration
@AutoConfigureBefore(JacksonAutoConfiguration.class)
public class SpringAutoConfiguration {
}
만약 위와 같은 설정 클래스가 있다고 가정하면
JacksonAutoConfiguration
클래스 전에
SpringAutoConfiguration
클래스가 설정된다. 반대로
@AutoConfigureAfter
경우에는
JacksonAutoConfiguration
클래스 후에
SpringAutoConfiguration
클래스가 설정된다.
오늘은 이렇게 Spring boot의 다양한 설정 방법에 대해서 알아봤다!