Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

[Spring 레퍼런스] 3장 Spring 3.1의 새로운 기능과 개선된 점

레퍼런스의 3장은 3.1을 소개하는 장인데 문서에도 나와있듯이 3.1 RC1이 나올 시기정도에 문서가 업데이트된 것 같습니다. 현재는 3.1 GA가 릴리즈 되어 있지만 일단 문서상태 그대로 옮깁니다. 3.1에 대한 자세한 내용을 살펴보시려면 다른 글을 더 찾아봐야 할 겁니다. 이 포스팅은 다음의 스프링소스 라이센스를 따릅니다.

이 문서는 개인적인 목적이나 배포하기 위해서 복사할 수 있다. 출력물이든 디지털 문서든 각 복사본에 어떤 비용도 청구할 수 없고 모든 복사본에는 이 카피라이트 문구가 있어야 한다.




3. Spring 3.1의 새로운 기능과 개선된 점

스프링 3.0에서 도입된 기능 위에서 스프링 3.1은 현재 개발중에 있다. 이 글을 쓰는 시점에 스프링 3.1 RC1를 릴리즈할 준비를 하고 있다.

3.1 새로운 기능

다음은 스프링 3.1의 새로운 기능들이다. 대부분의 기능은 아직 레퍼런스 문서에 적용되지 않았지만 Javadoc에는 적용되었다. Javadoc에는 완전히 검증된 클래스명이 나와있다.

3.1.1 캐시(Cache) 추상화

3.1.2 빈(Bean) 선언 프로파일


  • XML 프로파일 (스프링소스 팀 블로그)
    @Profile 소개 (스프링소스 팀 블로그)
    org.springframework.context.annotation.Configuration의 JavaDoc 참고
    org.springframework.context.annotation.Profile의 JavaDoc 참고
3.1.3 환경(Environment) 추상화

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

  • 통인된 Property 관리 (스프링소스 팀 블로그)
  • org.springframework.core.env.Environment Javadoc의 JavaDoc 참고
  • org.springframework.core.env.PropertySource Javadoc의 JavaDoc 참고
  • org.springframework.context.annotation.PropertySource의 JavaDoc 참고
3.1.5 스프링의 XML 네임스페이스와 동일한 코드

자주 사용하는 <context:component-scan/>, <tx:annotation-driven/>, <mvc:annotation-driven>의 스프링 XML 네임스페이스 엘리먼트와 동일한 기능을 대부분 @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 참고
3.1.6 Hibernate 4.x 지원

  • 새로 추가된 org.springframework.orm.hibernate4 패키지의 클래스에 대한 Javadoc을 참고해라
3.1.7 @Configuration 클래스와 빈 선언 프로파일을 지원하는 TestContext 프레임워크

@ContextConfiguration 어노테이션은 이제 스프링 TestContext를 설정하는 @Configuration 클래스를 제공한다. 새로 추가된 @ActiveProfiles 어노테이션은 ApplicationContext 통합테스트에서 엑티브 빈 선언 프로파일을 선언적으로 설정을 지원한다.

  • Spring 3.1 M2: Testing with @Configuration Classes and Profiles (SpringSource Team Blog)
  • Spring 3.1 M2: @Configuration 클래스와 Profile을 이용한 테스트 (스프링 소스 팀 블로그)
  • Section 10.3.5, “Spring TestContext Framework” 참고
  • the section called “Context configuration with @Configuration classes”와 org.springframework.test.context.ContextConfiguration 의 Javadoc 참고
  • org.springframework.test.context.ActiveProfiles 의 Javadoc 참고
  • org.springframework.test.context.SmartContextLoader 의 Javadoc 참고
  • org.springframework.test.context.support.DelegatingSmartContextLoader 의 Javadoc 참고
  • org.springframework.test.context.support.AnnotationConfigContextLoader 의 Javadoc 참고
3.1.8 c: 더 간단한 생성자 주입을 위한 네임스페이스

  • Section 4.4.2.7, “XML shortcut with the c-namespace”
3.1.9 비표준 JavaBean의 setter에 대한 주입 지원

Spring 3.1이전에는 프로퍼티 메서드에 주입을 하기 위해 JavaBean 프로퍼티 시그니쳐 규칙을 엄격하게 따라야 했다. 즉, 모든 'setter'는 반드시 리턴값이 없어야 한다.(void) 이제 스프링 XML에서 setter가 어떤 객체타입을 리턴하도록 명시하는 것이 가능하다. 이는 메서드 체이닝(method-chaining)으로 API를 디자인할 때 setter 메서드가 'this'에 대한 참조를 리턴하도록 하는데 유용하다.

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

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

3.1.11 Servlet 3 MultipartResolver에 대한 지원

  • org.springframework.web.multipart.support.StandardServletMultipartResolver 의 Javadoc 참고
3.1.12 persistence.xml 없이 JPA EntityManagerFactory 부트스트랩하기

표준 JPA에서 퍼시스턴트 유닛은 지정된 jar파일의 META-INF/persistence.xml파일에 정의되고 @Entity 클래스를 찾는다. 많은 경우에 persistence.xml은 유닛의 이름과 의존하는 기본설정이나 필요한 외부설정(사용하려는 DataSource같은) 이외의 정보는 담고 있지 않다.그래서 스프링 3.1은 대안을 제공한다. LocalContainerEntityManagerFactoryBean는 @Entity클래스를 찾을 패키지를 지정하는 'packagesToScan' 속성을 지원한다. 이는 네이티브 Hibernate 설정에서 AnnotationSessionFactoryBean의 같은 이름의 속성이나 스프링의 정규 스프링 빈을 찾는 컴포넌트 스캔 기능과 유사하다. 사실 엔티티 스캔을 하는 패키지명시하는 JPA설정은 XML없이도 가능하다. 특히 스프링 빈의 컴포넌트 스캔에 기반한 어플리케이션과 잘 매치되고 코드기반의 서블릿 3.0 초기화를 사용해서 부트스트랩하는 것도 가능하다.

3.1.13 어노테이션이 붙은 컨트롤러의 처리를 위해 새롭게 추가된 HandlerMethod 기반의 지원 클래스

Spring 3.1은 어노테이션이 붙은 컨트트롤러가 요청을 처리하도록 지원하는 클래스의 새로운 셋을 추가했다.

  • RequestMappingHandlerMapping
  • RequestMappingHandlerAdapter
  • ExceptionHandlerExceptionResolver
이러한 클래스들은 이미 존재하는 클래스들은 대체한다.

  • DefaultAnnotationHandlerMapping
  • AnnotationMethodHandlerAdapter
  • AnnotationMethodHandlerExceptionResolver
어노테이션이 붙은 컨트롤러의 지원 클래스들이 더 커스터마이징할 수 있고 쉽게 확장할 수 있도록 해야 한다는 많은 요청을 수용해서 새로운 클래스들을 개발했다. 전에는 커스텀 어노테이션이 붙은 컨트롤러 메서드의 아규먼트 리졸버를 설정할 수 있었지만 새로운 지원 클래스를 사용하면 모든 지원메서드의 아규먼트와 리턴값의 타입에 대한 처리를 커스터마이징할 수 있다.

  • org.springframework.web.method.support.HandlerMethodArgumentResolver 의 Javadoc 참고
  • org.springframework.web.method.support.HandlerMethodReturnValueHandler 의 Javadoc 참고
다음으로 주목할 만한 차이점은 @RequestMapping 메서드를 나타내는 HandlerMethod 추상화의 도입이다. HandlerMethod 추상화는 handler 인스턴스로 새로 추가된 클래스에 의해 언제든지 사용된다. 예를 들어 HandlerInterceptor는 handler를 Object에서 HandlerMethod로 캐스팅 할 수 있고 타겟 컨트롤러 메서드나 타겟 컨트롤러 메서드의 어노테이션 등에 접근할 수 있다.

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

3.1.14 @RequestMapping의 "consume"과 "produce" 상태

'Accept'헤더로 지정된 타입을 만드는 것(produce)과 마찬가지로 'Content-Type'헤더로 지정된 미디어타입을 메서드로 소비(consume)하는 것에 대한 지원이 개선되었다. Section 16.3.2.4, “Consumable Media Types”와 Section 16.3.2.5, “Producible Media Types”를 참고해라.

3.1.15 Flash 속성과 RedirectAttributes

flash 속성은 이제 FlashMap에 저장할 수 있고 리다이렉트했을 때도 유지되도록 HTTP 세션에 저장할 수 있다. 스프링 MVC에서 flash 속성에 대한 일반적인 지원을 살펴보려면 Section 16.6, “Using flash attributes”를 참고해라.

어노테이션이 붙은 컨트롤러에서 @RequestMapping 메서드는 RedirectAttributes타입의 메서드 아규먼트를 선언함으로써 flash 속성을 추가할 수 있다. RedirectAttributes타입의 메서드 아규먼트는 리다이렉트 시나리오에서 사용된 속성을 정확하게 가져오기 위해 사용할 수도 있다. 더 자세한 내용은 Section 16.3.3.10, “Specifying redirect and flash attributes”를 봐라.

3.1.16 향상된 URI 템플릿 변수

현재 요청의 URI 템플릿 변수를 더 다양한 곳에서 사용한다.

  • 요청을 @ModelAttribute 메서드 아규먼트에 바인딩할 때 요청 파리미터에 추가로 URI 템플릿 변수를 사용한다.
  • @PathVariable 메서드 아규먼트의 값은 렌더링하기 전에 모델에 합쳐진다. 단 JSON 직렬화나 XML 마샬랑처럼 자동화된 방법으로 생성하는 컨텐츠의 뷰는 제외다.
  • 리다이렉트 문자열은 URI 변수를 위한 플레이스홀더를 포함할 수 있다. (예를 들어 "redirect:/blog/{year}/{month}") 플레이스홀더를 확장했을 때 현재 요청의 URI 템플릿 변수를 자동으로 고려한다.
  • @ModelAttribute 메서드 아규먼트는 문자열에서 타겟 객체타임으로 변환하기 위해서 등록한 Converter나 PropertyEditor에서 제공받은 URI 템플릿 변수로 초기화 될 수 있다.
3.1.17 @RequestBody 컨트롤러 메서드 아규먼트상의 @Valid

@RequestBody 메서드 아규먼트는 @ModelAttribute 메서드 아규먼트와 유사하게 자동화된 유효성 확인은 호출하는 @Valid 어노테이션을 붙일 수 있다. MethodArgumentNotValidException가 발생하면 DefaultHandlerExceptionResolver가 처리하고 400 응답코드를 돌려준다.

3.1.18 컨트롤러 메서드 아규먼트 상의 @RequestPart 어노테이션

이 새로운 어노테이션은 "multipart/form-data" 요청의 컨텐츠에 대한 접근을 제공한다. Section 16.10.5, “Handling a file upload request from programmatic clients” 와 Section 16.10, “Spring's multipart (file upload) support”를 참고해라.

3.1.19 UriComponentsBuilder와 UriComponents

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

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

ServletUriComponentsBuilder의 서브클래스는 서블릿 요청에서 정보를 복사하는 정적 팩토리 메서드를 제공한다. Section 16.7, “Building URIs”를 참고해라.
2012/01/17 02:52 2012/01/17 02:52