ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot 2.0 의 변화
    카테고리 없음 2023. 4. 23. 14:05
    오늘은 간단하게 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 지원, 애니메이션 배너등 여러가지 지원을 많이 해주고 있다. 더 많은 변화를 알고 싶다면 해당 문서를 참고하면 되겠다.

    댓글

Designed by Tistory.