오늘은 간단하게 Spring boot 2.0 의 변화에 대해서 알아보도록 하자. 물론 다 알아볼건 아니고 필자가 필요로하거나 자주 사용할만 것들, 또는 예전에 알아봤던 내용은 살펴보지 않을 것이니 이런게 있구나 정도만 알고 넘어가고 이후 공식문서등을 참고하면 더 좋을 것 같다.
@ConditionalOnBean
@ConditionalOnBean
어노테이션이 AND 조건으로 변경 되었다. 2.0 이전에는 OR 조건이였지만 지금 현재는 AND 조건으로 모두조건이 만족해야 설정된다.
public class ConditionalBean1 {
}
public class ConditionalBean2 {
}
public class Simple {
}
@ConditionalOnBean({ConditionalBean1.class, ConditionalBean2.class})
@Configuration
public class Config {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Bean
Simple simple() {
logger.info("simple test");
return new Simple();
}
}
대략 이런 코드가 있다고 가정하자. 위 코드는 일단
simple test
란 로그가 찍히지 않는다. 그 이유는 뭐 둘다 빈으로 등록 되지 않았기 때문이다.
@Configuration
public class ConditionalBean1 {
}
ConditionalBean1 클래스만 빈으로 등록해보자. 이 때 2.0 이전 버전에서는 로그가 출력 되지만 2.0 부터는 로그가 출력 되지 않는다. 만약 로그가 출력 되게 원한다면 아래와 같이 모두 bean으로 등록 시켜야 된다.
@Configuration
public class ConditionalBean1 {
}
@Configuration
public class ConditionalBean2 {
}
-parameters
기본적으로 spring boot 2.0의
spring-boot-starter-parent
에는 -parameters 옵션이 추가 되었다.
@RestController
public class TestController {
@GetMapping("/")
public String hello() throws NoSuchMethodException {
Method name = this.getClass().getMethod("name", String.class);
return name.getParameters()[0].getName();
}
public String name(String id) {
return "wonwoo";
}
}
위와 같은 코드를 작성할 경우 (파라미터의 변수명을 가져올 때) 굳이 추가적으로 maven에 작성할 필요가 없다.
mvn install
java -jar target/blabla.jar
1.5 버전에서는
arg0
로 찍히지만 2.0 에서는
id
가 출력 된다.
Spring Data Web
나쁘지 않은 설정이 추가 되었다. Spring Data Web의 기본 페이지 사이즈, 파라미터 명, 첫페이지 인덱스 번호 등을 설정하라면
WebMvcConfigurerAdapter
를 상속받은 후에
PageableHandlerMethodArgumentResolver
클래스를 셋팅해줘야 했다. 하지만 이제는 properties 로 가능해졌다. 나쁘지 않다.
spring.data.web.pageable.default-page-size
spring.data.web.pageable.one-indexed-parameters=
spring.data.web.pageable.page-parameter=
spring.data.web.pageable.size-parameter=
spring.data.web.pageable.max-page-size=
spring.data.web.pageable.prefix=
spring.data.web.pageable.qualifier-delimiter=
관련설정은
SpringDataWebAutoConfiguration
클래스를 참고하면 되겠다.
DurationUnit
바인딩 할 때 유용한 어노테이션이 추가되었다. 유용한지는 나중에 알겠지.. java 1.8에 추가된
Duration
을
@ConfigurationProperties
에 작성할 수 있다. 아마도 2.0 이전에는 사용할 수 없었다. 하지만 2.0 부터는
Duration
을 사용할 수 있다.
@ConfigurationProperties("foo")
public class FooProperties {
private Duration period;
public void setPeriod(Duration period) {
this.period = period;
}
public Duration getPeriod() {
return period;
}
}
작성 후에 application.properties에 다음과 같이 작성 가능하다.
foo.period=10s
좀 더 나은 방법으로는
@DurationUnit
어노테이션을 사용해서 기본시간대를 지정할 수 있다.
//..
@DurationUnit(ChronoUnit.SECONDS)
private Duration period;
//..
이후 application.properties에는 10이라는 숫자만 써도 된다.
foo.period=10
http2 지원
Tomcat, Undertow 및 Jetty에서 http2를 지원한다. 하지만 몇가지 주의사항이 있다. 내 기억이 맞다면말이다. java8에서는 기본적으로 http2를 지원하지 않았다. 그래서 추가적인 모듈을 넣어야 한다고 했던 기억이 나고 java9부터는 기본적으로 지원한다.
또한 https를 사용해야지만 http2를 지원한다. spring boot의 기본설정에는.. 물론 커스텀하게 구현해도 될 것 같긴 한데.. 해보진 않았다.
위 그림을 보면 h2라고 설정 보일 것이다.
Property
env
endpoint를 보면 origin 이라는 필드가 추가 되었다. 해당하는 프로퍼티의 파일 명과 라인번호 및 해당 컬럼수를 의미 한다.
{
"name": "applicationConfig: [classpath:/application.properties]",
"properties": {
"management.endpoints.web.exposure.include": {
"value": "*",
"origin": "class path resource [application.properties]:1:43"
},
"foo.period": {
"value": "10",
"origin": "class path resource [application.properties]:3:12"
}
}
}
사용할 때가 있긴 한가? 흠흠..
이 외에도 엄청나게 많은 변화가 있지만 다 알아볼 수 는 없어 여기까지만 작성하겠다. 예를들어 Kotlin이 폭넓게 지원이 되고 있으며 Reactive Spring Security, Reactive Spring Data, Actuator의 변화 및 추가, Micrometer, 기타 Data 지원, 애니메이션 배너등 여러가지 지원을 많이 해주고 있다.
더 많은 변화를 알고 싶다면 해당 문서를 참고하면 되겠다.