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