여느때와 다름없는 화창한 오후, Springboot initializr로 프로젝트를 만드며 버전 선택에서 큰 혼란에 빠졌다. 선택의 자유가 주어졌지만 버전별 차이도 모르는데 무슨 의미가 있는 건가 싶다.
그래서 시작해보는 Spring과 Springboot 버전별 특징 알아보기
오늘은 Spring 버전별 특징부터 살펴보자.
Overview
Spring이 뭔지는 알아야 할거 아냐
- Spring Framework는 전세계적으로 많이 사용되고 우수한 Java Web Framework이다.
- 개발 생산성을 위해 지원하는 강력한 기능들에 비하여 경량 Framework이고 다른 복잡한 부분들을 Framework단에서 처리해주어 개발자들이 business logic에만 신경쓸 수 있도록 지원한다.
Spring의 특징
1. IoC(Inversion of Control, 제어 반전)
- Java를 이용한 프로그래밍에서는
new
연산자, 인터페이스 호출, 데이터 클래스 호출 방식으로 객체를 생성하고 소멸시킨다.
- IoC는 객체의 생성부터 소멸까지 개발자가 아닌 Spring Container가 대신 해주는 것이다.
- 제어권이 개발자가 아닌 IoC에 있으며, IoC가 개발자의 코드를 호출해 객체를 생성, 소멸하여 생명주기를 관리한다.
2. DI (Dependency Injection, 의존성 주입)
- 프로그램에서 구성 요소의 의존 관계가 소스코드 내부가 아닌 외부의 설정 파일을 통해 정의되는 방식이다.
- 코드 간의 재사용을 높이고, 소스코드를 다양한 곳에 사용하며 모듈간의 결합도를 낮출 수 있다.
- 대표적으로 라이브러리나 API, 프레임워크를 연동할 때 연결하는 소스코드를 직접 작성하는게 아닌 외부 파일을 연결해 불러오는 방식이다.
3. AOP(Aspect Object Programming, 관점 지향 프로그래밍)
- logging, transaction, security 등 여러 모듈에서 공통적으로 사용하는 기능을 분리하여 관리할 수 있다.
- 여러 객체에 공통으로 적용할 수 있는 기능을 구분함으로써 재사용성을 높여주는 프로그래밍 기법
4. 경량(Light-weighted)
- 크기와 부하 측면에서 독립된 몇 개의 jar 파일로 구성되어 있기 때문에 설치가 용이하며 POJO를 사용한다.
- EJB와 달리 Spring Framework 자체의 부하는 무시해도 좋을 수준이다.
POJO(Plain Old Java Object)
POJO는 Java EE를 사용하면서 해당 플랫폼에 종속되어 있는 무거운 객체들을 만드는 것에 반발하여 나타난 용어이다.
별도의 프레임워크 없이 Java EE를 사용할 때에 비해 인터페이스를 직접 구현하거나 상속받을 필요가 없어 기존 라이브러리를 지원하기 용이하고, 객체가 가볍다.
getter/setter를 가진 단순 자바 오브젝트를 말한다.
EJB(Enterprise JavaBeans)
EJB는 기업 환경의 시스템을 구현하기 위한 서버측 컴포넌트 모델이다.
애플리케이션의 업무 로직을 가지고 있는 서버 애플리케이션으로 Java EE의 자바 API 중 하나이다. 주로 웹 시스템에서 JSP는 화면 로직을 처리하고, EJB는 업무 로직을 처리하는 역할을 한다.
5. Transaction 관리
- Java Object에 대한 transaction을 지원하지만 J2EE와 같은 환경에 얽매이지 않는다.
6. Container
- Application 객체의 Life Cycle과 객체들 간 의존 관계를 container 형태로 관리한다. Servlet Container와 Spring Container의 차이점은 특정 WAS, 벤더에 종속적이지 않으며 자유로운 확장이 가능하다는 것이다.
Spring Versions
Spring 3.2.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
주석을 통하여 비동기 메서드 호출을 지원했다.
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를 별도로 지원한다.
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를 제공한다.
Spring 4.2
@Bean
이 default method를 감지한다.
@Import
로 @Configuration class
나 @Component class
를 임포트할 수 있다.
@Order
로 @Configuration class
가 로딩되는 순서 설정이 가능하다.
- annotation attribute를 위한
@AliasFor
를 제공한다.
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에 지속적인 혹은 커스텀 에러 처리가 가능하다.
Spring 5.0
- Java 8 버전이 기본으로 설정되고, Java EE 7 API 이상 사용이 가능하다.
- 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가 포함되었다.
ref
https://velog.io/@jh8579/Spring-%EB%B2%84%EC%A0%BC%EB%B3%84-%ED%8A%B9%EC%A7%95
https://server-engineer.tistory.com/775
https://m.blog.naver.com/whdgml1996/222001483936
https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/htmlsingle/#spring-whats-new