Spring 2.5 OSGi 번들형태의 JAR

요즘 하이버네이트를 2쩜대에서 3.2버전으로 마이그레이션하는 작업을 했습니다. 물론 그와 동시에 스프링도 2쩜대에서 2.5로 올리는 작업을 했는데 스프링은 정말 편했습니다. 필요한 라이브러리만 바꿔주면 되니까요. 그런데 하이버네이트는… 나중에 언급하겠습니다. 어쨋든 지금은 스프링만 생각해보겠습니다.

Spring 2.5 전에는 spring.jar, commons-logging.jar 파일만 넣어주면 만사 OK 였습니다. 저 같은 경우는 spring-mock.jar도 단골손님이었습니다.

그런데 Spring 2.5부터는 약간 바꼈습니다. OSGi에서 바로 사용할 수 있는 번들 형태로 배포한 것이 Spring 2.5의 가장 큰 변경 사항 중 하나인 것 같습니다.

그래서 Spring 2.0 에서 Spring 2.5로 올리시려면 Spring 2.5 JAR 패키지들을 조금 살펴봐야합니다. 조금만 보면 됩니다.

사용자 삽입 이미지
spring.jar에 포함되어 있지 않은 라이브러리

– spring-webmvc.jar: 컨트롤러들, 핸들러 맵퍼, DispatcherServlet 등 Spring MVC 관련 라이브러리는 dist/modules/spring-webmvc.jar에 들어있습니다.
– spring-test.jar: spring-mock.jar에 들어있던 모든 것들을 가지고 있습니다. 애노테이션 기반의 테스팅 라이브러리가 추가되었습니다.
– spring-webmvc-portlet.jar
– spring-webmvc-struts.jar

spring.jar에 포함되어 있는 라이브러리

– spring-aop
– spring-beans
– spring-context
– spring-context-support
– spring-core
– spring-jdbc
– spring-jms
– spring-orm
– spring-tx
– spring-web

OSGi 번들 형태로 배포하려면 JAR파일의 META-INF에 있는 MANIFEST.MF에서 노출 시키거나 가져와서 사용할 패지키를 명시해 두어야 하는데, 위에서 언급했던 모든 JAR파일들의 MANIFEST.MF 파일을 모두 Spring Source에서 손봐두었기 때문에, OSGi 번들로 사용할 때 별도의 작업을 하지 않아도 됩니다.

결론

if(나는 좀 귀찮다.) {  // 강추(쉽고, 간단)
    dist/spring.jar 추가.
    if(스프링 MVC를 사용 한다.)
        dist/modules/spring-webmvc.jar 추가.
    if(테스트 한다.)
        dist/modules/spring-test.jar 추가.
} else {  // 비추(라이브러리를 패키지 명까지 빠삭하게 알고 계신다 하더라도.. 귀찮은 작업..)
    dist/modules/ 폴더에서 사용하는 라이브러리를 담고 있는 JAR만 추가.
}

What’s new in Spring 2.0 and Spring 2.5?

참조 : http://static.springframework.org/spring/docs/2.5.x/reference/new-in-2.html

2.1. Introduction

이번 챕터에서는 Spring 2.5와 Spring 2.0에 새로 추가되거나 향상된 기능을 소개 합니다. 여기서는 간략히 소개하고 있기 때문에 자세한 내용은 해당 내용의 링크를 참조 하시기 바랍니다.

2.2. The Inversion of Control (IoC) container

이부분에 상당히 많은 개선이 있었습니다.

2.2.1. Easier XML configuration

XML 스키마 기반의 XML을 사용할 수 있습니다. 물론 DTD 기반의 XML을 사용할 수도 있지만 Appendix A, XML Schema-based configuration.을 사용하면 더 간편하게 할 수 있습니다.

2.2.2. New bean scopes

기존의 bean scope(singleton, prototype) 이 외에 Spring이 배포된 환경에 따라 부가적인 Scope을 사용할 수 있으며[footnote]웹 환경에서 request와 session Scope를 사용할 수 있습니다.[/footnote] 사용자 정의 Scope을 만들 수도 있습니다. 자세한 내용은 Section 3.4, “Bean scopes”에있습니다.

2.2.3. Extensible XML authoring

XML 설정 파일은 작성하기도 쉽고 확장성도 좋습니다. 다른 Spring 설정 파일에서 쉽게 사용할 수 있는 custom tag를 만들어 사용할 수 있습니다. 이로 인해 DSL을 가질 수 있습니다.
The extensible configuration mechanism is documented in Appendix B, Extensible XML authoring.

2.2.4. Annotation-driven configuration

스프링 2.0에서는 설정을 간편화 하기 위해 @Transactional, @Required @PersistenceContext/@PersistenceUnit 와 같은 애노테이션들이 추가되었습니다,

스프링 2.5에서는 JSR-250 애노테이션 스팩을 따르는 @Resource, @PostConstruct and @PreDestroy 에다가 @Autowired 까지 추가되었습니다.

이들에 대한 자세한 내용은  Section 3.10, “Annotation-based configuration” 여기서 다룹니다.

2.2.5. Autodetecting components in the classpath

스프링 2.5에서 새로 추가된 기능으로 컴포넌트 스캐닝을 지원합니다. 특정 클래스패스 안에 다음의 애노테이션이 붙어있는 컴포넌트들을 자동으로 읽어옵니다. @Component, @Repository, @Service, @Controller.

이 기능을 사용하면, 애노테이션으로 XML 설정을 대채할 수 있습니다. 애노테이션 기반 설정은 Section 3.11.1, “@Component and further stereotype
annotations”
여기서 자세히 다룹니다.

2.3. Aspect Oriented Programming (AOP)

보다 덜 복잡해 졌습니다. AspectJ 포인트컷 문법과 @Aspect 표기법을 지원합니다.

2.3.1. Easier AOP XML configuration

<aop:…> 라는 새로운 스키마를 제공하고 이 스키마로 AspectJ 포인트컷 문법과 캐스팅이 필요 없는 advice를 지원합니다. 자세한 내용은 Section 6.3, “Schema-based AOP support”.에 있습니다.

2.3.2. Support for @AspectJ aspects

@AspectJ 어노테이션을 사용한 Aspect 설정도 가능합니다. 이렇게 만든 Aspect는 AspectJ와 Spring에서 모두 사용이 가능하면 진짜 Section 6.2, “@AspectJ support”[footnote]예전에 해봤을 때 <aop:aspectj-autoproxy/> 이렇게만 설정해주면 됐었습니다. [/footnote]만 있으면 됩니다.

2.3.3. Support for bean name pointcut element

스프링 2.5부터 bean(…)  포인트컷 표현식을 지원합니다. 이에 대한 내용은 Section 6.2.3.1, “Supported Pointcut Designators”  여기서 다룹니다.

2.3.4. Support for AspectJ load-time weaving

스프링 2.5부터 context:load-time-weaver 엘리먼트를 사용하면 자동으로 META-INF/aop.xml 에 설정한 AspectJ 위버 설정을 읽어들어 로드 타임 위버를 적용합니다. 이에 대한 자세한 내용은 Section 6.8.4, “Load-time weaving with AspectJ in the Spring Framework”
여기서 다룹니다.

2.4. The Middle Tier

2.4.1. Easier configuration of declarative transactions in XML

1.2.x 스타일의 설정도 사용이 가능하지만 그것보다 훨씬 간단하게 할 수 있고 추천하는 바입니다. Chapter 9, Transaction management에서 자세히 볼 수 있습니다.

스프링 2.5부터 context:load-time-weaver 와 tx:annotation-driven mode=”aspectj”를 사용하여 로드 타임 위버를 사용하여 애노테이션 기반의 트랜잭션 처리를 할 수 있습니다.

2.4.2. Full WebSphere transaction management support

스프링 2.5에 WAS 6.0.2.19+ and 6.0.1.9+ 부터 웹로직에서 사용할 수 있는 UOWManager API를 지원하는 WebSphereUowTransactionManager 가 추가 되었습니다.

JTA 기반 트랜잭션 매니저를 사용할 경우 tx:jta-transaction-manager 엘리먼트를 사용하여, 웹로직이나 웹스피어의 트랜잭션 관리자를 자동으로 찾아줍니다.

2.4.3. JPA

Spring 2.0 ships with a JPA abstraction layer that is similar in intent
to Spring’s JDBC abstraction layer in terms of scope and general
usage patterns.Section 12.6, “JPA”

Spring 2.5 upgrades its OpenJPA support to OpenJPA 1.0,
with support for advanced features such as savepoints.

2.4.4. Asynchronous JMS

2.0 전에는 동기화 상태에서 메시지 받기만 가능했는데 비동기 스타일로도 메시지를 받을 수 있게 됐습니다.
Section 19.4.2, “Asynchronous Reception – Message-Driven POJOs”.

As of Spring 2.5, the JCA style of setting up asynchronous
message listeners is supported as well, through the
GenericMessageEndpointManager facility.
This is an alternative to the standard JMS listener facility, allowing
closer integration with message brokers such as ActiveMQ and JORAM.
See Section 19.5, “Support for JCA Message Endpoints”.

Spring 2.5 also introduces an XML namespace for simplifying JMS
configuration, offering concise configuration of a large numbers of
listeners. This namespace supports both the standard JMS listener facility
as well as the JCA setup style, with minimal changes in the configuration.
See Section 19.6, “JMS Namespace Support”.

2.4.5. JDBC

JDBC support 라이브러리에 몇 개의 클래스가 추가 됐는데 NamedParameterJdbcTemplate는 JDBC statement에 ? 만 사용하던 것과 달리 named parameter를 사용할 수 있도록 해주고
SimpleJdbcTemplate 는 java 5.0 이상의 개발 환경에서 JdbcTemplate을 더 쉽게 사용할 수 있도록 도와줍니다.

스프링 2.5의 SimpleJdbcTemplate 기능이 확장되었습니다.

2.5. The Web Tier

2.5.1. Sensible defaulting in Spring MVC

여러 프로젝트를 통해서 기본값으로 적당한 값을 찾아냈습니다. 그것으로  CoC를 Spring MVC에 적용했습니다. Section 13.11, “Convention over configuration”

2.5.2. Portlet framework

Spring 2.0 ships with a Portlet framework. Chapter 16, Portlet MVC Framework.

2.5.3. Annotation-based controllers

@RequestMapping, @RequestParam, @ModelAttribute 등을 사용하여, 컨트롤러를 구현할 수 있어며 Servlet이나 Portlet API를 직접적으로 참조하지 않고도, Servlet이나 Portlet의 기능을 사용할 수 있습니다. Section 13.12, “Annotation-based controller configuration”

2.5.4. A form tag library for Spring MVC

JIRA를 통해 개발자들의 의견을 반영했으며 새로운 JSP tag 라이브러리에 대한 자세한 내용은 Section 13.9, “Using Spring’s form tag library”에서 참조할 수 있습니다.

2.5.5. Tiles 2 support

Spring 2.5 ships support for Tiles 2, the next generation of the popular Tiles templating framework. This supersedes Spring’s former support for Tiles 1, as included in Struts 1.x. See Section 14.3, “Tiles” for details.

2.5.6. JSF 1.2 support

Spring 2.5 supports JSF 1.2, providing a JSF 1.2 variant of Spring’s DelegatingVariableResolver in the form of the new DelegatingFacesELResolver.

2.5.7. JAX-WS support

Spring 2.5 fully supports JAX-WS 2.0, as included in Java 6 and Java EE 5. JAX-WS is the successor of JAX-RPC, allowing access to WSDL/SOAP-based web services as well as JAX-WS style exposure of web services.

2.6. Everything else

기타 등등 추가되거나 개선된 기능 입니다.

2.6.1. Dynamic language support

자바 이외에 동적 언어(JRuby, Groovy, BeanShell등..)로 작성된 코드를 bean으로 등록할 수 있습니다. Chapter 24, Dynamic language support.

스프링 2.5에서 오토 와이어링 지원을 하며, 최근에 배포한 JRuby 1.0을 지원합니다.

2.6.2. Enhanced testing support

스프링 2.5부터 Spring TestContext Framework 라는 것을 도입하여 애노테이션 기반의 테스트 작성이 가능하며, JUnit 4.4와 TestNG를 지원합니다. Section 8.3.7, “Spring TestContext Framework”

2.6.3. JMX

The Spring Framework now has support for Notifications; it is also possible to exercise declarative control over the registration behavior of MBeans with an MBeanServer.

스프링 2.5부터 @ManagedResource 라는 애노테이션이 붙은 클래스를 자동으로 찾아서 노출 시키는 context:mbean-export 엘리먼트가 추가되었습니다.

2.6.4. Deploying a Spring application context as JCA adapter

스프링 2.5부터 스프링 애플리케이션 컨텍스트를 JCA RAR 파일로 배포할 수 있게 되었습니다.

2.6.5. Task scheduling

Spring 2.0 offers an abstraction around the scheduling of tasks. Section 23.4, “The Spring TaskExecutor abstraction”

The TaskExecutor abstraction is used throughout the framework itself as well, e.g. for the asynchronous JMS support. In Spring 2.5, it is also used in the JCA environment support.

2.6.6. Java 5 (Tiger) support

Java 5.0을 지원하며 아래의 링크들은 Java 5.0에서만 동작합니다.

2.7. Migrating to Spring 2.5

1.2.X 에서 2.0으로 업그레이드 하는 방법은 간단하게 2.0 jar파일을 적당한 라이브러리 폴더에 복사해 넣으면 됩니다.

1.2.X 스타일의 XML 설정 파일들은 2.0 환경에서도 100% 호환이 되긴 하지만 2.0에 새로 추가된 기능들 중 몇개(새로운 scope, 간단한 AOP 설정, 트랜잭션 설정)은 사용할 수 없습니다.

2.7.1. Changes

바뀐 내용에 대한 것은 Spring 설치 폴더에 ‘changelog.txt’파일에서 참조할 수 있습니다.

2.7.1.1. Supported JDK versions

2006년 말에 SUN에서 JDK 1.3을 deprecation 했기 때문에, JDK 1.3 과 관련된 라이브러리는 제거되었습니다. 최소한 JDK 1.4.2 이상의 버전을 사용해야 합니다.

JDK 1.3만 지원하는 WebSphere 4.0 나 5.0을 사용하고 계신다면, 스프링 2.0.6/2.0.7을 사용하시기 바랍니다.

2.7.1.2. Jar packaging

패키징에 변화가 있었습니다. JDO, Hibernate, TopLink를 위한 class들이 더이상 spring.jar파일 안에 들어있지 않습니다.

스프링 MVC 관련 라이브러리를 spring.jar에서 빼서 spring-webmvc.jar 여기로 묶어놨습니다. 포틀릿은 spring-webmvc-struts.jar에 있으며, 두 파일 모두 lib/module 폴더 안에 들어있습니다.

OSGi 호환 Jar 형태로 배포했기 때문에, OSGi 환경에서 스프링 2.5를 사용할 경우 별도의 패키징 작업이 필요하지 않습니다.

2.7.1.3. XML configuration

XSD 기반의 XML을 사용할 것을 권장하며 달라진 것은 1.2 DTD에서는 singleton 속성을 사용했지만 2.0 DTD에서는 scope 속성을 사용해야 합니다.

2.7.1.4. Deprecated classes and methods

다음의 클래스 or 인터페이스는 삭제되었습니다.
    * ResultReader : Use the RowMapper interface instead.
    * BeanFactoryBootstrap : Consider using a BeanFactoryLocator or a custom bootstrap class instead.

2.7.1.5. Apache OJB

Apache OJB와 관련된 코드가 Spring 소스 트리에서 완전히 삭제 되었습니다. 여전히 라이브러리 사용은 가능하지만 Spring
Modules project
.으로 집을 옮겼습니다.

2.7.1.6. iBatis

iBatis SQL Maps 1.3 을 지원하는 코드가 삭제 되었습니다. iBatis SQL Maps 2.0/2.1로 업그레이드 하세요.

2.7.1.7. Hibernate

Hibernate 2.1과 3.0 을 지원하는 코드가 삭제 되었습니다. Hibernate 3.1 이상의 버전들을 지원하며, 이전 버전의 하이버네이트를 사용하신다면 스프링 2.0.6/2.0.7을 사용하세요.

2.7.1.8. JDO

JDO 1.0 을 지원하는 코드가 삭제 되었습니다. JDO 2.0 이상의 버전을 지원하며, 이전 버전의 JDO를 사용하시려면 스프링 2.0.6/2.0.7을 사용하세요.

2.7.1.9. UrlFilenameViewController

The view name that is determined by the UrlFilenameViewController  now takes into account the nested path of the request. 따라서 1.2.x 에서 이 클래스를 사용하고 있었다면 Spring MVC 설정을 살짝 바꿔야 합니다.

2.8. Updated sample applications

샘플 코드도 2.0 코드에 맞게 업그레이드 했으며 spring-with-dependencies.zip 파일안에 들어있습니다. Chapter 26, Showcase applications.

2.9. Improved documentation

Reference에 잘못된 것이 있으면 이곳에 글을 올려주세요~

============================================================
updated 2007-11-21
기존의 글을 스프링 2.5 레퍼런스를 보며 내용을 추가 및 수정했습니다.
기존의 링크를 수정했습니다.