/
3.1

3.1

스프링 프레임워크 3.1의 새로운 기능 및 향상된 기능

1. 캐시 추상화

2. 빈 정의 프로필

  • XML 프로필 (스프링소스 팀 블로그)
  • @Profile (스프링소스 팀 블로그)
  • org.springframework.context.annotation.Configuration Javadoc 참고
  • org.springframework.context.annotation.Profile Javadoc 참고

3. 환경 추상화

  • 환경 추상화 (스프링소스 팀 블로그)
  • org.springframework.core.env.Environment Javadoc 참고

4. PropertySource 추상화

  • 통합된 Property 관리 (스프링소스 팀 블로그)
  • org.springframework.core.env.Environment Javadoc 참고
  • org.springframework.core.env.PropertySource Javadoc 참고
  • org.springframework.context.annotation.PropertySource Javadoc 참고

5. 스프링 XML 네임스페이스와 동일한 코드

자주 사용하는 스프링 XML 네임스페이스 엘리먼트(<context:component-scan/>, <tx:annotation-driven/>, <mvc:annotation-driven>)와 동일한 기능을 코드 기반(@Enable 애노테이션 형식)으로 사용할 수 있도록 개발됨.

스프링 프레임워크 3.0에 도입된 스프링의 @Configuration 클래스와 함께 사용하도록 설계됨.

  • org.springframework.context.annotation.Configuration Javadoc 참고

  • org.springframework.context.annotation.ComponentScan Javadoc 참고

  • org.springframework.transaction.annotation.EnableTransactionManagement Javadoc 참고

  • org.springframework.cache.annotation.EnableCaching Javadoc 참고

  • org.springframework.web.servlet.config.annotation.EnableWebMvc Javadoc 참고

  • org.springframework.scheduling.annotation.EnableScheduling Javadoc 참고

  • org.springframework.scheduling.annotation.EnableAsync Javadoc 참고

  • org.springframework.context.annotation.EnableAspectJAutoProxy Javadoc 참고

  • org.springframework.context.annotation.EnableLoadTimeWeaving Javadoc 참고

  • org.springframework.beans.factory.aspectj.EnableSpringConfigured Javadoc 참고

6. 하이버네이트 4.x 지원

  • 새롭게 추가된 org.springframework.orm.hibernate4 패키지에 있는 클래스의 Javadoc 참고

7. @Configuration 클래스와 빈 정의 프로필을 지원하는 TestContext 프레임워크

@ContextConfiguration 애노테이션은 스프링 TestContext를 설정하는 @Configuration 클래스를 지원함.

새로운 @ActiveProfiles 애노테이션은 ApplicationContext 통합테스트에서 액티브 빈 정의 프로필의 선언적인 설정을 지원하기 위해 도입됨.

8. 더 간단한 생성자 주입을 위한 c 네임스페이스 

9. 비표준 자바빈 setter에 대한 주입 지원

  • 스프링 프레임워크 3.1 이전에는 프로퍼티 메서드에 주입하기 위해 자바빈 프로퍼티 시그니처 규칙을 엄격하게 준수했음. 즉, 어떠한 'setter'라도 반드시 void를 리턴해야 했음.
  • 스프링 XML에서 특정 setter가 어떤 객체(object)타입을 리턴하도록 명시하는 것이 가능해졌음.
  • 메서드 체이닝(method-chaining)으로 API를 설계할 때 setter 메서드에서 'this'에 대한 참조를 리턴하도록 하는데 유용함.

10. 서블릿 컨테이너의 서블릿 3 코드 기반 설정 지원

기존의 web.xml을 프로그래밍적으로 대체하는 서블릿 3.0의 ServletContainerInitializer에 기반을 둔 WebApplicationInitializer를 새로 추가함.

11. 서블릿 3 MultipartResolver 지원

  • org.springframework.web.multipart.support.StandardServletMultipartResolver Javadoc 참고

12. persistence.xml 없이 JPA EntityManagerFactory 부트스트랩 하기

  • 표준 JPA에서 퍼시스턴스 유닛은 특정 jar 파일 안에 있는 META-INF/persistence.xml 파일을 통해 정의되고, @Entity 클래스를 찾음.
  • 많은 경우에 persistence.xml은 유닛의 이름 이상을 포함하지 않음. (예 : 사용하는 데이터 소스 등과 같은) 다른 모든 문제에 대한 기본값이나 외부 설정에 의존함.
  • 따라서 스프링 3.1은 대안을 제공함.
  • LocalContainerEntityManagerFactoryBean은 'packagesToScan' 속성을 허용하여, @Entity 클래스를 찾기 위한 기본 패키지를 지정할 수 있음.
  • 이는 네이티브 Hibernate 설정을 위한 AnnotationSessionFactoryBean의 같은 이름의 속성이나 일반적인 스프링 빈을 위한 스프링의 컴포넌트 스캔 기능과 유사함.
  • 엔티티 스캔을 위한 기본 패키지를 지정하는 JPA 설정은 XML 없이 가능함.
  • 스프링 빈의 컴포넌트 스캔에 기반한 스프링 애플리케이션과 잘 매치되고, 코드 기반의 서블릿 3.0 initializer를 사용하여 부트스트랩이 가능함.

13. 애노테이션을 사용하는 컨트롤러 처리를 위한 새로운 HandlerMethod 기반 지원 클래스

스프링 프레임워크 3.1은 애노테이션이 붙은 컨트롤러의 요청 처리를 지원하는 새로운 클래스들을 소개함. (기존 클래스 대체함.)

  • DefaultAnnotationHandlerMapping → RequestMappingHandlerMapping
  • AnnotationMethodHandlerAdapter → RequestMappingHandlerAdapter
  • AnnotationMethodHandlerExceptionResolver→ ExceptionHandlerExceptionResolver

애노테이션이 붙은 컨트롤러의 지원 클래스들이 좀 더 커스터마이징할 수 있고, 확장에 열려있도록 해야한다는 많은 요청에 대한 응답으로 새로운 클래스들이 개발되었음.

이전에는 커스텀 애노테이션이 붙은 컨트롤러 메서드 아규먼트 리졸버를 설정할 수 있었지만 새로운 지원 클래스를 사용하면 메서드 아규먼트와 리턴값의 타입에 대한 처리를 지원하는 커스터마이징을 할 수 있음.

  • org.springframework.web.method.support.HandlerMethodArgumentResolver Javadoc 참고
  • org.springframework.web.method.support.HandlerMethodReturnValueHandler Javadoc 참고

두 번째로 주목할만한 차이점은 @RequestMapping 메서드를 나타내는 HandlerMethod 추상화의 도입임.

이 추상화는 handler 인스턴스로 새로 추가되는 지원 클래스를 통해 전반적으로 사용됨. 예를 들어, HandlerInterceptor는 handler를 Object에서 캐스팅 할 수 있고, 타겟 컨트롤러 메서드나 타겟 컨트롤러 메서드의 애노테이션 등에 접근할 수 있음.

새로운 클래스들은 MVC 네임스페이스의 기본 설정이나 @EnableWebMvc를 사용한 자바 기반 설정을 통해 사용할 수 있음. 기존 클래스들은 계속해서 사용할 수 있지만 새로운 클래스를 사용하기를 더욱 권장함.

스프링 MVC 3.1에서 @RequestMapping 메서드를 위한 새로운 지원 클래스들”  참고

14. @RequestMapping 애노테이션에 consumes 및 produces 조건 지원

'Accept' 헤더로 미디어 타입의 produce를 지원하는 것처럼 'Content-Type' 헤더를 통해 미디어 타입의 consume을 지원함.

15. Flash Attributes와 RedirectAttributes

플래시 속성은 이제 FlashMap에 저장할 수 있고, 리다이렉트 했을 경우에도 유지될 수 있도록 HTTP 세션에 저장할 수 있음.

애노테이션이 붙은 컨트롤러에서 @RequestMapping 메서드는 RedirectAttributes 타입의 메서드 아규먼트를 선언함으로써 플래시 속성을 추가할 수 있음. 

RedirectAttributes 타입의 메서드 아규먼트는 리다이렉트 시나리오에서 사용하는 속성을 정확히 컨트롤하여 가져오기 위해 사용할 수 있음.

16. 향상된 URI 템플릿 변수

URI 템플릿 변수를 현재 더 많은 장소에서 사용되어지길 바라는 요청이 있음.

  • URI 템플릿 변수는 요청으로부터 @ModelAttribute 메서드 아규먼트에 바인딩될 때 요청 파라미터에 추가로 사용함.
  • @PathVariable 메서드 아규먼트 값은 렌더링 전에 모델과 합쳐짐. 단, JSON  직렬화나 XML 마샬링처럼 자동화된 방식으로 컨텐트를 생성하는 뷰는 제외임.
  • 리다이렉트 문자열은 URI 변수를 위한 placeholders를 포함할 수 있음(예. "redirect:/blog/{year}/{month}") placeholders를 확장했을 때 URI 템플릿 변수는 현재 요청으로부터 자동으로 고려함.
  • @ModelAttribute 메서드 아규먼트는 문자열을 타겟 객체 타입(target object type)으로 변환하기 위해 등록한 컨버터나 PropertyEditor에서 제공받은 URI 템플릿 변수로 인스턴스화 할 수 있음.

17. @RequestBody 컨트롤러 메서드 인자(arguments)의 @Valid

@RequestBody 메서드 아규먼트는 @ModelAttribute 메서드 아규먼트를 위한 지원과 유사하게 자동 유효성 검사를 호출할 수 있는 @Valid 애노테이션을 붙일 수 있음.

MethodArgumentNotValidException이 발생하면 DefaultHandlerExceptionResolver에 의해 처리되고, 400 응답코드를 돌려줌.

18. 컨트롤러 메서드 인자(arguments)의 @RequestPart 애노테이션

이 새로운 애노테이션은 "multipart/form-data" 요청의 콘텐츠에 대한 접근을 제공함.

19. UriComponentsBuilder와 UriComponents

새로운 UriComponents 클래스는 모든 URI 컴포넌트에 접근할 수 있는 URI 컴포넌트의 불변(immutable) 컨테이너로 추가됨. 새로운 UriComponentsBuilder 클래스는 UriComponents 인스턴스를 생성하는데 도움을 줌. 이 두 클래스를 함께 사용하면 URI 템플릿 변수의 생성과 확장을 포함해서 URI를 준비하는 관점과 인코딩에 걸친 전 과정을 제대로 제어할 수 있음.

대부분의 경우에 새롭게 추가된 클래스들은 기존의 UriTemplate를 훨씬 유연하게 대체할 수 있음. 내부적으로 UriTemplate는 같은 클래스에 기반을 두고 있음.

ServletUriComponentsBuilder의 서브 클래스는 서블릿 요청으로부터 정보를 복사하는 정적 팩토리 메서드를 제공함.

 

Related content