From Spring 1.x Spring 2.0 To 이일민 (Consultant, Epril) 안영회 (Consultant, Epril)
2 목차 q Spring의목표와전략 q Spring 2.0 q Core Container and DI q AOP q Portable Service Abstractions q Web q Spring Portfolio
3 Spring 2.0 으로가는길 q Spring 2.0 을잘알고싶다면 Spring 의 목표와전략을잘이해하는것이그첫걸음이다 q Spring 의기능위주로접근하면 Spring 을제대로알기힘들다 q 그리고나서 Spring 2.0 이 1.x 에비해서그 목표와전략을어떻게더발전시켰는가를이해하도록한다
4 Spring Framework 은 q 경량급풀스택 JSE/JEE 애플리케이션프레임워크 q 경량급 (Lightweight) q 비침략적 (Non-invasive) q 규모가작고기술이가볍다는의미가아님 q Full Stack q HelloWorld, JSE, JEE q 모든레이어 (UI, Service, Domain, Data ) q 애플리케이션프레임워크 q 애플리케이션개발을쉽고견고하게
5 Spring 의목표 q Spring 을이해하는가장좋은방법은 Spring 이지향하는목표를이해하는것이다 q Spring 의목표 qpojo 를이용한애플리케이션개발 q 엔터프라이즈서비스를선언적 (declarative), 비침략적 (noninvasive) 인방법으로 POJO 에적용 q 자바코드에수정을주지않고트랜잭션을적용 q POJO 를그대로 WebService, RMI 서비스 endpoint 로사용
6 POJO/Simple Object q POJO(Plain Old Java Object) q Martin Folwer q EJB Bean 과차별적인개념으로시작 q 특정규약 (contract) 에의존적이지않다 q EJB Home/Remote Interface q 환경 (environment) 에의존적이지않다 q 특정환경에제한을받는 class를사용하지않는다 q 특정 lookup방식을사용하지않는다
7 POJO 방식의장점 (1) q 코드가간결해진다 q 높은유연성을가진다 q 재사용에유리하다 q 이해가쉽다 q 코드가특정환경에의존적이지않는다 q 개발자가 Infrastructure 가아닌업무로직 (business logic) 에집중할수있다 q 고립된상태에서테스트 (isolation test) 하기가쉽다
8 POJO 방식의장점 (2) q 개발자들이특정기술에대한관심보다 OO 디자인원칙에집중할수있도록해준다
9 Declarative Service (1) q POJO 개발이좋다는것은알지만엔터프라이즈애플리케이션을만들기위한많은엔 터프라이즈서비스를어떻게적용할것인가? q 1) POJO 의장점을포기하고적당히타협한다 (EJB ) q 2) 선언적인서비스로 POJO 를 decorate 한다.(Spring!)
10 Declarative Service (2) q POJO 와선언적서비스를이용하면 POJO 코드를그대로유지한채로 q JTA 트랜잭션에서 JDBC 트랜잭션으로 q RMI endpoint에서 SOAP endpoint로 전환이가능하다
11 Spring 의전략 F L E T E S O B J C T - O R I E N T E D X I B L E L E S M P L E A B
12 Spring 의기술 q Enabling technologies POJO Portable Service Abstraction
13 Spring 2.0 q Spring 1.x 와완벽한호환 q Spring 1.x 코드를그대로확장 q POJO 기반의개발이라는목표유지 q 많은새로운기능의추가를통해서 더강력 (powerful) 한방법으로 더단순 (simple) 하게작업을수행할수있도록만들었다
14 Backwards Compatibility q Spring 1.x 에서 2.0 으로업그레이드하는가장빠른방법은? q Spring2.0 의 spring.jar 로덮어쓰기 q 완벽한기존버전과호환 q 1.x 기반으로개발된애플리케이션을그대로사용할수있음 q Java 1.3, 1.4, 5, 6 q Spring 프레임워크의뛰어난유연성과확장성 q 개발자자신만의 Spring 버전으로확장
15 Spring2.0 IoC/DI Container q Namespace를이용한설정의단순화 q Bean Lifecycle(scope) 의확장 q Singleton, prototype, request, session q Custom scope q JVM 기반의 ( 스크립트 ) 언어 bean 지원 q Groovy q JRuby q BeanShell POJO
16 Namespace 를이용한 XML 설정 q Spring 1.x q <bean id= class= > <property name= ref= /> </bean> q Spring 2.0 q <bean /> q <jee:* /> JNDI, JEE q <util:* /> Common Task q <lang:* /> 스크립트언어 q <aop:* /> AOP q <tx:* /> 트랜잭션관리
17 Namespace 를이용한 XML 설정 q XML Schema Validation q 다양한툴의지원 q 코드완성기능 q 도메인에특화된자유로운설정가능 q 개발자가만든 Custom namespace/tag q Spring설정이 XML hell이라는것은거짓 q 3-rd party의 Spring component 개발이가능 q DTD(1.x)/Schema(2.0) 동시지원
18 Namespace 를이용한 XML 설정 q JNDI lookup <bean id="datasource" class="org.springframework...jndiobjectfactorybean"> <property name="jndiname" value="jdbc/jpetsore" /> </bean> <jee:jndi-lookup id="datasource" jndi-name="jdbc/jpetstore"/> IDE 코드자동완성지원
19 Namespace 를이용한 XML 설정 q 여러개의 bean 을 tag 하나로정의하기 2 3 1 4 <bean class="org.springframework...defaultadvisorautoproxycreator"/> <bean class="org.springframework...transactionattributesourceadvisor"> <property name="transactioninterceptor ref="transactioninterceptor"/> </bean> <bean id="transactioninterceptor class="org.springframework...transactioninterceptor"> <property name="transactionmanager ref="transactionmanager"/> <property name="transactionattributesource"> <bean class="org.springframework...annotationstransactionattributesource"> </bean> </property> </bean> <tx:annotation-driven />
20 Lifecycle(Scope) 지원 q Sprng 1.x q Singleton, Prototype q Spring 2.0 q Bean Object 의저장방법에따라다양한 Scope 로확장 q Request q Session q Clustered Cache q Custom Scope
21 JVM 언어 bean 지원 q 다양한언어로 bean 개발가능 q Spring 2.0 은 JVM 레벨의컨테이너 q 스크립트언어의활용 q JRuby, Groovy, Beanshell q 새로운언어지원추가 q Refreshable Bean 기능
22 Spring 2.0 AOP q <aop:* /> 태그지원 q AspectJ와긴밀한연동 q Adrian Coyler: Spring CTO, AspectJ Lead q SpringAOP의부족한점을보강 q Pointcut Expression Language q POJO Aspect(XML Schema, @AspectJ) q AspectJ language Aspect q Spring bean 이아닌 object 에 Aspect 적용가능 POJO
23 AOP 의필요성 q POJO 를유지하며다음의요구사항을충족하려면? q Service Layer는반드시트랜잭션안에서실행되야한다 q Hibernate를직접이용하는 DAO작업이실패할때발생하는 exception을변환한다 q Controller/JSP에서는 DAO를바로호출할수없어야한다 q 중요한 busimess method 실행이실패하면여러차례재시도를한다
24 @AspectJ 를이용한 Aspect 설정 @AspectJ public class EMailNotificationAspect { EMailService emailservice; @After( execution(* com.xxx.yyy.service.*(string)) && args(msg) ) public void mailnotify(string msg) { eamilservice.notifybyemail(msg); } } <aop:aspectj-autoproxy /> <bean id= emailnotificationaspect" class= com.xxx.aspect.emailnotificationaspect"> <property name= emailservice ref= emailservice /> </bean>
25 XML 을이용한 Aspect 설정 public class EMailNotificationAspect { EMailService emailservice; public void mailnotify(string msg) { eamilservice.notifybyemail(msg); } } <aop:config> <aop:aspect id= emailnotification" ref= emailnotificationaspect"> <aop:after method= mailnotify" pointcut="execution(* com.xxx.yyy.service.*(string)) && args(msg) /> </aop:aspect> </aop:config> <bean id= emailnotificationaspect" class= com.xxx.aspect.emailnotificationaspect"> <property name= emailservice ref= emailservice /> </bean>
26 Portable Service Abstraction q JPA Integration q Spring의가장많은지원을받을 ORM q 기존의 ORM지원기능과일관된방식지원 q JpaTemplate q JpaDaoSupport q JpaTransactionManager q JPA 를위한추가기능 q LocalEntityManagerFactoryBean 또는 JNDI EntityManagerFactory q Class File Transformer(LTW) q AbstractJpaTests q JPA Annotation 지원 POJO Portable Service Abstraction
27 Portable Service Abstraction q SimpleJdbcTemplate q Java5 의새로운기능을적용 q Varargs, Autoboxing, Parameterized methods jdbctemplate.queryforint("select COUNT(0) FROM T_CLIENT WHERE TYPE=? AND CURRENCY=?", new Object[] { new Integer(13), "GBP" } ); jdbctemplate.queryforint("select COUNT(0) FROM T_CLIENT WHERE TYPE=? AND CURRENCY=?", 13, "GBP" );
28 Portable Service Abstraction q Asynchronous JMS q Message Driven POJO q JMS 의 MessageListener 를대신해사용할수있는 SessionAwareMessageListener 지원 q JMS Session 을사용할수있다 q Reply message q 다양한 ListenerContainer 지원 q DefaultMessageListenerContainer q ServerSessionMessageListenerContainer q SimpleMessageListenerContainer
29 Spring 2.0 Web Layer q Form Tag 지원 <spring:bind path= member.name > <input type= text name= ${status.expression} value= ${status.value} </spring:bind> <form:input path= name />
30 Spring 2.0 Web Layer q Portlet 지원 q SpringMVC 와동일한개발방식지원 q DispatcherPortlet q Handler Mappings q Handler Interceptors q Controller Hierachy q View Resolvers q Pluggable View q Data Binding, Validation
31 Spring Portfolio q Spring Framework의뛰어난유연성과확장성을통해서다양한확장프레임워크와솔루션의발전 q J2EE의전영역, 레이어, 다양한기술을지원 q Interface21뿐아니라다양한오픈소스개발자와기업을통해서자발적으로발전 q Spring Core Framework(SFW) 과서브프로젝트, 3-rd party product들로구성
32 Spring Portfolio q Data Access Layer q JDBC, ibatis, JDO, Hibernate, TopLink지원 q JPA 지원 (Hibernate, OpenJPA, Toplink essentials) q Enterprise system: CICS, JMS, JCA CCI q Spring LDAP
33 Spring Portfolio q Service Layer q Scheduling:JDK Timer, Quartz q Asychronous task: TaskExecutor (ThreadPool, CommonJ WorkManager) q Messaging q JMS기반의 Message Driven POJO q Spring Web Services: (Castor, JAXB) q ESB Integration: Mule
34 Spring Portfolio q Clustering q Coherence s DataGrid for Spring q Terracotta q Gigaspace for Spring q Security q Acegi Security (Spring Security)
35 Spring Portfolio q Presentation Layer q Spring Rich Client q SpringMVC q Spring Web Flow q SpringIDE q Ajax: DWR for Spring
36 Spring Portfolio q Web Services q Simple RPC: XFire Exporter q Spring Web Services q AOP q OXM q SpringMVC 방식의 Service Framework q WS-Security와 SpringSecurity의통합 q SpringAOP q AspectJ
37 Spring Portfolio q Spring OSGi q Spring 2.1에서정식지원 q 새로운 Module/Hot deployment 표준 q Spring을이용해서 OSGi bundle을손쉽게작성 q OSGi namespace
38 Spring Portfolio q 다이나믹스크립트언어통합 q JRuby q Groovy q Beanshell
39 참고자료 q Expert One-on-One J2EE Development without EJB q Rod Johnson, Juegen Hoeller q Spring 2.0 Reference Manual q http://static.springframework.org/spring/docs/2.0.x/ref erence/index.html q Spring 2.0 What s New and Why It Matters q http://www.infoq.com/articles/spring-2-intro q From Spring One to Spring Two, Spring Fundamentals and Philosophy, JMS in Spring 2 Environment, Spring OSGi, Get Your JRuby On q TheSpringExperience 2006
감사합니다! Q & A