Presentation Layer
>> CONTROLLER : 사용자의 요청을 받는 부분
Businees Layer
>> SERVICE : 비즈니스 로직을 처리할 계층
>> Tx 처리를 해야하는 부분
Persistence Layer
>> DAO : CRUD가 이뤄지는 계층
>> TransactionManager란?
- DAO의 각 매서드는 개별 Connection을 사용 ==> 1개의 Connection을 사용하도록 해야 Rollback하여 되돌릴 수 있음
==>> DAO에서 Connection을 얻거나 반환할떄 DataSourceUtils를 사용해야 한다.
===> Connection con = DataSourceUtils.getConnection(ds);
===> DataSourceUtils.releaseConnection(con, ds);
>> TransactionManager로 Transaction적용하기
>> TransactionManger가 하나의 Tx으로 진행되도록 한다.
public void insertWithTx() throws Exception{
PlatformTransactionManager tm = new DataSourceTranscationManager(ds);
TransactionStatus status = tm.getTransaction(new DefaultTransactionDefinition());
//Tx 시작
try{
a1Dao.insert(1,100);
a1Dao.insert(2,200);
tm.commit(status); -- Tx 끝 // 성공
}catch(Exception exception){
tm.rollback(); -- Tx 끝 // 실패
}
}
>> TransactionManger를 Bean으로 등록하는 방법
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotaion-driven/> <--- @Transactional 이라는 Annotaion을 사용할수있음
>> AOP를 이용한 핵심기능과 부가 기능 분리
핵심기능 : insert()
그가기능 : 그 외
>>
@Transactional ==>을 붙여주면 위와같이 실행된다.
a1Dao.insert(1,100);
a1Dao.insert(2,200);
============================================================================================
>> TransactionManager를 통해서 Tx는 하나로 묶어주기떄문에
>> insert시에 Primary Key로 인해 첫번쨰 insert는 성공하지만 두번쨰 insert는 실패하게된다
>> 실패시에는 첫번째 성공한 insert또한 rollback되어 처음상태로 돌아간다.
========================================================================================
실습 간 계속 잘 진행되었는데
DataSourceTransactionManager 를 <Bean> 등록한 후 에러가 아래와 같은 에러가 계속 발생하여 확인해 보니
Spring version과 Spring-jdbc version이 달라서 발생한 일이였다.
caused by: org.springframework.beans.factory.beancreationexception:
error creating bean with name 'datasource' defined in url [file:src/main/webapp/web-inf/spring/root-context.xml]:
initialization of bean failed; nested exception is java.lang.nosuchmethoderror:
'boolean org.springframework.core.annotation.annotationutils.iscandidateclass(java.lang.class, java.lang.class)'
'dev > Spring' 카테고리의 다른 글
[Spring] Mybatis -1 (2방법) (0) | 2022.07.12 |
---|---|
[Spring] @Transactional-2 (0) | 2022.07.12 |
[Spring] AOP-2 (0) | 2022.07.12 |
[Spring] Transaction, Commit, Rollback (0) | 2022.07.06 |
[Spring] Di 따라하기 4 (0) | 2022.06.22 |