글의 버전
2019.06.10 > Spring 4.0.x까지의 히스토리
2019.06.12 > Spring 4.1.x 컨텐츠 추가
2019.06.21 > 가독성 향상 위해 변경
목차
I. 서론
II. 본론
1) Spring Framework 4.0.x
2) Spring Framework 4.1.x
I.서론
스프링 프레임워크 4까지의 변천사에 대해 1~3까지는 간략히 정리하고, 4는 마이너 버전 별로 써보겠다.
누군가 같은 조사나 노가다를 할까봐, 시간 낭비를 줄이기 위해 만드는 자료다.
사실 스프링 5가 작년에 나온 입장에 왠 4냐?
요즘 MVC Framework 누가하냐 이제 MSA의 시대다 라고 할 수 있겠지만, 5를 정리하기 전에 4를 정리하고 싶었다.
4 -> 5 아키텍쳐 변경(MVC > Reactive) 작업을 곧 할 거 같다는 느낌이 들어...진행한다.
를 토대로 번역한 글이다.
1.0~3.0은 거의 넘어간다고 보면된다.
Spring Framework 1.0
2004년 첫 출시
Spring Framework 2.0
XML namespace와 AspectJ 지원
Spring Framework 2.5
Annotation-driven configuration (어노테이션은 JDK 1.5 이상부터 가능하다. 그전에는 XML을 사용했음.)
Spring Framework 3.0
Java-base @Configuration model 사
본론
Spring Framework 4.X
1) 4.0.x
-
자바 8.0 지원
람다 표현식과 스프링의 콜백 인터페이스에서 메소드 참조를 사용할 수 있음. (자바 6 최소 사양, Java SE 6 (specifically, a minimum level equivalent to JDK 6 update 18, as released in January 2010)
-
Deprecated 패키지,클래스,메소드
https://docs.spring.io/spring-framework/docs/3.2.4.RELEASE_to_4.0.0.RELEASE/
- Core Container 📈
1. Bean을 주입 할 때 제네릭 타입을 한정자의 한 형태로 취급합니다. 예를 들어, Spring Data Repository를 사용한다면 @Autowired Repository customerRepository라는 특정 구현을 쉽게 삽입 할 수 있습니다.
2. Spring의 메타 어노테이션 지원을 사용하면 소스 어노테이션의 특정 속성을 표시하는 사용자 정의 어노테이션을 개발할 수 있습니다.
3. lists 및 arrays로 autowired 될 때 Beans가 정렬될 수 있습니다. @Order 주석과 Ordered 인터페이스가 모두 지원됩니다.
4. @Lazy 은 이제 @Bean 정의뿐만 아니라 주입 지점에서도 사용할 수 있습니다.
5. @Description 주석은 Java 기반 구성을 사용하는 개발자를 위해 도입되었습니다.
6. 조건부로 bean들을 필터링하기위한 일반화 된 모델이 @Conditional 어노테이션을 통해 추가되었습니다. 이것은 @Profile 지원과 비슷하지만 프로그래밍 방식으로 사용자 정의 전략을 개발할 수 있습니다.
7. CGLIB 기반 프록시 클래스는 더 이상 default constuctor를 필요로하지 않습니다. Support는 인라인으로 재 패키징되고 Spring 프레임워크의 일부로 배포되는 objenesis 라이브러리를 통해 제공됩니다. 이 전략을 사용하면 더 이상 프록시 인스턴스에 대해 생성자가 전혀 호출되지 않습니다.
- General Web Improvements
1. Servlet 2.5 서버로의 배포는 여전히 옵션이지만 Spring Framework 4.0은 주로 Servlet 3.0+ 환경에 주로 초점을두고 있습니다. Spring MVC Test Framework를 사용한다면 Servlet 3.0 호환 JAR이 테스트 클래스 경로에 있는지 확인해야한다.
2. @RequestMapping 메소드 각각에 @ResponseBody를 추가 할 필요가 없으므로 Spring MVC 애플리케이션과 함께 새로운 @RestController 어노테이션을 사용할 수 있습니다.
3. AsyncRestTemplate 클래스가 추가되어 REST 클라이언트를 개발할 때 non-blocking 비동기 지원을 허용합니다.
- WebSocket, SockJS, and STOMP Messaging
1. 새로운 spring-websocket 모듈은 웹 응용 프로그램에서 클라이언트와 서버 간의 WebSocket 기반 양방향 통신을 포괄적으로 지원합니다. Java WebSocket API 인 JSR-356과 호환되며 WebSocket 프로토콜 (예 : Internet Explorer <10)을 아직 지원하지 않는 브라우저에서 사용할 수있는 SockJS 기반 폴백 옵션 (예 : WebSocket 에뮬레이션)을 제공합니다.
2. 새로운 spring-messaging 모듈은 WebSocket 클라이언트에서 STOMP 메시지를 라우팅하고 처리하기위한 annotation 프로그래밍 모델과 함께 애플리케이션에서 사용할 WebSocket 하위 프로토콜 인 STOMP에 대한 지원을 추가합니다. 결과적으로 @Controller는 HTTP 요청과 WebSocket 연결 클라이언트의 메시지를 처리하기 위해 @RequestMapping 및 @MessageMapping 메소드를 모두 포함 할 수 있습니다. 새로운 spring-messaging 모듈에는 Message, MessageChannel, MessageHandler 등과 같은 스프링 통합 프로젝트에서 이전의 핵심 추상화가 포함되어 있어 메시징 기반 애플리케이션의 기반이 된다.
- Testing Improvements
deprecated code within the spring-test module
기존 spring-test 모듈이 사라졌다.
1. @ContextConfiguration, @WebAppConfiguration, @ContextHierarchy, @ActiveProfiles 등의 spring-test 모듈의 거의 모든 annotations들은 meta-annotations로 사용하여 사용자 정의 주석을 작성하고 a test suite 전체에서 설정 중복을 줄일 수 있습니다.
2. Active bean 정의 프로파일은 이제 사용자 정의 ActiveProfilesResolver를 구현하고 @ActiveProfiles의 resolver 속성을 통해 등록(registering)함으로써 프로그래밍 방식으로 해결할 수 있습니다.
3. 새로운 SocketUtils 클래스가 spring-core 모듈에 추가되었습니다.이 모듈을 사용하면 localhost에서 무료 TCP 및 UDP 서버 포트를 검색 할 수 있습니다. 이 기능은 테스트에만 국한되지 않지만 소켓 사용이 필요한 통합 테스트 (예 : 메모리 내장 SMTP 서버, FTP 서버, 서블릿 컨테이너 시작 테스트 등)를 작성할 때 매우 유용합니다.
4. Spring 4.0부터, org.springframework.mock.web 패키지의 모의 객체 세트(a the set of mocks)는 이제 Servlet 3.0 API를 기반으로합니다. 또한 Servlet API mock (예 : MockHttpServletRequest, MockServletContext 등) 중 일부는 사소한 개선 및 구성 가능성 향상으로 업데이트되었습니다.
2) 4.1.x
- JMS Improvements
Spring 4.1은 bean 메소드에 @JmsListener를 사용하여 JMS listener endpoint를 등록하는 훨씬 간단한 인프라를 도입했다. XML 네임 스페이스는이 새 스타일 (jms:annotation-driven)을 지원하도록 향상되었으며 Java 구성 (@EnableJms , JmsListenerContainerFactgory)을 사용하여 인프라를 완전히 구성 할 수도 있습니다. JmsListenerConfigurer를 사용하여 프로그램 방식으로 리스너 끝점을 등록 할 수도 있습니다.
Spring 4.1은 또한 4.0에서 소개 된 spring-messaging 추상화의 이점을 누릴 수 있도록 JMS 지원
- Message lisener endpoints는 보다 유연한 signature을 가질 수 있으며 @Payload, @Header, @Headers 및 @SendTo와 같은 표준 메시징 annotations로부터 이점을 얻을 수 있습니다. 메소드 인수로 javax.jms.Message 대신 표준 Message를 사용할 수도 있습니다.
- 새로운 JmsMessageOperations 인터페이스를 사용할 수 있으며 Message abstraction을 사용하는 작업과 같이 JmsTemplate을 허용합니다.
마지막으로, Spring 4.1은 여러 가지 추가 개선 사항을 제공
- JmsTemplate에서의 동기 요청 - 응답 연산 지원
- 리스너 우선 순위는 요소별로 <jms:listener/> 지정할 수 있습니다.
- BackOff 구현을 사용하여 메시지 수신기 컨테이너의 복구 옵션을 구성 할 수 있습니다.
- JMS 2.0 공유 소비자 지원
- Caching Improvements
Spring 4.1은 Spring의 기존 캐시 구성 및 인프라 추상화를 사용하여 JCache (JSR-107) annotation을 지원합니다. 표준 annotation을 사용하기 위해 변경이 필요하지 않습니다.
Spring 4.1은 캐싱 추상화를 크게 향상시킨다.
1. 캐시는 CacheResolver를 사용하여 런타임에 사용할 수 있습니다. 결과적으로 사용할 캐시 이름(s)을 정의하는 value argument는 더 이상 필수가 아닙니다.
2. cache resolver, cache manger, key generator : 운영 수준의 추가 사용자 지정
3. 새로운 @CacheConfig 클래스 수준 주석을 사용하면 캐시 작업을 사용하지 않고도 클래스 설정에서 공통 설정을 공유 할 수 있습니다.
4. CacheErrorHandler를 사용하여 캐시 된 메소드의 예외 처리 향상
Spring 4.1은 또한 새로운 putIfAbsent 메소드가 추가되어 Cache 인터페이스에 큰 변화가있다.
- Web Improvements
ResourceHttpRequestHandler를 기반으로하는 리소스 처리에 대한 기존 지원은 새로운 추상화 ResourceResolver, ResourceTransformer 및 ResourceUrlProvider로 확장되었습니다. 다수의 빌트인 구현은 버전화 된 리소스 URL (효과적인 HTTP 캐싱), gzip 된 리소스 찾기, HTML 5 AppCache manifests 생성 등을 지원합니다. Section 22.16.9, “Serving of Resources”(https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#mvc-config-static-resources).
@RequestParam, @RequestHeader 및 @MatrixVariable 컨트롤러 메소드 arguments에서 JDK 1.8의 java.util.Optional이 지원됩니다.
ListenableFuture는 기본 서비스 (또는 AsyncRestTemplate에 대한 호출)가 이미 ListenableFuture를 반환하는 DeferredResult 대신에 반환 값 대체 값(a return value alternative)으로 지원됩니다.
@ModelAttribute 메소드는 이제 상호 의존성을 존중하는 순서(in an order that respects inter-dependencies.)로 호출됩니다.
Jackson의 @JsonView는 @ResponseBody 및 ResponseEntity 컨트롤러 메소드에서 직접 지원되므로 동일한 POJO (예 : 요약 페이지와 세부 페이지)에 대해 서로 다른 양의 세부 정보를 직렬화 할 수 있습니다. 또한 직렬화 뷰 유형을 특수 키 아래에 모델 속성으로 추가하여 뷰 기반 렌더링에서도 지원됩니다. 자세한 내용은 "Jackson Serialization View 지원"을 참조하십시오. (https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#mvc-ann-jsonview)
JSONP는 이제 Jackson과 함께 지원됩니다. "Jackson JSONP 지원"섹션을 참조하십시오.
(https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#mvc-ann-jsonp)
컨트롤러 메서드가 반환된 후와 응답이 기록되기 직전에 @ResponseBody 및 ResponseEntity 메서드를 가로 채기 위해(intercepting) 새로운 lifecycle 옵션을 사용할 수 있습니다. ResponseBodyAdvice를 구현하는 @ControllerAdvice bean을 선언하는데 이점이있다. @JsonView 및 JSONP에 대한 내장 지원(built-in) 기능을 활용합니다. Section 22.4.1, "HandlerInterceptor로 요청을 Intercepting"를 보라. https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#mvc-handlermapping-interceptor
세 가지 새로운 HttpMessageConverter 옵션이 있습니다.
1. Gson - Jackson보다 가벼운 설치 공간(lighter footpring); 이미 스프링 안드로이드에서 사용 중이다.
2. Google 프로토콜 버퍼 - 기업 내에서 서비스 간 통신 데이터 프로토콜로서 효율적이고 효과적이지만 브라우저 용 JSON 및 XML로도 노출 될 수 있습니다.
3. Jackson 기반 XML 직렬화는 이제 jackson-dataformat-xml 확장을 통해 지원됩니다. @EnableWebMvc 또는 <mvc:annotation-driven/>를 사용할 때 jackson-dataformat-xml이 classpath에 있으면 JAXB2 대신 기본적으로 사용됩니다.
JSP와 같은 뷰는 컨트롤러 매핑을 이름으로 참조하여 컨트롤러에 대한 링크를 만들 수 있습니다. 모든 @RequestMapping에는 기본 이름이 지정됩니다. 예를 들어 handleFoo 메소드가있는 FooController의 이름은 "FC#handleFoo"입니다. 명명 전략은 연결 가능합니다. name 속성을 통해 @RequestMapping에 명시적으로 이름을 지정할 수도 있습니다. Spring JSP 태그 라이브러리의 새로운 mvcUrl 함수는 위의 기능을JSP 페이지에서 사용하기 쉽게 만든다. 22.7.3 절. "뷰에서 컨트롤러와 메소드에 URI를 생성하기"를 참조하십시오. https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#mvc-links-to-controllers-from-views
ResponseEntity는 서버 측 응답을 준비하기 위해 컨트롤러 메소드를 안내하는 빌더-스타일 API를 제공합니다. ResponseEntity.ok().
RequestEntity는 HTTP 요청을 준비 할 때 클라이언트 측 REST 코드를 안내하는 빌더-스타일 API를 제공하는 새로운 유형입니다.
MVC Java 구성 및 XML 네임 스페이스 :
1. content negotiation에 대한 지원을 포함하여 View Resolver를 구성 할 수 있습니다 (22.16.8 절. "https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#mvc-config-view-resolvers"참조).
2. View Controllers에는 리디렉션 및 응답 상태 설정을 위한 내장된(built-in) 지원 기능이 있습니다. 응용 프로그램은이를 사용하여 리디렉션 URL을 구성하고 404 응답을보기와 함께 보내고 "no content" 응답을 보냅니다. 일부 케이스(https://jira.spring.io/browse/SPR-11543?focusedCommentId=100308&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-100308)
3. 경로 matching 사용자 지정은 자주 사용되며 현재 기본 제공(built-in)됩니다. 22.16.11 절. "경로 매칭"부분을 참조하십시오. https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#mvc-config-path-matching
Groovy 마크 업 템플릿 지원 (Groovy 2.3 기반). GroovyMarkupConfigurer를보고 ViewResolver와 View의 구현을 다시 지정하십시오.
- WebSocket Messaging Improvements
SockJS (Java) client-side 지원. 동일 패키지 내의 SockJsClient와 클래스를 참조하십시오.
새로운 어플리케이션 컨텍스트 이벤트 SessionSubscribeEvent 및 SessionUnsubscribeEvent는 STOMP 클라이언트가 구독(Subscribe) 및 구독 취소(Unsubscribe)할 때 게시됩니다.
새로운 "websocket"범위. (https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#websocket-stomp-websocket-scope)
@SendToUser는 단일 세션(a single session)만 타켓팅(targeting)할 수 있으며 인증된 사용자(authenticated user)는 필요하지 않습니다.
@MessageMapping 메소드는 점 "."을 경로 구분자로 "/ " 대신에 사용할 수 있습니다. SPR-11660 참조.(https://jira.spring.io/browse/SPR-11660)
STOMP / WebSocket 모니터링 정보 수집 및 기록. 26.4.18 절. "모니터링"부분을 참조하십시오. (https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#websocket-stomp-stats)
DEBUG Level에서도 판독 가능하고 컴팩트하게 유지되어야하는 상당히 최적화되고 개선된 로깅.
임시 메시지 변경 가능성(mutability) 지원 포함과 자동 메시지 ID와 타임스탬프 생성 방지 등의 최적화 된 메시지 작성. MessageHeaderAccessor의 Javadoc을 참조하십시오.
WebSocket 세션이 설정된 후 60 초 이내에 활동이없는 STOMP / WebSocket 연결을 닫습니다. SPR-11884를 참조.(https://jira.spring.io/browse/SPR-11884)
- Testing Improvements
이제 Groovy 스크립트를 사용하여 TestContext 프레임 워크에서 통합 테스트용으로 로드 된 ApplicationContext를 구성 할 수 있습니다. 자세한 내용은 "Groovy 스크립트를 사용한 컨텍스트 구성"을 참조하십시오.
(https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#testcontext-ctx-management-groovy)
이제 테스트 관리 트랜잭션을 새 TestTransaction API를 통해 트랜잭션 테스트 메소드 내에서 프로그래밍 방식으로 시작하고 종료 할 수 있습니다.
자세한 내용은 "프로그래밍 방식 트랜잭션 관리"를 참조하십시오.
(https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#testcontext-tx-programmatic-tx-mgt)
이제 SQL 스크립트 실행을 클래스 별 또는 메소드 별로 새 @Sql 및 @SqlConfig 어노테이션을 통해 선언적으로 구성 할 수 있습니다.
자세한 내용은 15.5.8 절. "SQL 스크립트 실행"을 참조하십시오.
(https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#testcontext-executing-sql)
새로운 @TestPropertySource 어노테이션을 사용하여 시스템 및 어플리케이션 속성(property) 소스를 자동으로 override하는 테스트 속성(property) 소스를 구성 할 수 있습니다.
자세한 내용은 "테스트 속성 소스가있는 컨텍스트 구성"을 참조하십시오. (https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#testcontext-ctx-management-property-sources)
Default TestExecutionListener를 자동으로 검색 할 수 있습니다.
자세한 내용은 "기본 TestExecutionListener의 자동 검색"절을 참조하십시오. (https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#testcontext-tel-config-automatic-discovery)
Custom TestExecutionListener를 default listener와 병합(merge) 할 수 있습니다.
자세한 내용은 "TestExecutionListener 병합"단원을 참조하십시오.
(https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#testcontext-tel-config-merging)
TestContext 프레임 워크에서 트랜잭션 테스트 지원에 대한 문서는 보다 철저한 설명과 추가 예제로 개선되었습니다.
자세한 내용은 15.5.7 절. "트랜잭션 관리"를 참조하십시오.(https://docs.spring.io/spring/docs/4.3.24.RELEASE/spring-framework-reference/htmlsingle/#testcontext-tx)
MockServletContext, MockHttpServletRequest 및 다른 Servlet API mocks에 대한 다양한 개선.
AssertThrows는 Exception 대신 Throwable을 지원하도록 리팩토링되었습니다.
Spring MVC Test에서 JSON 응답은 JSON Assert를 사용하여 XMLUnit으로 XML에 대해 수행 한 것처럼
JSONPath를 사용하는 추가 옵션으로 선언될 수 있습니다.
MockMvcBuilder 레시피(recipes)는 이제 MockMvcConfigurer의 도움으로 생성 할 수 있습니다. 이것은 Spring Security 설정을 쉽게 적용 할 수 있도록 추가되었지만 타사 프레임 워크 또는 프로젝트 내에서 공통 설정을 캡슐화하는 데 사용할 수 있습니다.
MockRestServiceServer는 이제 클라이언트 측 테스트를위한 AsyncRestTemplate을 지원합니다.
3)4.2.x
1. 4.2.x Core Container Improvements
@Bean과 같은 어노테이션은 Java 8 기본 메소드에서도 감지 및 처리되므로 기본 @Bean 메소드를 사용하여 인터페이스에서 구성 클래스를 작성 가능
Configuration(설정) 클래스는 일반 구성 요소 클래스로 @Import를 선언 할 수 있으며 import 된 Configuration 클래스와 component 클래스를 혼합하여 사용할 수 있습니다.
COnfiguration 클래스는 @Order 값을 선언 할 수 있으며 클래스 경로 검색을 통해 감지 된 경우에도 해당 순서대로 처리됩니다 (예 : 이름을 기준으로 Bean을 재정의하는 경우).
@Resource 주입 지점은 @Autowired와 비슷한 @Lazy 선언을 지원하며 요청 된 대상 빈에 대한 지연 초기화 프록시를 받는다.