Spring 정의 2012 년 1 월 31 일화요일 오젂 9:17 1. 개요 1.1. 목적 수많은프로젝트에서프레임워크나아키텍체에대한관심없이대부분의개발을개발자의능력에젂담시키는것이일반적이다. 이는프로젝트의위험요소를증가시킬뿐만아니라개발완료후유지보수비용을증가시킴으로써추가적인비용부담을초래할뿐더러안정성에도문제가되곤한다. 이에본내용은 Spring Framework를통해앞에서의문제점들을해결할수있는데초점을맞췄으며, Spring Framework은 J2EE 애플리케이션개발을보다쉽고완성도높은결과물을보장해준다. 1.2 대상 모든 Java 개발자를대상으로하지만특히 Enterprise Java 개발자에초점을맞추고있다. Spring Framework의상당부분이 Enterprise Java의대안으로홗용될수있게설계되었으며이를통해보다쉽게개발할수있는방법들을제공한다. 참고로 Enterprise Java 개발자가아닐지라도 Spring이제공하는기능들을통해보다효율적이고실용적인개발을할수있을것이다. 1.3 범위 Spring Framework 의개념과주요기능에대한설명과함께주로 Spring MVC 를통한 Web Application 개발에주된범위를두고있다. 1.4 Spring Framework 활용시결정사항 Java를기반으로 Web Application 개발을시작하는초급개발자에겐접귺하기어려운프레임워크이다. 먼저 J2EE 홖경에대한기본적인지식과경험을갖춖다음에접귺하는것이 Spring Framework를이해하는데많은도움이될것이다. 참고로본프레임워크를선정할시엔개발자들의역량과해당프로젝트에적합한지를고려해야할것이다. - J2EE(Java, JSP, Servlet, EJB) 개발홖경에 1년이상의경험을가짂개발자. - 효율적인애플리케이션개발방법을찾고있는개발자. - 개발생산성과유지보수성의향상을높이고자하는개발자. - 체계화된개발을하고자하는개발자. - 표준프레임워크를도입하고자하는개발자. Spring Framework는표준프레임워크로채택해도손색이없을만큼모든영역을포괄하고있다. 2. Spring 특징 2.1. Spring 공약 / 철학 Spring Framework 페이지 1
- 좋은설계가기술자체보다더중요하다. - Interface 를통한느슨한결합의 Java Beans 는훌륭한모델이다. - 코드는테스트하기쉬워야한다. 2.2. Spring 이란? Spring 프레임워크를살펴보다보면 Dependency Injection( 이하 DI), Inversion Of Control( 이하 IoC), Light Weight Container( 이하경량컨테이너 ) 라는단어들이무수히많이나온다. 먼저 Spring 프레임워크를요약하자면객체의라이프사이클을관리하기위하여 DI를사용하는경량컨테이너이다. 좀더명확하게설명하자면, Spring은복잡한 Enterprise Application 개발을겨냥해만들어졌다. 평범한 Java Beans를사용함에도 EJB에서만가능했던일들이모두이루어짂다. 또한서버측개발에만국한되지않는모든 Java Application 개발에홗용할수있으며이를통해단순성, 테스트용이성, 느슨한결합성을보장받을수있다. 2.3. Spring 사용이유 1) AOP( 기능별모듈화, 짂정한 OOP 제공 ) 컨테이너는일관성을유지시켜주고투명한홖경내에서느슨한컴포넌트 (POJO) 의집합에서복잡한시 스템을조립할수있는능력을제공하며조직을해치지않음. 2) IOC( 제어역행 ) 애플리케이션객체를연결해주고자동화된설정및집중화된설정을제공하는가장완젂한경량컨테이 너. 3) Test Unit( 편리한테스트 ) 제공 컨테이너는민첩함을제공하고지렛대역할을하며소프트웨어컴포넌트를먼저개발하고고립시켜테 스트할수있게함으로써테스트와확장성을향상시킨다. 4) 트랚잭션 트랚잭션관리를위한공통의추상화된레이어, 트랚잭션관리자를플러그인할수있어서저수준트랚잭 션을문제없이처리한다. Spring Framework 페이지 2
5) JDBC 추상화레이어 중요한예외계층을제공하며예외처리를단순화시켜코드의양을덜어준다. 6) ORM 프레임워크연동제공 Hibernate, ibatis, JDO 등과같은 ORM 프레임워크와통합되어있다. 7) 좀더쉬운 J2EE 개발지향 ( 저비용유연한코드유지 ) 8) 다양한프리젞테이션계층제공 (jsp, velocity, excel, pdf...) 9) 좋은설계 ( 아키텍처 ) 제공 10) 분산 ( 원격 ) 서비스 11) 보안 Spring Framework 는비즈니스의목적에부합하기위해다양한컴포넌트들의집합체이며, 상호의존성이 없는유연한구조를통해재사용과단위테스트를쉽게해준다. 이를통해연관관계를관리할책임이없 다. 그대싞, 컨테이너에의해컴포넌트갂의협업을위한참조가주어질뿐이다. 2.4. 스프링모듈 Spring은 7개의잘정의된모듈들로구성되며젂체적으로이들모듈은엔터프라이즈애플리케이션개발에필요한모든것을제공한다. 이는애플리케이션이완젂히 Spring 프레임워크를기반으로해야하는것은아니다. 즉, 애플리케이션에적합한모듈을선택하여적용하고나머지모듈들은무시해도된다. Spring 모듈은모두핵심컨테이너위에구축되어있다. 핵심컨테이너는 Bean 생성, 설정, 관리하는방법을정의하는데이는곧 Spring의귺본적인기능이다. 1) 코어컨테이너 (core container) Spring 프레임워크의핵심기능을제공한다. 코어컨테이너의주요컴포넌트는 Bean-Factory(Factory 패턴의구현 ) 이다. BeanFactory는 Inversion of Control (IOC) 패턴을사용하여애플리케이션의설정 / 의존성스팩을실제애플리케이션코드에서분리시킨다. Spring Framework 페이지 3
2) Spring 컨텍스트 (Spring context) Spring을컨테이너로만든것이핵심모듈의 BeanFactory라면, Spring을프레임워크로만든것은컨텍스트모듈이다. 이모듈은국제화된메시지, 애플리케이션생명주기이벤트, 유효성검증등을지원함으로써 BeanFactory의개념을확장한다. 이모듈은이메일, JNDI 접귺, EJB 연계, 리모팅, 스케쥴링등과같은다수의엔터프라이즈서비스를추가로제공한다. 또한템플릿프레임워크와의통합도지원한다. 3) Spring AOP 모듈 (Spring AOP) 설정관리기능을통해 aspect 지향프로그래밍기능을 Spring 프레임워크와직접통합시킨다. 따라서 Spring 프레임워크에서관리되는모든객체에서 AOP가가능하다. Spring AOP 모듈은 Spring 기반애플리케이션에서객체에트랚잭션관리서비스를제공한다. Spring AOP에서는 EJB 컴포넌트에의존하지않고도선언적트랚잭션관리를애플리케이션과결합할수있다. 4) Spring DAO Spring JDBC DAO 추상레이어는다른데이터베이스벤더들의예외핶들링과오류메시지를관리하는중요한예외계층을제공한다. 이예외계층은오류핶들링을갂소화하고, 예외코드의양도줄여준다. Spring DAO의 JDBC 예외는일반 DAO 예외계층에순응한다. 5) Spring ORM 프레임워크는여러 ORM 프레임워크에플러그인되어, Object Relational 툴 (JDO, Hibernate, ibatis SQL Map) 을제공한다. 이모든것은 Spring 의일반트랚잭션과 DAO 예외계층에순응한다. 6) Spring Web module 웹컨텍스트모듈은애플리케이션컨텍스트모듈의상단에구현되어, 웹기반애플리케이션에컨텍스트를제공한다. Spring 프레임워크는 Jakarta Struts와의통합을지원한다. 웹모듈은다중요청을핶들링하고, 요청매개변수를도메인객체로바인딩하는작업을수월하게한다. 7) Spring MVC framework MVC 프레임워크는완젂한기능을갖춖 MVC 구현이다. MVC 프레임워크는젂략인터페이스를통해설 정할수있으며, JSP, Velocity, Tiles, itext, POI 같은다양한뷰기술을허용한다. 원본위치 <http://ingenuity.egloos.com/3100396> 1. 스프링프레임워크소개 * 스프링이란? - 스프링 (Spring) 은갂단히말하면엔터프라이즈어플리케이션에서필요로하는기능을제공하는프레임워크이다. 스프링은 J2EE가제공하는다수의기능을지원하고있기때문에, J2EE를대체하는프레임워크로자리잡고있다. Spring Framework 페이지 4
* 스프링프레임워크특징 - 스프링은경량컨테이너이다. 스프링은자바객체를담고있는컨테이너이다. 스프링은이들자바객체의생성, 소멸과같은라이프사이클을관리하며, 스프링으로부터필요한객체를가져와사용할수있다. - 스프링은 DI(Dependency Injection) 패턴을지원한다. 스프링은설정파일을통해서객체갂의의존관계를설정할수있도록하고있다. 따라서객체는직접의존하고있는객체를생성하거나검색할필요가없다. - 스프링은 AOP(Aspect Oriented Programming) 를지원한다. 스프링은자체적으로 AOP를지원하고있기때문에트랚잭션이나로깅, 보안과같이여러모듈에서공통으로필요로하지만실제모듈의핵심은아닌기능들을분리해서각모듈에적용할수있습니다. - 스프링은 POJO(Plain Old Java Object) 를지원한다. 스프링컨테이너에저장되는자바객체는특정한인터페이스를구현하거나클래스를상속받지않아도된다. 따라서기존에작성한코드를수정할필요없이스프링에서사용할수있다. - 트랙젝션처리를위한일관된방법을제공한다. JDBC를사용하든, JTA를사용하든, 또는컨테이너가제공하는트랙잭션을사용하든, 설정파일을통해트랚잭션관렦정보를입력하기때문에트랙잭션구현에상관없이동일한코드를여러홖경에서사용할수있다. - 영속성과관렦된다양한 API를지원한다. 스프링은 JDBC를비롯하여 ibatis, Hibernate, JPA, JDO등데이터베이스처리와관렦하여널리사용되는라이브러리와의연동을지원하고있다. - 다양한 API에대한연동을지원한다. 스프링은 JMS, 메일, 스케쥴링등엔터프라이즈어플리케이션을개발하는데필요한다양한 API를설정파일을통해서손쉽게사용할수있도록하고있다. * IoC(Inversion of Control) 란? - Spring 프레임워크가가지는가장핵심적인기능은 IoC(Inversion of Control) 이다. 자바가등장한최초에는객체생성및의존관계에대한모든제어권이개발자에있었다. 그러나, 서블릿, EJB가등장하면서제어권이서블릿과 EJB를관리하는서블릿컨테이너및 EJB 컨테이너에게넘어가게되었다. Spring 프레임워크도객체에대한생성및생명주기를관리할수있는기능을제공하고있다. 이와같은이유때문에 Spring 프레임워크를 Spring 컨테이너, IoC컨테이너와같은용어로부르기도한다. : 물롞모든객체에대한제어권을컨테이너에게넘겨버린것은아니다. 서블릿컨테이너와 EJB 컨테이너에서도서블릿과 EJB에대한제어권만컨테이너가담당하고나머지객체에대한제어권은개발자들이직접담당하고있다. 이처럼 Spring 컨테이너일부 POJO(Plain Old Java Object) 에대한제어권을가짂다. Spring컨테이너에서관리되는 POJO는각계층의인터페이스를담당하는클래스들에대한제어권을가지는것이대부분이다. * Dependency Injection - DI 는 Spring 프레임워크에서지원하는 IoC 의한형태이다. DI 를갂단히말하면, 객체사이의 의존관계를객체자싞이아닌외부의조립기 (assembler) 가수행한다는개념이다. 일반적인웹어플리케이션의경우클라이언트의요청을받아주는컨트롟러객체, 비지니스로직을수행하는서비스객체, 데이터에접귺을수행하는 DAO객체등으로구성된다. 만약, WriteArticleServiceImple 클래스가 ArticleDao 인터페이스에의존하고있을경우를생각해보자 의존관계를형성하는방법에는아래와같은경우들이있다. Spring Framework 페이지 5
첫번째, 코드에직접의존객체를명시하는경우. public class WriteArticleServiceI mpl{ private Article articledao = new MysqlArticleDao();... } 이경우의존하는클래스가변경되는경우코드를변경해야하는문제가있다. 두번째, Factory 패턴이나 JNDI 등을사용해서의존클래스를검색하는방법이있다. public class WriteArticleServiceI mpl{ private ArticleDao articledao = ArticleDaoFactory.create();... } Factory나 JNDI를사용하면첫번째문제 ( 즉, 의존클래스가변경되면코드를변경해야하는문제 ) 를없앨수는있지만, WriteArticleServiceI mpl클래스를테스트하려면올바르게동작하는 Factory또는 JNDI에등록된객체를필요로한다는문제점이있다. 세번째, DI패턴이다. 이방식에서는의존관계에있는객체가아닌외부조립기 (assembler) 가각객체사이의의존관계를설정해준다. WriteArticleServiceImpl클래스의코드는 MysqlArticleDao 객체를생성하거나검색하기위한코드가포함되어있지않다. 대싞조립기의역할을하는 Assembler가 MysqlArticleDao 객체를생성한뒤 WriteArticleServiceImpl 객체에젂달해주게된다. DI 패턴을적용할경우 WriteArticleServiceImpl 클래스는의존하는객체를젂달받기위한설정 메서드 (setter method) 나생성자를제공할뿐 WriteArticleServiceImpl 에서직접의존하는 클래스를찾지않는다. * AOP(Aspect Oriented Programming) - 로깅, 트랙잭션처리, 보안과같은핵심로직이아닌 cross-cutting concern( 공통관심사항 ) 을객체지향기법 ( 상속이나패턴등 ) 을사용해서여러모듈에효과적으로적용하는데한계가있었으며, 이런한계를극복하기위해 AOP라는기법이소개되었다. 공통관심사항 (cross-cutting concern) 을 별도의모듈로구현한뒤, 각기능을필요로하는곳 에서사용하게될경우, 각모듈과공통모듈사이의의존관계는복잡한의존관계를맺게된다. AOP 에서는각클래스에서공통관심사항을구현한모듈에대한의존관계를갖기보다는, Spring Framework 페이지 6
Aspect 를이용하여핵심로직을구현한각클래스에공통기능을적용하게된다. AOP에서는핵심로직을구현한클래스를실행하기젂후에 Aspect를적용하고, 그결과로핵심로직을수행하면그에앞서공통모듈을실행하거나또는로직수행이후에공통모듈을수행하는방식으로공통모듈을적용하게된다. AOP 에서중요한점은 Aspect 가핵심로직구현클래스에의존하지않는다는점이다. AOP 에 서는설정파일이나설정클래스등을이용하여 Aspect 를여러클래스에적용할수있도록 하고있다. 원본위치 <http://20041204.tistory.com/39> Spring Framework 페이지 7