spring로 검색한 결과 :: 시소커뮤니티[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

회원가입 I 비밀번호 찾기


SSISO Community검색
SSISO Community메뉴
[카페목록보기]
[블로그등록하기]  
[블로그리스트]  
SSISO Community카페
블로그 카테고리
정치 경제
문화 칼럼
비디오게임 스포츠
핫이슈 TV
포토 온라인게임
PC게임 에뮬게임
라이프 사람들
유머 만화애니
방송 1
1 1
1 1
1 1
1 1
1

spring로 검색한 결과
등록일:2008-03-21 10:25:41
작성자:
제목:Spring 프레임웍 소개


spring AOP와 IOC 컨테이너

developerWorks
문서 옵션

JavaScript가 필요한 문서 옵션은 디스플레이되지 않습니다.

이 페이지를 이메일로 보내기

이 페이지를 이메일로 보내기

샘플 코드


제안 및 의견
피드백

난이도 : 초급

Naveen Balani, Technical Architect, Webify Solutions

2005 년 6 월 21 일

spring 기술을 사용하여 강력한 J2EE 애플리케이션을 구현한다. Naveen Balani가 spring 시리즈를 통해서 spring 프레임웍을 소개한다. 아울러 spring의 aspect 지향 프로그래밍(AOP)과 Inversion of Control(IOC) 컨테이너도 소개한다.

spring은 오픈 소스 프레임웍으로서 기업 애플리케이션 개발의 복잡성 문제를 다루기 위해 만들어졌다. spring 프레임웍의 가장 큰 장점 중 하나는 레이어 아키텍쳐라는 점이다. J2EE 애플리케이션 개발에 일관된 프레임웍을 제공함과 동시에 원하는 컴포넌트만 선택적으로 사용할 수 있다는 이점이 있다.

이 글에서는 spring 프레임웍을 소개하고자 한다. 먼저 기반 모듈의 관점에서 프레임웍의 기능을 설명하고, 가장 관심을 끄는 두 가지 모듈인 spring aspect 지향 프로그래밍(AOP)과 Inversion of Control(IOC) 컨테이너를 설명하겠다. 전형적인 애플리케이션에서 IOC 컨테이너가 어떻게 작동하는지도 예제를 통해 설명한다.

예제 애플리케이션을 위해 다운로드 섹션에서 spring 프레임웍과 Apache Ant를 다운로드 하라.

spring 프레임웍

spring 프레임웍은 일곱 개의 명확한 모듈로 구성된 레이어 아키텍쳐이다. spring 모듈은 코어 컨테이너의 상단에 구현된다. 여기에서 빈(bean)의 구현, 설정, 관리 방법이 정의된다. (그림 1)



그림 1. spring 프레임웍의 모듈
A diagram of the <font style='background-color: rgb(51, 51, 51);' color='#ffff00' size='4'>spring</font> framework

spring 프레임웍을 구성하는 각 모듈(또는 컴포넌트)은 독립적이거나, 다른 모듈들과 함께 구현된다. 각 컴포넌트의 기능은 다음과 같다.

  • 코어 컨테이너(core container): spring 프레임웍의 핵심 기능을 제공한다. 코어 컨테이너의 주요 컴포넌트는 BeanFactory(Factory 패턴의 구현)이다. BeanFactoryInversion of Control (IOC) 패턴을 사용하여 애플리케이션의 설정 및 의존성 스팩을 실제 애플리케이션 코드에서 분리시킨다.
  • spring 컨텍스트(spring context): spring 프레임웍에 컨텍스트 정보를 제공하는 설정 파일이다. spring 컨텍스트에는 JNDI, EJB, 국제화, 밸리데이션, 스케줄링 같은 엔터프라이즈 서비스들이 포함된다.
  • spring AOP 모듈(spring AOP): 설정 관리 기능을 통해 aspect 지향 프로그래밍 기능을 spring 프레임웍과 직접 통합시킨다. 따라서 spring 프레임웍에서 관리되는 모든 객체에서 AOP가 가능하다. spring AOP 모듈은 spring 기반 애플리케이션에서 객체에 트랜잭션 관리 서비스를 제공한다. spring AOP에서는 EJB 컴포넌트에 의존하지 않고도 선언적 트랜잭션 관리를 애플리케이션과 결합할 수 있다.
  • spring DAO: spring JDBC DAO 추상 레이어는 다른 데이터베이스 벤더들의 예외 핸들링과 오류 메시지를 관리하는 중요한 예외 계층을 제공한다. 이 예외 계층은 오류 핸들링을 간소화하고, 예외 코드의 양도 줄여준다. spring DAO의 JDBC 예외는 일반 DAO 예외 계층에 순응한다.
  • spring ORM: 프레임웍은 여러 ORM 프레임웍에 플러그인 되어, Object Relational 툴 (JDO, Hibernate, iBatis SQL Map)을 제공한다. 이 모든 것은 spring의 일반 트랜잭션과 DAO 예외 계층에 순응한다.
  • spring Web module: 웹 컨텍스트 모듈은 애플리케이션 컨텍스트 모듈의 상단에 구현되어, 웹 기반 애플리케이션에 컨텍스트를 제공한다. spring 프레임웍은 Jakarta Struts와의 통합을 지원한다. 웹 모듈은 다중 요청을 핸들링하고, 요청 매개변수를 도메인 객체로 바인딩하는 작업을 수월하게 한다.
  • spring MVC framework: MVC 프레임웍은 완전한 기능을 갖춘 MVC 구현이다. MVC 프레임웍은 전략 인터페이스를 통해 설정할 수 있으며, JSP, Velocity, Tiles, iText, POI 같은 다양한 뷰 기술을 허용한다.

spring 프레임웍 기능은 J2EE 서버에 사용될 수 있으며, 대부분 다른 환경에서도 받아들여진다. spring의 초점은 특정 J2EE 서비스로 묶이지 않은 재사용 가능한 비즈니스 및 데이터-액세스 객체들을 허용하는 것이다. 이 같은 객체들은 J2EE 환경(웹 또는 EJB), 스탠드얼론 애플리케이션, 테스트 환경을 통해 재사용 될 수 있다.




위로


IOC와 AOP

제어 역행(Inversion of Control) 패턴의 기본 개념은 객체를 구현하지 않고 구현되는 방법을 기술하는 것이다. 컴포넌트와 서비스들을 코드에 직접 연결하지는 않지만, 설정 파일에서 어떤 컴포넌트가 어떤 서비스를 요구하는지를 기술한다. 컨테이너(이 경우, spring 프레임웍, IOC 컨테이너)는 이 모든 것을 연결한다.

전형적인 IOC 시나리오에서, 컨테이너는 모든 객체들을 만들고 필요한 속성들을 설정하여, 이들을 한데 연결하고 메소드가 언제 호출될 것인지를 결정한다. IOC의 이 세 가지 구현 패턴을 아래 테이블에 정리했다.

Type 1서비스는 정용 인터페이스를 구현해야 한다. 이 인터페이스를 통해 종속관계에 있는 객체들이 제공된다.
Type 2JavaBeans 속성(세터 메소드)를 통해 종속 관계가 할당된다.
Type 3종속 관계가 생성자 매개변수로서 제공되고 JavaBeans 속성으로서는 노출되지 않는다.

spring 프레임웍은 IOC 컨테이너 구현에 Type 2와 Type 3 구현을 사용한다.

Aspect-지향 프로그래밍

Aspect-oriented programming(AOP)은 프로그래머들이 크로스커팅 문제를 모듈화 할 때, 사용하는 프로그래밍 기술이거나 로깅과 트랜잭션 관리 같은 전형적인 책임들을 분할하는 작동이다. AOP의 핵심 생성자는 aspect이다. 이것은 다중 클래스에 영향을 미치는 작동들을 재사용 가능한 모듈로 캡슐화 한다.

AOP와 IOC는 기업 애플리케이션 환경의 복잡한 문제에 모듈식의 접근 방식을 취한다는 점에서 상호 보완적인 기술이라고 할 수 있다. 전형적인 객체 지향 개발 방식에서는 메소드와 자바 클래스에 로거(logger) 문장을 배치하여 로깅 기능을 구현한다. AOP 방식에서는 로깅 서비스를 모듈화 하고, 이를 로깅을 필요로 하는 컴포넌트에 적용한다. 장점은 자바 클래스가 로깅 서비스의 존재를 인식할 필요가 없고, 관련 코드에만 집중한다는 점이다. 결과적으로 spring AOP를 사용하여 작성된 애플리케이션 코드는 약결합이다.

AOP 기능은 트랜잭션 관리, 로깅, 기타 다양한 기능들을 위해 spring 컨텍스트로 통합된다.




위로


IOC 컨테이너

spring 디자인의 핵심은 org.springframework.beans 패키지이다. JavaBean 컴포넌트와 함께 사용할 수 있도록 설계되었다. 이 패키지는 사용자가 직접 사용하지는 않는다. 다만 다른 기능에 대한 기반 미디어로 작동한다. 그 다음으로 중요한 추상화 레이어는 BeanFactory 인터페이스이다. 이것은 객체들이 이름별로 생성 및 검색되도록 Factory 디자인 패턴의 구현이다. BeanFactory는 객체들 간 관계도 관리한다.

BeanFactory는 다음 두 개의 객체 모드를 지원한다.

  • Singleton 모드는 객체의 공유 인스턴스에 특별한 이름을 부여한다. 이는 룩업(lookup) 시 검색된다. Singleton은 디폴트이고, 가장 빈번히 사용되는 객체 모드이다. 스테이트리스(stateless) 서비스 객체에 이상적이다.
  • Prototype 모드는 각각의 검색 결과가 독립적인 객체의 구현이 되도록 한다. Prototype 모드는 사용자가 자신의 객체를 가져야 하는 곳에 사용된다.

빈 팩토리 개념은 IOC 컨테이너로서의 spring의 토대이다. IOC는 그 책임을 이 프레임웍으로 이동시키고, 애플리케이션 코드로부터 멀어진다. 다음 예제에서 보여주겠지만, spring 프레임웍은 JavaBean 속성과 설정 데이터를 사용하여 어떤 종속 관계들이 설정되었는지를 분석한다.

BeanFactory 인터페이스

org.springframework.beans.factory.BeanFactory는 간단한 인터페이스이기 때문에 광범위한 기반 스토리지 메소드를 위해서도 구현될 수 있다. 가장 일반적으로 사용되는 BeanFactory 정의는 XmlBeanFactory이다. 이것은 XML 파일의 정의를 기반으로 빈을 로딩한다. (Listing 1)



Listing 1. XmlBeanFactory
BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));

XML 파일에서 정의된 빈들은 느리게 로딩된다. 다시 말해서, 빈이 요청되기 전 까지는 인스턴스화 되지 않는다. BeanFactory에서 빈을 검색하려면 getBean()메소드를 호출한다. (Listing 2)



Listing 2. getBean()
MyBean mybean = (MyBean) factory.getBean("mybean");

빈의 정의는 POJO(클래스 이름과 JavaBean 초기화 속성에 의해 정의된다.) 또는 FactoryBean이 될 수 있다. FactoryBean 인터페이스는 인다이렉션 레벨을 spring 프레임웍을 사용하여 구현된 애플리케이션에 추가한다.




위로


IOC 예제

제어 역행(inversion of control)을 이해할 수 있는 가장 쉬운 방법은 작동법을 이해하는 것이다. spring IOC 컨테이너를 통해 애플리케이션 종속 관계들을 투입하는 방법을 설명하면서 이 글을 마치도록 하겠다.

온라인 신용 카드 계정을 개설하는 사용 케이스 예제를 설명하겠다. 신용 카드 계정을 개설하기 위해 사용자는 다음 서비스들과 인터랙팅 해야 한다.

  • 사용자 신용 내역 정보를 쿼리하는 신용 등급 서비스
  • 신용 카드와 은행 정보를 통해 고객의 정보를 기입 및 연결하는 원격 신용 연결 서비스
  • 신용 카드의 상태를 사용자에게 이메일로 전송하는 이메일 서비스



위로


세 가지 인터페이스

이 서비스는 이미 존재하고 이들을 약결합 방식으로 통합한다고 가정한다. 아래 리스팅은 이 세 가지 서비스에 대한 애플리케이션 인터페이스이다.



Listing 3. CreditRatingInterface
public interface CreditRatingInterface {

public boolean getUserCreditHistoryInformation(ICustomer iCustomer);

}

Listing 3의 신용 등급 인터페이스는 신용 내역 정보를 제공한다. 사용자 정보를 포함하고 있는 Customer 객체가 필요하다. 구현은 CreditRating 클래스에서 제공한다.



Listing 4. CreditLinkingInterface
public interface CreditLinkingInterface {

public String getUrl();

public void setUrl(String url);

public void linkCreditBankAccount() throws Exception ;

}

신용 연결 인터페이스는 신용 내역 정보를 은행 정보와 연결하고 신용 카드 정보를 기입한다. 신용 연결 인터페이스는 getUrl() 메소드를 통해 검색되는 원격 서비스이다. URL은 spring 프레임웍의 빈 설정 메커니즘을 통해 설정된다. 구현은 CreditLinking 클래스에서 제공한다.



Listing 5. EmailInterface
public interface EmailInterface {

public void sendEmail(ICustomer iCustomer);

public String getFromEmail();

public void setFromEmail(String fromEmail) ;

public String getPassword();

public void setPassword(String password) ;

public String getSmtpHost() ;

public void setSmtpHost(String smtpHost);

public String getUserId() ;

public void setUserId(String userId);
}

EmailInterface는 사용자에게 신용 카드의 상태를 이메일로 알려준다. SMPT 호스트, 사용자, 패스워드 같은 메일 설정 매개변수들은 앞서 언급한 빈 설정 메커니즘을 통해 설정된다. Email 클래스가 구현을 제공한다.




위로


spring

이 모든 인터페이스를 갖춘 후에 할 일은 이들을 약결합 방식으로 통합하는 것이다. Listing 6에서 신용 카드 계정의 사용 케이스 구현을 볼 수 있다.

모든 세터 메소드들은 spring 설정 빈들을 통해 구현된다. 모든 종속 관계들(세 가지 인터페이스)은 이러한 빈들을 사용하여 spring 프레임웍에 의해 투입될 수 있다. createCreditCardAccount() 메소드는 이 서비스를 사용하여 구현의 나머지 부분을 수행한다. Listing 7spring 설정 파일이다. 강조할 부분은 화살표를 사용했다.




위로


애플리케이션 실행

예제 애플리케이션을 실행하려면 spring 프레임웍과 모든 종속 관계 파일들을 다운로드 해야 한다. 그런 다음, 이 프레임웍을 c:\에서 압축을 풀면 C:\spring-framework-1.2-rc2 폴더가 만들어진다. Apache Ant도 다운로드 해야 한다.

소스 코드를 c:\ 에 압축을 풀면 springProject 폴더가 만들어진다. 이 spring 라이브러리를 복사한다. C:\spring-framework-1.2-rc2\dist에서 spring.jarC:\spring-framework-1.2-rc2\lib\jakarta-commonscommons-logging.jarspringProject\lib 폴더에 복사한다. 그 다음에는 필요한 구현 종속 관계를 설정한다.

명령어 프롬프트를 열고 디렉토리를 springProject로 변경하고, 다음 명령어(build)를 명령어 프롬프트에 입력한다.

이것은 CreateCreditAccountClient 클래스를 구현하여 실행한다. 이 클래스는 Customer 클래스 객체를 만들고 이를 파퓰레이트 하여 CreateCreditCardAccount 클래스를 호출하여 신용 카드 계정을 만들어서 연결한다. CreateCreditAccountClientClassPathXmlApplicationContext를 통해 spring 설정 파일도 로딩한다. 일단 빈이 로딩되면 getBean() 메소드를 통해 액세스 할 수 있다.



Listing 8. spring 설정 파일 로딩
ClassPathXmlApplicationContext appContext = 
new ClassPathXmlApplicationContext(new String[] {
"springexample-creditaccount.xml"
});

CreateCreditCardAccountInterface creditCardAccount =
(CreateCreditCardAccountInterface)
appContext.getBean("createCreditCard");




위로


결론

지금까지 spring 프레임웍의 기초를 설명했다. spring 아키텍쳐를 구성하고 있는 일곱 개의 모듈을 설명하고, 이중 두 가지 spring AOP와 IOC 컨테이너를 집중적으로 설명했다.

실행 예제를 통해서 IOC 패턴이 분산 시스템들을 약결합 방식으로 통합하는 방법도 설명했다. 이 예제에서 종속 관계 또는 서비스들을 신용 카드 계정 애플리케이션에 투입하는 것이 얼마나 간단한지도 직접 경험했다.

다음 글을 기대하기 바란다. spring AOP 모델이 엔터프라이즈 애플리케이션에 영속성 지원을 어떻게 수행하는지를 설명하고 spring MVC 모듈과 관련 플러그인들도 설명하겠다.





위로


다운로드 하십시오

설명이름크기다운로드 방식
Examples: source code, spring files, build scriptswa-spring1-springProject.zip9 KB  FTP
다운로드 방식에 대한 정보Get Adobe® Reader®


참고자료



필자소개


Naveen Balani: 아키텍트, Webify Solutions