개발자는 사용하는 언어, 라이브러리, 프레임워크 등의

버전을 중요하게 생각 해야한다고 알고 있었다

그런데 그 버전의 중요성을 피부로 느낀적이 없었다

그러다 ci/cd 환경 구축중 버전 이슈도 겪어보고

실무에 와서 다양한 버전 환경에서 개발을 하다보니

왜 중요한지 조금은 알것같았다

 

다른건 버전을 신경썼던거 같은데

스프링은 다른거에 비해 신경을 안썼던거 같다

그래서 이번 기회에 버전별 특징을 정리해 보고자 한다

 

1. Spring 2.x

  • XML 네임스페이스와 AspectJ를 지원한다.

 

2. Spring 3.x

2016년 12월 31일부로 개발 및 지원이 종료됐다.
  • Spring 3.0부터 Java 5가 지원된다. 기존에 유지하던 하위호환성에 Generic이나 가변인자 등과 같은 개선사항이 추가된다.
    • 이로 인해 BeanFactory 등 핵심 API가 업데이트 되었다.
  • 전체 프레임워크를 하나의 spring.jar 파일로 제공하던 부분을 여러개의 jar 파일로 나누어 제공한다.
    • e.g. spring-core, spring-web 
  • SPEL(Spring Expression Language)가 도입되었다.
    • XML 및 Annotation 기반 Bean 정의에서 사용할 수 있게 되었고, 외부 프로퍼티 파일이나 환경 변수에서 값을 가져오기 쉬워졌다.
  • REST API에 대한 지원이 추가되었다.
    • 서버로서는 기존 MVC Framework 레벨에서 Annotation 기반 확장이 추가되었다.
    • 클리이언트로서는 RestTemplate을 추가해 지원한다.
  • OXM(Object XML Mapping) 기능이 추가되어 설정을 XML 형태로 할 수 있게 지원한다.
  • @Configuration,@Bean 등의 Java Annotation을 이용해서 직접 메타 데이터를 설정하고, DI 지원이 가능하다.
  • H2가 지원되었다.
  • @Async 주석을 통하여 비동기 메서드 호출을 지원했다.

 

3. Spring 4.x

2020년 12월 31일부로 개발 및 지원이 종료되었다.
  • 기존에 사용하지 않지만 호환성을 위해 남겨져있던 Deprecated Package들이 제거되었다.
  • Hibernate 3.6 이상, EhChche 2.1 이상, Groovy 1.8 이상, Joda-Time 2.0 이상 등 새로운 Dependency들에 대해 지원한다.
  • Java 6, 7, 8의 고유 기능들에 대해 지원한다.
    • 람다식, Optional, Callback Interface 등의 기능을 Spring Framework 레벨에서 사용할 수 있다.
  • Java EE 6,7에 대해 고려되어 있다. JPA 2.0과 Servlet 3.0에 대한 지원이 포함되어 있다는 뜻이다.
  • Groovy DSL 이용한 외부 Bean 설정이 가능하다.
  • Core 컨테이너들의 기능 지원이 확대되었다.
    • DI 시에 Generic이 지원된다.
    • Repository가 쉽게 Inject될 수 있으며, 각종 Metadata Annotation들을 이용한 Custom Annotation 작성이 가능하다.
      • Bean 관리가 용이해졌다.
        • @Lazy를 이용한 Lazy Injection이나 @Order를 통한 Ordered Interface, @Profile을 통한 프로필 버전 관리가 쉬워졌다.
  • Web을 개발하기 위한 도구들이 생겼다.
    • @RestController 사용이 가능하다.
    • Web Socket이나 SockJS, STOMP 등의 라이브러리 및 프로토콜을 같이 지원한다.
      • Web Socket : 커넥션을 연결한 상태에서 양방향 통신을 할 수 있는 TCP/IP 기반의 프로토콜
      • SockJS : WebSocket을 지원하지 않는 브라우저에서도 WebSocket과 같은 통신 방법을 제공하기 위한 라이브러리
      • STOMP : WebSocket을 이용한 pub-sub 기반의 메시징 프로토콜
  • Test 환경이 개선되었다.
    • @ContextConfiguration, @WebAppConfiguration, @ContextHierarchy, @ActiveProfiles과 같은 spring-text에 있는 Annotation들을 meta-annotation으로 사용할 수 있게 되었다.
    • Framework 레벨에서 Mock을 위한 ServletContext를 별도로 지원한다.

 

4. Spring 4.1

  • JMS(Java Message Service)
    • JavaConfig로 설정할 수 있는 부분이 증가했다.
    • @JmsListener로 listen를 간편하게 추가 가능하다.
    • Spring Messaging abstraction이 JMS를 지원하기 시작했다.
  • Chching 기능이 향상되었다.
    • CacheResolver를 사용해 캐시를 런타입에 결정하는 것이 가능해졌다.
    • @CacheConfig를 이용해 annotation 레벨에서의 공통 세팅이 활성화되었다.
    • cache resolver, cache manager, key generator 등의 커스터마이징이 가능하다.
  • @RequestParam, @RequestHeader, @MatrixVariable에 Optional 사용이 가능하다.
  • ResponseEntity가 builder 형식의 API를 제공한다.
    • e.g. ResponseEntity.ok()

 

5. Spring 4.2

  • @Bean이 default method를 감지한다.
  • @Import로 @Configuration class나 @Component class를 임포트할 수 있다.
  • @Order로 @Configuration class가 로딩되는 순서 설정이 가능하다.
  • annotation attribute를 위한 @AliasFor를 제공한다.

 

6. Spring 4.3

  • Java 8 기능을 완전히 지원하기 시작했다.
  • Starter Pack이 생겨서 POM 설정을 도와준다.
  • Groovy를 통한 Bean 설정이 가능하다.
  • 생성자 주입 시 @Autowired 키워드를 생략할 수 있다.
  • @Configuration에서 생성자 주입을 지원한다.
  • @Scheduled, @Schedules를 meta-annotation으로 사용 가능하다.
  • @Cacheable의 sync 속성을 통한 동시성을 지원한다.
  • @RequestMapping의 다양한 형태를 제공한다.
    - @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping
  • class level에서 @ResponseStatus를 지원한다.
  • @PathVariable Optional 사용이 가능하다.
  • MvcExceptionHandler에 지속적인 혹은 커스텀 에러 처리가 가능하다.

 

7. Spring 5.x

  • Java 8 버전이 기본으로 설정되고, Java EE 7 API 이상 사용이 가능하다.
    • JDK 9와도 호환이 가능하다.
  • Java 8이 기본이 되면서 코어 스프링 인터페이스들이 디폴터 메서드 기반의 선택적 정의를 제공한다.
  • @Nullable, @NotNull annotation을 사용해서 명시적으로 nullable 인자를 표시하고 값을 얻어올 수 있다. 컴파일 타임에 널값을 다룰 수 있게 되었다.
  • spring-jcl 이라는 공통 로깅 브릿지 모듈이 추가되었다.
  • Core Contatiner에 후보 컴포넌트 인덱스 기능이 추가되었다.
    • classpath 기반의 component 스캔을 대체할 수 있다.
  • Spring WebFlux가 추가되었다. (Reactive Programming 모델)
  • Kotlin을 사용한 함수형 프로그래밍이 가능하다.
  • Junit 5의 Jupiter를 지원한다.
  • TestContext Framework를 통한 병렬 테스트 실행이 가능하다.
  • Reactive Programming model을 위해 spring-test에 WebTestClient가 포함되었다.

 

8. 마무리

지금까지 나는 SpringBoot 2.x를 이용하여 주로 개발을 했는데

이게 Spring 5.x 버전을 쓰고 있었다는 것을 알게되었다

앞으로는 새로운 버전이 나오면 어떤점이 추가되거나 삭제되었고

기존 언어 버전이나 라이브러리랑 호환이 잘 되는지 등등

알아보고 개발을 하는 습관을 들여야겠다