Spring Framework JDBC, Transaction EBAS 솔루션본부 교육자료 – Spring 프레임워크 Spring Framework JDBC, Transaction 2007. 5
CONTENTS 교육 개요 Spring Transaction 사용방법 Spring JDBC 개념 Spring JDBC 사용방법 교육 목표 및 내용 교육 기대 수준 Spring JDBC 개념 Spring JDBC 란? Spring JDBC를 이용할때 개발자가 구현해야 할 부분 Spring JDBC 사용방법 JdbcTemplate 기반 하에서 구현 SQLObjects를 이용하여 구현 쿼리 관리 PrimaryKey 생성 기능 Spring Transaction 개념 Spring Transacatin ? Spring Transaction 핵심 인터페이스 Spring Transaction 사용방법 프로그램적으로 트랜잭션 처리 선언적으로 트랜잭션 처리
I. 교육 개요 1. 교육목표 및 내용 구분 주요 내용 비고 1. 교육목표 및 내용 2. 교육 기대수준 Spring 프레임워크의 JDBC 및 Transaction 지원에 대한 설명 및 실습 1. Spring JDBC 추상 레이어에 대한 필요성 제시 2. Spring JDBC 추상 레이어의 처리 메커니즘 설명 3. 각 쿼리의 종류에 따른 Spring JDBC 이용 방법에 대한 설명 및 실습 4. J2EE 환경에서의 기본적인 Transaction 처리 메커니즘 설명 5. Spring 프레임워크의 Transaction 처리 방법 설명 및 실습 기본 1시간 2. 교육 기대수준
II. Spring JDBC의 개념 1. Spring JDBC란? Spring JDBC? JDBC를 한 단계 더 추상화시켜 새로운 JDBC API를 제공 SQL 쿼리의 가독성 개발속도 향상 잘못구현으로 인해 발생했던 문제점을 해결 Spring AOP를 통해 Infrastructure에 해당하는 Exception, Logging과 관련한 중복 코드를 제거했지만 퍼시스턴스 계층에서도 많은 중복 코드가 발생
II. Spring JDBC의 개념 2. Spring JDBC를 이용할 때 개발자가 구현해야 할 부분 작업 (DAO 템플릿) 개발자 (DAO 콜백) Connection 관리 O X SQL Statement 관리 ResultSet 관리 Row 데이터 추출 파라미터 선언 파라미터 Setting 트랜젝션 관리 5
III. Spring JDBC 사용방법 1. DataSource 사용 방법 JNDI로 부터 DataSource 사용 org.springframework.jndi.JndiObjectFactoryBean DataSource 커넥션 풀 사용 org.apache.commons.dbcp.BasicDataSource 테스트시에 DataSource 사용 Org.springframework.jdbc.datasource.DriverManagerDataSource 6
III. Spring JDBC 사용방법 2. JdbcTemplate 기반 하에서 구현 Data 쓰기 Data 읽기 getJdbcTemplate().update 메소드 실행 getJdbcTemplate().batchUpdate 메소드 실행 Data 읽기 getJdbcTemplate().query 메소드 실행 Stored Procedure 호출 getjdbcTemplate().execute 메소드 실행 7
III. Spring JDBC 사용방법 3. SqlObjects를 이용하여 구현 데이터베이스 작업을 객체로 모델링하는 방법을 제공 SQLUpdate 객체 만들기 org.springframework.jdbc.object.SqlUpdate 상속 받기 MappingSqlQuery를 사용한 데이버베이스 질의 org.springframework.jdbc.object.MappingSqlQuery 상속 받기 8
III. Spring JDBC 사용방법 4. Primary Key 생성 기능 빈 설정 방법 <bean id="boardFileIncrementer" class="org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer"> <property name="dataSource" ref="dataSource" /> <property name="incrementerName" value="BOARDFILESEQUENCE" /> <property name="columnName" value="VALUE" /> </bean> <bean id="boardIncrementer" class="org.springframework.jdbc.support.incrementer.OracleSequenceMaxValueIncrementer"> <property name="incrementerName" value="BOARDSEQUENCE" /> 9
III. Spring ORM 지원 기능 1. Hibernate 빈 설정 방법 <bean id=“sessionFactory" class=“org.springframework.orm.hibernate.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name=“mappingResource”> <list> <value>foo.hbm.xml</value> <value>bar.hbm.xml</value> </list> </property> <property name=“mappingDirectoryLocations’> <value>classpath:/cyberdigm/custom/maps</value> </bean> 10
III. Spring ORM 지원 기능 2. JDO JDO 빈 설정 방법 썬 마이크로시스템즈의 표준 퍼시스턴스 규약 <bean id=“persistenceManagerFactory" class=“org.springframework.orm.jdo.LocalPersistenceManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name=“jdoProperties”> <props> <prop key=“javax.jdo.option.PersistenceManagerFactoryClass”> ${persistenceManagerFactoryClass} </prop> </props> </property> </bean> 11
III. Spring ORM 지원 기능 3. iBATIS iBATIS 빈 설정 방법 <bean id=“sqlMapClient" class=“org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name=“configLocation”> <value>sql-map-config.xml</value> </property> </bean> 12
III. Spring ORM 지원 기능 4. OJB OJB 빈 설정 방법 13
IV. Spring Transaction 개념 EJB의 성장 원동력 EJB 밴더들의 신뢰할 만한 트랜잭션 지원이 엔터프라이즈 환경에서도 자바가 급성장하게된 원동력. 트랜잭션은 처리는 업무의 데이터 무결성과 직결되기 때문. JDBC기반의 트랜잭션 처리의 문제점 트랜잭션 정책 변경 후 반영하는 데 많은 시간이 소요. EJB 컨테이너의 트랜잭션 처리는 EJB에 국한되어 있어서 EJB를 사용하지 않을 경우에는 이 기능을 사용하기 어려움 비지니스 계층과 퍼시스턴스 계층 어느 곳에서 트랜잭션을 처리해야 할까? 트랜잭션은 업무를 처리하기 위한 단위. 하나의 유즈 케이스에 해당하는 업무를 처리하는 단위는 비즈니스 계층에서 담당하고 있기에 트랜잭션 처리를 비즈니스 계층의 메소드 단위별로 처리하는 것이 좋음. 14
IV. Spring Transaction 개념 비즈니스 계층에서 트랜잭션 처리의 문제 비즈니스 계층에서 트랜잭션을 처리할 경우 트랜잭션 처리를 위한 구현부분이 추가 비즈니스 계층의 복잡도를 증가시키는 결과를 초래 문제 해결 EJB - 선언적 트랜잭션 사용 (EJB 설정 파일에서 트랜잭션을 어떻게 처리해야 할지를 설정) Spring 프레임워크 - EJB컨테이너와 같이 트랜잭션을 선언적으로 처리할 수 있도록 지원 (AOP) Spring Framework에서 지원하고 있는 트랜잭션 처리 POJO 빈을 기반으로 하고 있기 때문에 EJB 컨테이너를 사용하지 않는 곳에서도 EJB와 같은 방법으로 트랜잭션을 처리하는 것이 가능. 15
IV. Spring Transaction 개념 TransactionDefinition 트랜잭션의 4가지 속성(ACID) Atomicity(원자성) 모든 작업 완료 or 모든 작업 완료되지 않음 (Commit or Rollback) 트랜잭션 내의 작업 중 오류가 발생하면 트랜잭션 내의 모든 작업 롤백 Consistency(일관성) 트랜잭션 중에 오류 없이 유효한 데이터만 데이터 베이스에 저장 Isolation(격리성) 트랜잭션 중에 변경된 내용이 트랜잭션이 완료되기 전까지 다른 트랜잭션에 영향을 미쳐서는 안됨 Durability(지속성) 트랜잭션이 완료된 경우 시스템 고장이나 네트워크 에러 등으로 데이터가 유실되지 않고 정상적으로 기록 16
IV. Spring Transaction 개념 TransactionDefinition (org.springframework.transaction.TransactionDefinition) 개발자가 트랜잭션 제어가능 범위 getPropagationBehavior() 트랜잭션이 실행되어야 하는 범위에 대한 제어와 여러 개의 트랜잭션이 어떻게 상호작용하는지 결정 getIsolationLevel() 실행하는 트랜잭션의 격리레벨 지정 현재 트랜잭션 내에서 변경된 데이터가 다른 트랜잭션에 반영될지에 대한 레벨을 결정 getTimeout() 실행하는 트랜잭션이 시작해서 종료할 때까지의 시간을 초 단위로 제어 isReadonly() 실행하는 트랜잭션이 read-only 상태인지 아닌지를 결정 17
IV. Spring Transaction 개념 TransactionDefinition 전달 행위(Propagation Level) 전달 행위 상세 설명 TransactionDefinition .PROPAGATION_REQUIRED 이미 하나의 트랜잭션이 존재하면 그 트랜잭션을 지원하고, 트랜잭션이 없다면 새로운 트랜잭션을 시작한다. .PROPAGATION_SUPPORTS 이미 트랜잭션이 존재하면 그 트랜잭션을 지원하고, 트랜잭션이 없다면 비-트랜잭션 형태로 수행한다. .PROPAGATION_MANDATORY 이미 트랜잭션이 존재하면 그 트랜잭션을 지원하고, 활성화된 트랜잭션이 없다면 예외를 던진다. .PROPAGATION_REQUIRED_NEW 언제나 새로운 트랜잭션을 시작한다. 이미 활성화된 트랜잭션이 있다면 일시 정지한다. .PROPAGATION_NOT_SUPPORTED 활성화된 트랜잭션을 가진 수행을 지원하지 않는다. 언제나 비-트랜잭션으로 수행하고 존재하는 트랜잭션일시 정지한다. .PROPAGATION_NEVER 활성화된 트랜잭션이 존재하더라도 비-트랜잭션으로 수행한다. 활성화된 트랜잭션이 존재하면 예외를 던진다. 18
IV. Spring Transaction 개념 TransactionDefinition PROPAGATION_REQUIRED 이미 트랜젝션이 실행되고 있는 있을 경우 그 트랜젝션이 전달 되서 사용 트랜젝션 보호 아래에 수행으로 데이터를 바꾸는 작업(update, delete)중에 유용하게 사용 Transaction REQUIRED Service Method 1 Tx1 DAO Method 1 Tx1 Tx1 Tx1 Transaction REQUIRED Service Method 2 Tx1 DAO Method 2 Tx1 Tx1 19
IV. Spring Transaction 개념 TransactionDefinition PROPAGATION_SUPPORTS CASE 1 호출하는 클라이언트의 트랜젝션 속성을 그대로 이어 받는다. Transaction REQUIRED Service Method 1 Tx1 DAO Method 1 Tx1 Tx1 Tx1 Transaction SUPPORTS Service Method 2 Tx1 DAO Method 2 Tx1 Tx1 20
IV. Spring Transaction 개념 TransactionDefinition PROPAGATION_SUPPORTS CASE 2 Service Method 1 DAO Method 1 Service Method 2 DAO Method 2 21
IV. Spring Transaction 개념 TransactionDefinition PROPAGATION_MANDATORY CASE 1 메소드가 꼭 트랜젝션 SCOPE 내에서 실행 Transaction REQUIRED Service Method 1 Tx1 DAO Method 1 Tx1 Tx1 Tx1 Transaction REQUIRED Service Method 2 Tx1 DAO Method 2 Tx1 Tx1 22
IllegalTransactionStateException IV. Spring Transaction 개념 2. Spring Transaction 핵심 인터페이스 TransactionDefinition PROPAGATION_MANDATORY CASE 2 Service Method 1 DAO Method 1 IllegalTransactionStateException Service Method 2 DAO Method 2 23
Transaction REQUIRES_NEW IV. Spring Transaction 개념 2. Spring Transaction 핵심 인터페이스 TransactionDefinition PROPAGATION_REQUIRES_NEW 메소드 실행시 언제나 새로운 트랜젝션내에서 수행 Transaction REQUIRED Service Method 1 Tx1 DAO Method 1 Tx1 Tx1 Tx1 Transaction REQUIRES_NEW Service Method 2 Tx2 DAO Method 2 Tx2 Tx2 24
Transaction NOT_SUPPORTED IV. Spring Transaction 개념 2. Spring Transaction 핵심 인터페이스 TransactionDefinition PROPAGATION_NOT_SUPPORTED CASE 1 메소드 실행 시 트랜젝션 반영이 되지 않음. Transaction REQUIRED Service Method 1 Tx1 DAO Method 1 Tx1 Tx1 Tx1 Transaction NOT_SUPPORTED Service Method 2 DAO Method 2 25
Transaction NOT_SUPPORTED IV. Spring Transaction 개념 2. Spring Transaction 핵심 인터페이스 TransactionDefinition PROPAGATION_NOT_SUPPORTED CASE 2 Service Method 1 DAO Method 1 Transaction NOT_SUPPORTED Service Method 2 DAO Method 2 26
IllegalTransactionStateException IV. Spring Transaction 개념 2. Spring Transaction 핵심 인터페이스 TransactionDefinition PROPAGATION_NEVER CASE 1 메소드는 기존 트랜젝션 SCOPE에서 실행될 수 없다. Transaction REQUIRED Service Method 1 Tx1 DAO Method 1 Tx1 Tx1 IllegalTransactionStateException Transaction NEVER Service Method 2 DAO Method 2 27
IV. Spring Transaction 개념 TransactionDefinition PROPAGATION_NEVER CASE 2 Service Method 1 DAO Method 1 Transaction NEVER Service Method 2 DAO Method 2 28
IV. Spring Transaction 개념 TransactionDefinition 격리 레벨(Isolation Level) 격리 레벨 상세 설명 TransactionDefinition .ISOLATION_DEFAULT 개별적인 PlatformTransactionManager를 위한 디폴트 격리 레벨. .ISOLATION_READ_UNCOMMITED 격리 레벨 중 가장 낮은 격리 레벨. 이 격리 레벨은 다른 Commit 되지 않은 트랜잭션에 의해 변경된 데이터를 볼 수 있기 때문에 거의 트랜잭션의 기능을 수행하지 않는다. .ISOLATION_READ_COMMITED 대개의 데이터베이스에서의 디폴트로 지원하는 격리 레벨. 이 격리 레벨은 다른 트랜잭션에 의해 Commit 되지 않은 데이터는 다른 트랜잭션에서 볼 수 없도록 한다. 그러나 개발자들은 다른 트랜잭션에 의해 입력되거나 수정된 데이터를 조회할 수 있다. .ISOLATION_REPEATABLE_READ 다른 트랜잭션이 새로운 데이터를 입력했다면 새롭게 입력된 데이터를 조회할 수 있다는 것을 의미 .ISOLATION_SERIALIZABLE 가장 많은 비용이 들지만 신뢰할 만한 격리 레벨을 제공, 하나의 트랜잭션이 완료된 후에 다른 트랜잭션이 실행하는 것처럼 지원 29
IV. Spring Transaction 개념 TransactionDefinition 격리 레벨(Isolation Level) ANSI 표준 (Preventable Phenomena) 과도기 예방 Dirty Read – Tx1 에서 commit 하지 않은 상태에서 Tx2 가 변경된 값을 반영 Norepeatable Read – Tx1 에서 commit(Update, Delete) 하고 Tx2 가 변경된 값을 반영 Phantom Read – Tx1 에서 commit(Insert) 하고 Tx2 가 삽입된 값을 반영 Level Dirty Read Norepeatable Read Phantom Read READ UNCOMMITTED Permitted READ COMMITTED Not REPEATABLE READ SERIALIZABLE 30
IV. Spring Transaction 개념 TransactionDefinition JDBC 별 사용 가능 Level Oracle은 Read Commited, Serialized, Read-Only를 지원 MS-SQL은 ANSI 표준을 모두 지원 Level Oracle JDBC MS-SQL JDBC READ UNCOMMITTED X O READ COMMITTED REPEATABLE READ SERIALIZABLE 31
IV. Spring Transaction 개념 TransactionStatus (org.springframework.transaction.TransactionStatus) 트랜잭션의 상태를 관리하는 역할을 담당하는 인터페이스 PlatformTransactionManager에서 트랜잭션을 Commit할지 Rollback할지를 결정하기 위해 사용 32
IV. Spring Transaction 개념 PlatformTransactionManager (org.springframework.transaction.PlatformTransactionManager) 실질적인 트랜잭션을 실행하는 역할 PlatformTransactionManager 인터페이스를 구현하는 다양한 구현체 JTA : org.springframework.transaction.jta.JtaTransactionManager JMS : org.springframework.jms.connection.JmsTransactinoManager DataSource : org.springframework.jdbc.datasource.DataSourceTransactionManager Hibernate : org.springframework.orm.hibernate3.HibernateTransactionManager 이외에도 다양한 ORM 프레임워크들을 지원하기 위한 TransactionManager를 지원 TransactionManager 클래스를 참고하여 자체개발하여 사용하는 것이 가능 33
V. Spring Transaction 사용방법 1. 프로그램적으로 트랜잭션 처리 트랜잭션 실질적인 트랜잭션을 실행하는 역할 34
V. Spring Transaction 사용방법 1. 프로그램적으로 트랜잭션 처리 트랜잭션 Template 실질적인 트랜잭션을 실행하는 역할 35
V. Spring Transaction 사용방법 2. 선언적으로 트랜잭션 처리 선언적으로 트랜잭션 처리 실질적인 트랜잭션을 실행하는 역할 36
Q & A