가끔 Spring프레임워크를 사용했다면 아마도 많은 변화가 있었음을 알아차렸을것이다.
이 개정은 수많은 새 기능을 포함하고 현재 존재하는 많은 기능이 검토되고 향상되었다. 사실 Spring의 많은 부분은 Spring개발팀이 Spring릴리즈 버전을 증가시키길 결정할정도로 잘되어 있고 향상되었다. 그리고 Spring 2.0은 플로리다의 Spring Experience 컨퍼런스에서 2005년 12월에 발표되었다.
이 장은 Spring 2.0의 새롭고 향상된 기능을 진술하기 위해 가이드처럼 제공된다. 이것은 Spring아키텍트와 개발자가 Spring 2.0기능에 즉시 친숙해질수 있도록 해준다. 기능에 대해 좀더 깊이 있는 정보를 위해서, 이 장에서 링크되어 있는 관련부분을 참조하라.
아래에서 언급된 새롭고 향상된 몇가지 기능은 Spring 1.2.x릴리즈에 적용되었거나 적용될것이다. 이전버전으로 적용되었는지를 보기 위해 1.2.x릴리즈의 changelog를 보라.
2.0에서 향상된 많은 부분은 Spring IoC컨테이너이다.
Spring XML설정은 지금 좀더 쉬워졌다. XML스키마에 기초하여 새로운 XML설정 문법의 등장에 감사한다. Spring이 제공하는(그리고 Spring 팀은 그러한 문법이 xml을 다소 덜 장황하고 읽기 쉽도록 해주기 때문에 사용하도록 권한다.) 새로운 태그의 장점을 얻고자 할때는, Appendix A, XML 스키마-기반 설정를 보라.
관련노트에서, XML스키마에 기초한 설정의 장점을 가질수 없다면 당신이 참조하도록 Spring 2.0을 위한 새롭고, 업데이트된 DTD가 있다. DOCTYPE선언은 편리성을 위해 아래에 포함되어 있지만, 흥미를 가진 독자는 Spring 2.0배포판의 'dist/resources' 디렉토리에 포함된 'spring-beans-2.0.dtd' DTD를 읽을것이다.
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">
Spring의 이전버전은 정확히 두개의 bean scope(singleton 과 prototype)를 위한 IoC컨테이너 레벨의 지원을 가졌다. Spring 2.0은 Spring이 배치된 환경에 의존하는 추가적인 scope(예를 들면, 웹환경에서 request와 session scope)를 제공할 뿐아니라 Spring 사용자가 자체적인 scope를 통합할수 있도록 'hooks'를 제공하여 이것을 향상시켰다.
singleton- 과 prototype- scope의 bean을 위한 참조(그리고 내부) 구현물이 변경되었더라도 변경사항은 마지막 사용자에게는 완전히 그대로이다. 현재 가지고 있던 설정은 변경할 필요가 없고 문제가 되지 않는다.
새롭게 추가된것과 이전의 scope는 Section 3.5, “Bean scopes”에서 상세히 다루어진다.
XML설정은 작성하기 쉬울뿐 아니라 확장또한 가능하다.
'확장가능한(extensible)'은 애플리케이션 개발자나 이종 프레임워크또는 제품업체가 자체적인 태그를 Spring설정파일에 넣을수 있다는 것을 의미한다. 이것은 당신에게 자체적인 컴포넌트의 특정 설정을 위한 자체적인 도메인 정의 언어를 가지도록 해준다.
사용자정의 Spring태그를 구현하는 것은 모든 애플리케이션 개발자나 프로젝트에 Spring을 사용하는 전사적 아키텍트에 흥미로운 일은 아니다. 우리는 다른 업체가 Spring설정파일에서 사용하기 위한 사용자정의 설정 태그를 개발하는데 흥미를 가지길 기대한다.
확장가능한 설정 기법은 Appendix B, 확장가능한 XML제작에서 좀더 상세하게 다루어진다.
Spring 2.0은 AOP에 대해 많이 향상되었다. Spring AOP프레임워크 자체는 XML내 설정하는게 더 쉽다. 그리고 결과적으로 덜 장황하다. Spring 2.0은 AspectJ pointcut언어와 @AspectJ aspect 선언 스타일과 통합되었다. Chapter 6, Spring을 이용한 Aspect 지향 프로그래밍는 이 새로운 지원을 언급한다.
Spring 2.0은 정규의 Java객체에 의해 지원되는 정의 aspect를 위한 새로운 스키마 지원을 소개한다. 이 지원은 AspectJ pointcut 언어의 장점을 가지고 완전한 타입의(typed) advice를 제공한다(캐스팅 이나 Object[]처리를 하지 않는다). 이 지원에 대한 상세한 정보는 Section 6.3, “Schema-based AOP support”에서 볼수 있다.
Spring 2.0은 @AspectJ 어노테이션을 사용하여 정의된 aspect를 지원한다. 이러한 aspect는 AspectJ와 Spring AOP간에 공유될수 있다. @AspectJ aspect를 위한 지원은 Section 6.2, “@AspectJ 지원”에서 언급된다.
Spring 2.0내에서 트랜잭션을 설정하는 방법은 꽤 변경되었다. 1.2.x스타일의 설정은 계속 유효하게 사용할수 있지만, 새로운 스타일은 다소 덜 장황하고 추천되는 스타일이다. Spring 2.0은 Spring 컨테이너에 의해 생성되지는 않는 객체를 생성하기 위해 사용할수 있는 AspectJ aspect를 가진다.
Chapter 9, 트랜잭션 관리은 모든 상세한 내용을 포함하고 있다.
Spring 2.0은 할당하는 것과 이것의 일반적인 사용 패턴의 범위에서 Spring의 JDBC추상 레이어와 유사한 JPA 추상레이어를 다룬다.
만약 당신이 퍼시스턴스 레이어의 충추로 JPA구현물을 사용하는데 관심을 가진다면, Section 12.6, “JPA”부분에서 상세한 Spring지원을 볼수 있다.
Spring 2.0이전, Spring의 JMS지원은 전송(sending)메시지에 제한되었다. 이 기능(JmsTemplate에 의해 캡슐화되는)이 좋기는 하지만, 비동기적인 메시지의 생성(production)과 소비(consumption)와 같은 완전한 JMS스택을 할당하지는 않는다.
그리고 Spring 2.0은 Section 19.4.2, “비동기적인 수령 - 메시지-기반 POJO”에서 상세히 언급되는것처럼 비동기적인 형태로 메시지의 소비를 위한 완전한 지원을 다룬다.
Spring JDBC추상 프레임워크의 영역에 몇가지 주목할만한 새로운 클래스가 있다. 첫번째는 전통적인 JDBC statement의 ('?') 인자에 반대되는 명명 파라미터를 사용하여 JDBC statement프로그래밍을 위한 지원을 제공하는 NamedParameterJdbcTemplate이다.
또다른 새로운 클래스인 SimpleJdbcTemplate은 JdbcTemplate를 사용하는 것을 목표로한다. 사용하기 좀더 쉬운 JdbcTemplate는 java 5를 사용할때만 사용가능하다.
웹 티어 지원은 Spring 2.0에서 크게 향상되었고 확장되었다.
Spring MVC를 위한 풍부한 JSP태그 라이브러리가 Spring사용자로부터 가장 많이 투표된 JIRA이슈였다.
Spring 2.0은 Spring MVC를 사용할때 좀더 쉬운 JSP페이지를 만들수 있도록 완전한 기능의 JSP태그 라이브러리를 가진다. Spring팀은 JIRA이슈에 관심을 가진 모든 개발자를 만족시킬수 있으리라 확신한다. 새로운 태그 라이브러리는 Section 13.9, “Spring의 폼 태그 라이브러리 사용하기. ”에서 다루어진다. 새로운 태그의 모든 참조는 Appendix E, spring-form.tld에서 볼수 있다.
많은 프로젝트를 위해, 확립된 규칙을 고수하고 합리적인 디폴트를 가지는 것이 필요하다. 설정을 넘어서는 규칙의 생각은 현재 Spring MVC에서 명시적으로 지원한다. 이것이 의미하는 것은 당신이 Controllers를 위한 명명규칙의 세트를 수립한다면, 당신은 핸들러 맵핑, view resolver, ModelAndView, 등등을 셋업하기 위해 필수인 설정의 양을 크게 줄인다. 이것은 빠른 프로토타이핑을 위해서는 굉장한 이익이 되고 코드기반으로 일관성을 부여할수 있다.
Spring MVC의 설정을 넘어선 규칙 지원은 Section 13.11, “설정에 대한 규칙”에서 상세히 설명된다.
Spring 2.0은 Spring MVC프레임워크와 비슷한 개념의 포틀릿 프레임워크를 가진다. Spring 포틀릿 프레임워크의 상세한 정보는 Chapter 16, 포틀릿(Portlet) 통합에서 볼수 있다.
이 마지막 부분은 Spring 2.0에서 새롭고 향상된 모든것을 포함하고 위 부분에서 포함되지 않는것들이다.
Spring 2.0은 Java가 아닌 다른 언어로 작성된 bean을 지원한다. 지원되는 동적 언어는 JRuby, Groovy 그리고 BeanShell이다. 이 동적 언어지원은 Chapter 24, 동적 언어 지원에서 상세히 다루어진다.
Spring프레임워크는 Notifications(통지)를 위한 지원을 가진다. 이것은 MBeanServer로 MBean의 등록행위를 선언적으로 제어하는 것이 가능하다.
Spring 2.0은 작업의 스케줄링에 대한 추상화를 제공한다. 흥미를 가지는 개발자를 위해, Section 23.4, “Spring TaskExecutor 추상화”는 상세한 정보를 포함한다.
당신이 Java 5를 사용하는 몇 안되는 개발 프로젝트에 투입되었다면, 당신은 Java 5를 위한 몇가지 지원을 가지는 Spring 2.0가 마음에 들것이다. 아래는 Spring Java 5 기능을 가리키는 링크이다.
이 마지막부분은 Spring 1.2.x에서 Spring 2.0으로 이전하는 동안 발생하는 이슈를 상세하게 다룬다.
Spring 1.2 애플리케이션에서 Spring 2.0으로 업그레이드하는 것은 Spring 2.0 jar파일을 애플리케이션의 디렉토리 구조에서 적절한 위치에 간단히 두어야만 한다.
마지막 문장의 키워드는 물론 “해야만 한다는 것이다”. 업그레이드는 당신의 코드에서 사용하는 Spring API가 얼마나 많은지에 대해 항상 균일하거나 의존하지 않는다. Spring 2.0은 많은 클래스와 Spring 1.2 코드기반에서 deprecated된것으로 표시된 메소드를 제거했다. 그래서 이러한 클래스와 메소드를 사용한다면, 당신은 물론 대안이 되는 클래스와 메소드를 사용해야만 할것이다.
설정에 관해서, Spring 1.2.x 스타일의 XML설정은 Spring 2.0라이브러리에서 100% 완전하게 호환된다. 물론 Spring 1.2.x DTD를 여전히 사용한다면, Spring 2.0기능의 새로운 장점(scopes 와 좀더 쉬운 AOP 그리고 트랜잭션 설정)을 몇가지 얻을수 없을것이다.
제안되는 이전 전략은 이 릴리즈에 존재하는 향상된 코드로부터 이득을 얻기 위해 Spring 2.0 jar를 두는것이다. 증가된 기초에서, 당신은 Spring 2.0의 새로운 기능과 설정을 사용하여 시작하는 것을 선택한다. 예를 들어, 당신은 새로운 Spring 2.0 스타일로 aspect를 설정하는 것을 시작하도록 선택할수 있다. 이것은 예전 스타일인 Spring 1.2.x설정(1.2.x DTD를 참조하는)을 사용하는 설정의 90%정도 완전히 유효하고 Spring 2.0의 새로운 설정(2.0 DTD 나 XSD를 참조하는)을 사용하여 다른 10%정도가 유효하다. XML설정을 업그레이드하기 위해 Spring 2.0라이브러리를 두도록 강요하지는 않는다.
변경사항의 포괄적인 목록을 위해, Spring 프레임워크 2.0 배포판의 가장 상위 디렉토리에 위치한 'changelog.txt' 파일을 보라.
Spring 프레임워크 jar파일의 패키징은 1.2.x 와 2.0 릴리즈간에 상당히 변경되었다. 특히, JDO, Hibernate 2/3, TopLink ORM통합 클래스를 위한 전용 jar파일이 존재한다. 그것들은 더이상 핵심 'spring.jar' 파일에 포함되지 않는다.
Spring 2.0 은 이전 버전의 DTD보다 좀더 풍부한 형태의 Spring XML 메타데이터 포맷을 언급하는 XSD를 가진다. 예전의 DTD는 여전히 완벽히 지원된다. 하지만 가능하다면 당신은 bean정의 파일의 가장 상위에 XSD파일의 참조를 두도록 권유한다.
변경된 사항은 bean 범위(scope)가 정의되는 방법이다. Spring 1.2 DTD를 사용한다면, 'singleton' 속성을 계속 사용할수 있다. 당신은 어쨌든 'singleton' 속성의 사용을 허락하지 않는 새로운 Spring 2.0 DTD를 참조하도록 선택할수 있다. 하지만 bean생명주기 범위를 정의하는 'scope' 속성을 사용하라.
@deprecated로 표시된 이전의 많은 클래스와 메소드가 Spring 2.0에서 제거되었다. Spring팀은 2.0을 새로운 시작으로 표시하기로 결정했다. 그리고 deprecated된 '결과'는 코드기반에 영향을 주는것을 지속하는 대신에 현재 삭제된다.
이전에 언급한것처럼, 변경의 포괄적인 목록을 위해, Spring 프레임워크 2.0 배포판의 가장 상위 디렉토리에 위치한 'changelog.txt' 파일을 보라.
다음의 클래스/인터페이스는 Spring 2.0 코드기반으로부터 모두 제거되었다.
ResultReader : RowMapper 인터페이스를 대신 사용하라.
BeanReferenceFactoryBean : 사용가능한 별칭 기법을 대신 사용하라.
BeanDefinitionRegistryBuilder : BeanDefinitionReaderUtils 클래스의 편리한 메소드를 대신 사용하라.
BeanFactoryBootstrap : BeanFactoryLocator나 사용자정의 부트스트랩(bootstrap) 클래스를 대신 사용하는 것을 고려하라.
RequestUtils : ServletRequestUtils 를 대신 사용하라.
Apache OJB를 위한 지원이 Spring 소스트리에서 완전히 제거되었다. Apache OJB통합 라이브러리는 여전히 사용가능하다. 하지만 Spring Modules 프로젝트에 있는 새로운 곳에서 찾을수 있다.
많은 수의 샘플 애플리케이션은 Spring 2.0의 새롭고 향상된 기능을 보여주기 위해 업데이트되었다. 그래서 그 애플리케이션들을 자세히 살펴보라. 이미 언급한 샘플 애플리케이션은 Spring배포판('spring-with-dependecies.[zip|tar.gz]')의 'samples'에서 찾을수 있다.
언급한 배포판은 많은 수의 소위 전시용(showcase)이라 불리는 애플리케이션을 포함한다. 이 전시용 애플리케이션은 범위에 제한되고 Spring 2.0의 새로운 기능에 대한 예제를 제공한다. 당신은 이 전시용 애플리케이션에서 일부 코드를 얻을수 있고 사용할수 있다.
Spring 참조문서는 Spring 2.0의 새로운 기능을 반영하기 위해 업데이트되었다.
문서에서 에러가 없도록 확인하는 동안 몇가지 에러가 생겼다. 어떤 오타나 심각한 에러가 발견된다면, 이슈를 올려서 Spring 팀에 에러를 알려달다.