오늘은 간단하게 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 지원, 애니메이션 배너등 여러가지 지원을 많이 해주고 있다.

더 많은 변화를 알고 싶다면 해당 문서를 참고하면 되겠다.