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:26:50
작성자:
제목:Hibernate와 Spring


Hibernate 트랜잭션과 spring AOP

developerWorks
문서 옵션

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

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

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

샘플 코드


제안 및 의견
피드백

난이도 : 초급

Naveen Balani, Technical Architect, Webify Solutions

2005 년 8 월 02 일

Hibernate 트랜잭션과 spring aspect 지향 프로그래밍(AOP)을 통합하는 방법을 설명한다. 이를 통해 영속 프레임웍(persistence framework)을 얻을 수 있다.

이전 글에서 spring AOP와 제어 역행화(IOC) 컨테이너 같은 spring 프레임웍의 일곱 가지 모듈을 소개했다. 약결합 방식으로 분산 시스템을 통합할 때 (spring IOC 컨테이너에서 구현된) IOC 패턴이 어떻게 작동하는지를 간단한 예제를 통해 설명했다.

이번에는 spring의 영속성 지원에 대해 설명하겠다. 이 뱅킹(banking) 예제는 spring AOP의 선언적 트랜잭션 관리 기능과 spring Hibernate의 영속성 골격을 결합한 것이기 때문에 각각의 기술들을 먼저 설명해야 겠다.

우선, 참고자료섹션에서 spring 프레임웍과 Apache Ant를 다운로드한다.

spring AOP

소프트웨어 시스템은 특정 기능을 수행하는 여러 컴포넌트들로 구성된다. 하지만 이러한 컴포넌트들은 본연의 기능 상의 추가적인 일까지 수행한다. 로깅, 트랜잭션 관리, 보안 같은 시스템 서비스들을 컴포넌트들이 수행하고 있다. 이 때문에 코드가 꼬이고 한마디로 엉망이 되는 것이다. aspect 지향 프로그래밍은 이러한 문제를 해결하기 위한 프로그래밍 기술이다. 핵심(core) 프로그래밍 개념으로 역할을 분리한다.

AOP를 사용해도 여전히 시스템의 기본 기능들을 한 장소에 저장하기는 하지만 이 기능을 어떻게, 어디에서 적용할지를 확실히 정의할 수 있다. 로깅과 트랜잭션 관리 같은 크로스커팅 문제를 모듈화 하려면 각 클래스를 개별적으로 수정하지 않고, 코드에 새로운 기능을 추가할 수 있다. 그와 같은 모듈화 된 작업들을 aspects라고 한다.

알고있었나요?

Java™ Enterprise Edition(JEE) 서버에서 spring 프레임웍 기능을 사용할 수 있다. 또한 이것을 관리 환경이 아닌 곳에도 적용할 수 있다. spring의 목표는 특정 JEE 서비스로 묶이지 않은 재사용 가능한 비즈니스와 데이터 액세스 객체들도 허용하는 것이다. JEE 환경(Web 또는 Enterprise JavaBeans(EJB)), 스탠드얼론 애플리케이션, 테스트 환경에서 그 같은 객체들을 재사용 할 수 있다.

예를 들어, 엔터프라이즈 애플리케이션들은 보안과 트랜잭션 지원 같은 서비스가 필요하다. 분명히 그러한 지원 서비스들을 각 클래스에 직접 작성할 수 있지만, 같은 트랜잭션 핸들링 코드를 다양한 트랜잭션 정황에 재작성 할 수 있다. 트랜잭션 핸들링에 spring AOP를 사용한다면 각 메소드를 개별적으로 배치하는 대신 적절한 메소드 호출을 선언식으로(declaratively) 배치할 수 있다.

spring AOP는 JavaBeans에 트랜잭션 정책을 선언할 수 있도록 한다. 예를 들어, TransactionProxyFactoryBean은 메소드 호출을 기존 클래스로 인터셉트하고, 트랜잭션 콘텍스트를 트랜잭션 빈에 적용할 수 있는 편리한 프록시 클래스이다.




위로


Hibernate

spring 프레임웍은 Hibernate, JDO, iBATIS SQL Maps에 통합 지원을 제공한다. IOC의 많은 기능들을 결합하고, 전형적인 Hibernate 통합 문제들을 다룬다. 이 프레임웍의 Hibernate 지원은 spring의 일반 트랜잭션과 데이터 액세스 객체(DAO) 예외 계층과 호환된다.

spring은 OR 매핑 레이어를 사용하여 데이터 액세스 애플리케이션을 만든다. 선택한 기술과는 상관없이 spring의 OR 매핑 지원을 통해 라이브러리 포맷으로 접근 가능하다. 모든 것이 재사용 가능한 JavaBeans로서 디자인되었기 때문이다. ApplicationContext 또는 BeanFactory 내에 있는 OR 매핑은 쉬운 설정과 전개의 이점이 있다.

Hibernate는 자바 플랫폼을 위한 오픈 소스 OR 매핑 프레임웍이다. Hibernate로 일반적인 자바 이디엄을 사용하여, 영속 클래스를 개발할 수 있다. 이디엄에는 제휴, 상속, 다형성, 컴포지션, 자바 컬렉션 프레임웍등이 포함된다. SQL로의 객체 지향 확장으로 설계된 Hibernate Query Language (HQL) 는 객체와 관계형을 연결하는 다리 역할을 한다. Hibernate로 원시 SQL 또는 자바 기반 Criteria/ Example 쿼리를 사용하여 쿼리를 나타낼 수 있다. Hibernate는 XML(*.hbm.xml) 파일을 사용하여 자바 클래스를 테이블에, JavaBeans 속성을 데이터베이스 테이블에 매핑한다.

모든 SQL 데이터베이스 관리 시스템은 JDBC 기술이 지원한다. Hibernate는 모든 대중적인 JEE 애플리케이션 서버와 웹 컨테이너들과 잘 통합된다.




위로


예제

뱅킹 애플리케이션 예제에서 spring AOP와 Hibernate가 함께 작동하는 방법을 볼 수 있다. 은행 계좌 사용 케이스의 경우, 사용자(Customer)가 한 번의 트랜잭션으로 한 개 이상의 은행 계좌를 만들 수 있다. 다중 은행 계좌에 적용할 수도 있다.

애플리케이션 데이터베이스(Cloudscape™)에는 모든 사용자 정보와 계좌 정보가 포함되어 있다. 이 경우, CustomerAccount 클래스 사이에는 1:N 관계가 성립된다. 실제 시나리오에서 이 관계는 m:n으로 모델링 되어야 한다. 공동 명의 계좌를 위해서이다.

사용자는 하나의 트랜잭션으로 여러 계좌들을 사용할 수 있어야 하기 때문에 데이터베이스 인터랙션에 DAO 패턴을 구현한다. 그런 다음 spring AOP의 TransactionProxyFactoryBean을 설정하여 메소드 호출을 인터셉트하고 트랜잭션 컨텍스트를 DAO에 적용한다.




위로


Hibernate 실행

spring 프레임웍에서 JDBC DataSource 또는 Hibernate SessionFactory 같은 리소스들은 애플리케이션에서 빈으로 구현될 수 있다. (다음 섹션 참조) Listing 1은 뱅킹 애플리케이션 예제이다. Hibernate SessionFactory로 JDBC DataSource를 설정하는 방법이 나타나 있다.



Listing 1. JDBC DataSource와 HibernateSessionFactory 연결
<!-- DataSource Property -->
<bean id="exampleDataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>org.apache.derby.jdbc.EmbeddedDriver</value>
</property>
<property name="url">
<value>jdbc:derby:springexample;create=true</value>
</property>
</bean>

<!-- Database Property -->
<bean id="exampleHibernateProperties"
class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop
key="hibernate.dialect">net.sf.hibernate.dialect.DerbyDialect</prop>
<prop
key="hibernate.query.substitutions">true 'T', false 'F'</prop>
<prop key="hibernate.show_sql">false</prop>
<prop key="hibernate.c3p0.minPoolSize">5</prop>
<prop key="hibernate.c3p0.maxPoolSize">20</prop>
<prop key="hibernate.c3p0.timeout">600</prop>
<prop key="hibernate.c3p0.max_statement">50</prop>
<prop
key="hibernate.c3p0.testConnectionOnCheckout">false</prop>
</props>
</property>
</bean>



<!-- Hibernate SessionFactory -->
<bean id="exampleSessionFactory"
class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="exampleDataSource"/>
</property>
<property name="hibernateProperties">
<ref bean="exampleHibernateProperties" />
</property>
<!-- OR mapping files. -->
<property name="mappingResources">
<list>
<value>Customer.hbm.xml</value>
<value>Account.hbm.xml</value>
</list>
</property>


</bean>


Listing 1은 애플리케이션 데이터베이스(Cloudscape) 예제에서 데이터 소스 빈 (exampleDataSource)을 설정하는 방법을 보여주고 있다. exampleDatasource 빈은 spring Hibernate SessionFactory로 전달된다. *.hbm.xml은 예제 애플리케이션의 OR 매핑 파일을 의미한다.

데이터 소스와 세션 팩토리를 설정한 다음, DAO(이 경우 CustomerDAOImpl에서 전달하여, SessionFactory를 사용하는 것이다. 그런 다음 springTransactionProxyFactoryBean을 삽입한다. 이것은 메소드 호출을 애플리케이션의 CustomerDAOImpl 객체로 인터셉트하고 트랜잭션 컨텍스트를 여기에 적용할 것이다.

Listing 2예제에서, CustomerDAOImpl 클래스의 addCustomer 메소드는 PROPAGATION_REQUIRED의 트랜잭션 애트리뷰트와 함께 트랜잭션의 일부로서 실행된다. 이 애트리뷰트는 EJB 컨테이너의 경우 TX_REQUIRED에 해당한다. 메소드가 언제나 트랜잭션에서 실행되기 원한다면 PROPAGATION_REQUIRED를 사용한다. 트랜잭션이 이미 실행 중이면 빈 메소드는 트랜잭션에 참여하거나 spring 경량 트랜잭션 매니저가 이것을 실행할 것이다. 컴포넌트 서비스들이 호출될 때 새로운 트랜잭션이 시작하도록 하려면 PROPAGATION_REQUIRES_NEW 애트리뷰트를 사용한다.

이제 소스 코드를 좀더 자세히 분석해 보자.




위로


분석

필요한 소스를 다운로드 하라. 소스의 압축 파일을 풀어 데스크탑(c:\)에 저장하라. springProjectPart2 폴더가 만들어 질 것이다. src\spring 폴더에는 이 예제 애플리케이션의 Hibernate 매핑 파일과 spring 설정 파일이 있다. src\springexample\hibernate 파일에는 이 애플리케이션의 소스 코드가 들어있다.

여기에서 두 개의 클래스, 주로 CustomerAccount를 찾을 수 있는데, 이들은 Hibernate 매핑 파일을 사용하여 두 개의 테이블로 매핑된다. Customer 클래스는 고객 정보를 나타내고, Account는 고객의 계좌 정보를 나타낸다. 앞서 언급했지만, 이 두 개의 클래스들을 1: N 관계로 모델링 했다. 이를 통해 한 Customer가 다중의 계좌를 보유할 수 있다. Listing 3은 Customer 객체용 Hibernate 매핑 파일을 보여준다.



Listing 3. Customer 객체의 Hibernate 매핑 파일
<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">

<hibernate-mapping>
<class
name="springexample.hibernate.Customer"
table="TBL_CUSTOMER"
dynamic-update="false"
dynamic-insert="false">

<id
name="id"
column="CUSTOMER_ID"
type="java.lang.Long"
unsaved-value="-1"
>
<generator class="native">
</generator>
</id>


<set name ="accounts"
inverse = "true"
cascade="all-delete-orphan">
<key column ="CUSTOMER_ID"/>
<one-to-many class="springexample.hibernate.Account"/>

</set>


<property
name="email"
type="string"
update="false"
insert="true"
column="CUSTOMER_EMAIL"
length="82"
not-null="true"

/>

<property
name="password"
type="string"
update="false"
insert="true"
column="CUSTOMER_PASSWORD"
length="10"
not-null="true"

/>

<property
name="userId"
type="string"
update="false"
insert="true"
column="CUSTOMER_USERID"
length="12"
not-null="true"
unique="true"

/>

<property
name="firstName"
type="string"
update="false"
insert="true"
column="CUSTOMER_FIRSTNAME"
length="25"
not-null="true"

/>

<property
name="lastName"
type="string"
update="false"
insert="true"
column="CUSTOMER_LASTTNAME"
length="25"
not-null="true"

/>

</class>


</hibernate-mapping>

set name="accounts"1: N 클래스 태그는 CustomerAccount의 관계를 말해준다. Account.hbm.xml 파일에서 Account 객체의 매핑을 정의했다.

CustomerDAOImpl.java는 애플리케이션 DAO를 나타낸다. 이것은 고객과 계좌 정보를 애플리케이션 데이터베이스에 삽입한다. CustomerDAOImplspringHibernateDaoSupport를 확장한다. 이로서 spring getHibernateTemplate()을 사용하여 세션 관리가 간단해진다. 따라서 getCustomerAccountInfo() 메소드를 통해 데이터를 저장하거나 검색할 수 있다. 아래의 getCustomerAccountInfo()getHibernateTemplate().find 메소드를 통해 HQL을 사용하여 Customer와 계좌 정보를 찾는다.(Listing 4)



Listing 4. DAO 구현
public class CustomerDAOImpl extends HibernateDaoSupport 
implements CustomerDAO{



public void addCustomer(Customer customer) {
getHibernateTemplate().save(customer);
// TODO Auto-generated method stub

}

public Customer getCustomerAccountInfo(Customer customer) {
Customer cust = null;
List list = getHibernateTemplate().find("from Customer customer " +
"where customer.userId = ?" ,
customer.getUserId(),Hibernate.STRING);

if(list.size() > 0){
cust = (Customer) list.get(0);
}

return cust;


}


이제 코드가 어떻게 실행되는지 보자.




위로


애플리케이션 실행

예제 애플리케이션을 실행하려면 spring 프레임웍과 관련 파일들을 다운로드해야 한다. 그런 다음, 이 프레임웍을 c:\에 추출하면 C:\spring-framework-1.2-rc2 폴더(현재 릴리스 버전)가 생성된다. 계속 진행하기 전에 Apache AntCloudscape를 다운로드하라. Cloudscape를 다운로드 한 후에 c:\ 에 추출하면 C:\Cloudscape_10.0 이 생성된다.

그런 다음 소스 코드를 c:\ 폴더에 추출하면 springProject2 폴더가 생성된다. build.xml 파일 엔트리를 수정하여 C:\spring-framework-1.2-rc2spring을 설치했던 곳과 대체시키고, C:\Program Files\IBM\Cloudscape_10.0을 Cloudscape를 설치했던 곳에 대체한다.

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

이제 CreateBankCustomerClient 클래스가 구현되어 실행될 것이다. 이것은 Customer 클래스 객체를 만들고 이를 몇 개의 데이터와 함께 파퓰레이트 하고, Account 객체를 만들고 이를 파퓰레이트 하고 이것을 Customer 객체에 추가한다.

CreateBankCustomerClientCustomerDAOImpl.addCustomer클래스를 호출하여 고객과 계좌 정보를 추가한다. 일단 삽입되면 CreateBankCustomerClientCustomerDAOImpl.getCustomerAccountInfo 메소드를 호출하여 userid에 기반한 고객과 계좌 정보를 얻는다. CreateBankCustomerClient가 성공적으로 실행되면 콘솔에 userid가 프린트 된다. 또한 Cloudscape 데이터베이스를 쿼리하여 고객 정보와 계좌 정보를 검색한다.




위로


결론

spring Hibernate와 spring AOP를 통합하는 방법을 설명했다. 통합 결과는 트랜잭션을 명확하게 수행할 수 있도록 도와주는 확고한 영속 프레임웍이다.

다음에는 spring Model-View-Controller (MVC) 모듈을 설명하고 이를 사용하여 웹 기반 애플리케이션의 생성을 간소화 하는 방법을 설명하겠다.





위로


다운로드 하십시오

설명이름크기다운로드 방식
Example source code, spring files, build scriptswa-spring2-springProjectPart2.zip12 KB  FTP
다운로드 방식에 대한 정보Get Adobe® Reader®


참고자료

교육

제품 및 기술 얻기

토론


필자소개


Naveen Balani, 아키텍트, Webify Solutions