1.TransactionManager
하나의 메서드는 하나의 Connection을 가진다. 하지만 하나의 메서드에 하나의 Connection을 가지면 중복된 메서드의 Connection은 개별 커넥션을 갖기 때문에 Tx가 안된다는 문제가 발생한다. 예를들어 UserDao의 deleteUser(100);를 실행하면 메서드에 해당하는 Connection이 commit되면서 100이라는 키를 가진 유저의 정보가 삭제될거다. 그런데 여기에 deleteUser(200);을 실행한 후 rollback을 해야하는 상황이 발생하면, 이미 deleteUser(100);이 실행된 Connection은 commit 되었기에 rollback이 되지 않는다. 이 문제를 해결하기 위해선 두 메서드의 Connection을 하나의 Connection으로 관리될 필요가 있는데, TransactionManager가 그 역할을 한다.
1.2 TxM로 Transaction 적용하기
Dao에서 Connection을 얻거나 반환 할 때 DataSourceUtils를 사용한다.
TxM로 Tx를 적용하면
①new DataSourceTranscationManager(ds);를 통해 TxM를 생성한다. 그리고
②tm.getTranaction(...);를 통해 Tx의 속성을 정의하고 Tx는 시작된다.
③try ~ catch문을 통해 Tx가 실행되는데 코드를보면 a1Dao.insert();가 모두 성공했을 때 commit이 되고 실패 했을 시 rollback한다. a1Dao.insert(1,100); 과 a1Dao.insert(1,200);은 서로 다른 Connection을 갖는다 그래서 Tx이 따로 실행되지만 TxM을 통해 이 Connection을 하나의 Connection으로 묶어 동시에 Tx가 가능하게 된다.
TxM을 사용하기 위해 앞에서와 같이 코드를 작성하는 방법도 있지만 간편하게 위의 사진과 같이 Bean으로 등록하는 방법도 있다. 개인적으로 Dao에 TxM을 설정하기보단 xml의 Bean으로 설정하는게 더 낫다고 생각한다.참고로 <tx:annotation-driven/>은 앞으로 살펴 볼 @Transcational을 사용하기 위해 설정한다.
2.@Transactional
@Transactional은 AOP의 주요 개념인 핵심기능과 부가기능을 분리하는 방식을 사용한다. 위의 코드를 보면 빨간색 박스를 친 코드가 핵심기능을 담당한다. 이외의 코드들은 모두 부가기능을 담당한다. 부가기능은 항상 반복되기 때문에 분리할 필요가 있는데, @Transactional은 이 두 코드(부가기능, 핵심기능)를 분리한다. 핵심기능 코드를 @Transcational이 붙은 메서드에 넣어 사용하면, 스프링은 부가기능을 따로 설정하여 개발자 입장에서 핵심기능에 더 집중 할 수 있게 한다. @Transactional은 클래스나 인터페이스도 붙을 수 있다.
2-1@Transactional의 속성
속성 | 설명 |
propagation | Tx의 경계(boundary)를 설정하는 방법을 지정 |
isolation | Tx의 isolation level을 지정. DEFAULT, READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIABLIZABLE |
readOnly | Tx이 데이터를 읽기만 하는 경우, true로 지정하면 성능이 향상 |
rollbackFor | 지정된 예외가 발생하면, Tx를 rollback, RuntimeException과 Error는 자동 rollback |
noRollbackFor | 지정된 예외가 발생해도, Tx을 rollback하지 않음 |
timeout | 지정된 시간(초) 내에 Tx이 종료되지 않으면, Tx를 강제종료 |
2-1 propagation 속성의 값
값 | 설명 |
REQUIRED | Tx이 진행중이면 참여하고, 없으면 새로운 Tx 시작(디폴트) |
REQUIRED_NEW | Tx이 진행 중이건 아니건, 새로 Tx 시작 |
NESTED | Tx이 진행 중이면, Tx의 내부 Tx로 실행 |
MANDATORY | 반드시 진행 중인 Tx내에서만 실행가능. 아니면 예외 발생 |
SUPPROTS | Tx이 진행 중이건 아니건 상관없이 실행 |
NOT_SUPPORTED | Tx없이 처리. Tx이 진행 중이면 잠시 중단(suspend) |
NEVER | Tx없이 처리. Tx이 진행 중이면 예외 발생 |
출처:스프링의 정석 : 남궁성과 끝까지 간다(패스트 캠퍼스 강좌)
'Spring > Spring DI와 AOP' 카테고리의 다른 글
[Spring DI와 AOP] Transaction, Commit, Rollback (0) | 2022.03.14 |
---|---|
[Spring DI와 AOP] DAO (0) | 2022.03.12 |
[Spring AOP] AOP의 개념과 사용 (0) | 2022.03.07 |
[Spring DI] BeanFactory / ApplicationContext 와 IoC / DI (0) | 2022.02.28 |