Spring 5 특징

Spring Framework 5 특징에 대해서 살펴보자

Spring 5 특징

  • JDK 기준 업데이트

  • 핵심 프레임 워크 개정

  • 핵심 컨테이너 업데이트

  • Kotlin을 사용한 함수형 프로그래밍

  • 반응 형 프로그래밍 모델

  • 테스트 개선

  • 라이브러리 갱신

핵심 프레임워크 개정

Spring Framework 5.0 에서는 Java 8에 도입 된 새로운 기능을 활용하도록 수정되었다.

  • Java 8 리플렉션 향상을 기반으로 Spring Framework 5.0의 메서드 매개 변수에 효율적으로 액세스 가능

  • @Nullable 및 @NotNull 주석은 명시 적으로 nullable 인수를 표시하고 값을 반환

  • 표준 Commons Logging 대신 spring-jcl이라는 Commons Logging 브리지 모듈과 함께 기본 제공

핵심 컨테이너 업데이트

  • 클래스 경로 스캔의 대안으로 후보 컴포넌트 인덱스를 지원한다. 이 지원은 클래스 경로 스캐너에서 후보 구성 요소 식별 단계를 바로 가기 위해 추가 되었다.

  • 클래스 경로를 스캔하지 않고 색인에서 항목을 읽는 것은 클래스가 200 개 미만인 소규모 프로젝트의 경우 큰 차이가 없다. 그러나 대규모 프로젝트에는 상당한 영향이 있을 수 있다. 구성 요소 인덱스를 로드하는 것은 저렴하기 때문에 클래스 수가 증가함에 따라 일정하게 유지된다.

  • 컴포넌트 인덱스 스캔 기능은 의존성을 추가하면 바로 사용할 수 있다.

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-indexer</artifactId>
            <version>5.0.3.RELEASE</version>
            <optional>true</optional>
        </dependency>
    </dependencies>

코틀린을 사용한 함수형 프로그래밍

Spring Framework 5.0은 JetBrains Kotlin 언어를 지원한다. Kotlin은 함수형 프로그래밍 스타일을 지원하는 객체 지향 언어이다.

@Bean
fun apiRouter() = router {
    (accept(APPLICATION_JSON) and "/api").nest {
        "/book".nest {
            GET("/", bookHandler::findAll)
            GET("/{id}", bookHandler::findOne)
        }
        "/video".nest {
            GET("/", videoHandler::findAll)
            GET("/{genre}", videoHandler::findByGenre)
        }
    }
}

리액티브 프로그래밍 모델

  • 반응형 스택 웹 프레임워크를 지원한다.

  • 반응형이며 논 블록킹으로 동작하여 소수의 스레드로 확장할 수 있는 리벤트 루프 스타일 처리에 적합하다.

  • java 8 lambda를 사용한 함수형 스타일 라우팅 및 처리가 가능하다.

  • @Controller와 Spring MVC의 Annotation 기반으로 구현 가능하다.

  • Reactive Streams API는 공식적으로 Java 9의 일부이므로, Java 8에서는 의존성을 추가해야 한다.

// Option1. @Controller 기반
@RestController
public class BookController {
 
    @GetMapping("/book")
    Flux list() {
        return this.repository.findAll();
    }
 
    @GetMapping("/book/{id}")
    Mono findById(@PathVariable String id) {
        return this.repository.findOne(id);
    }
}

// Option2. Router/Handler 기반

RouterFunction personRoute =
    route(
        GET("/books/{id}").and(accept(APPLICATION_JSON)), handler::getBook)
        .andRoute(GET("/books").and(accept(APPLICATION_JSON)), handler::listBooks);

향상된 테스트

  • Junit 5 Jupiter 완벽지원

  • 리액티브 모델의 경우 Spring Webflux에 대한 테스트를 지원하기 위해 WebTestClient를 사용할 수 있다.

  • Spring TestContext Framework에서 병렬 테스트 실행을 지원한다.

// WebClient 사용한 테스트 케이스 
Mono book = WebClient.create("<http://localhost:8080>")
      .get()
      .url("/books/{id}", 1234)
      .accept(APPLICATION_JSON)
      .exchange(request)
      .then(response -> response.bodyToMono(Book.class));

라이브러리 갱신

갱신된 지원 패키지

  • Jackson 2.6 이상

  • EhCache 2.10+ / 3.0 GA

  • 최대 절전 모드 5.0 이상

  • JDBC 4.0 이상

  • XmlUnit 2.x 이상

  • OkHttp 3.x 이상

  • Netty 4.1 이상

지원 중단 패키

  • beans.factory.access

  • jdbc.support.nativejdbc

  • web.view.tiles2M

  • orm.hibernate3 및 orm.hibernate4

  • JasperReports

  • XMLBeans

  • JDO

  • Guava

참고

Last updated