트랜잭션 관련 포스팅
- [Spring] 트랜잭션 추상화 정리
- [Spring] 트랜잭션 동기화 정리
- [Spring] 트랜잭션 AOP 동작 흐름
- [Spring] 트랜잭션 AOP 사용 시 주의점 (ft. Spring AOP self-invocation)
- [Spring] 스프링 트랜잭션 전파와 롤백
- [Spring] 트랜잭션 전파 옵션
트랜잭션 관리
- AOP 프록시 <-> 트랜잭션 매니저 <-> 트랜잭션 동기화 매니저
요청 흐름
- 클라이언트 -> AOP 프록시 -> 서비스 -> 레포지토리
동작흐름
1. 클라이언트: 프록시 호출
- 클라이언트의 요청으로 AOP 프록시를 호출
2. AOP 프록시: 스프링 컨테이너를 통해 트랜잭션 매니저 획득
3. AOP 프록시 -> 트랜잭션 매니저: 트랜잭션을 시작
- transactionManger.getTransaction()을 호출해서 트랜잭션을 시작한다
4. 트랜잭션 매니저: 커넥션 생성 + 수동 커밋모드
- 주입받은 데이터소스를 통해 커넥션을 생성한다
- con.setAutoCommit(false)을 호출하여 커넥션을 수동 커밋모드로 변경한 후 DB 트랜잭션을 시작한다
5. 트랜잭션 매니저 -> 트랜잭션 동기화 매니저: 커넥션을 보관
- 커넥션을 트랜잭션 동기화 매니저에 보관한다
- 트랜잭션 동기화 매니저는 ThreadLocal에 커넥션을 보관한다(Thread-Safe)
6. AOP 프록시 -> 서비스: 실제 서비스 로직 호출
7. 레포지토리 -> 트랜잭션 동기화 매니저: 트랜잭션 동기화 커넥션 획득
- 레포지토리는 트랜잭션 동기화 매니저에 보관된 커넥션을 꺼내서 사용한다
8. AOP 프록시 -> 트랜잭션 매니저: 트랜잭션을 종료
- transactionManger.commit() 또는 transactionManger.rollback()을 호출해서 트랜잭션을 종료한다
9. 트랜잭션 동기화 매니저 -> 트랜잭션 매니저: 동기화된 커넥션을 반환
- 트랜잭션을 종료하기 위해선 동기화된 커넥션이 필요하므로 트랜잭션 동기화 매니저를 통해 동기화된 커넥션을 획득한다
10. 트랜잭션 매니저: DB에 트랜잭션 커밋 or 롤백
11. 트랜잭션 매니저: 전체 리소스 정리
- ThreadLocal은 사용 후 꼭 정리해야 하는 자원이므로 트랜잭션 동기화 매니저를 정리해준다
- 커넥션을 자동 커밋모드로 변경한다
- 커넥션을 종료한다
- 커넥션 풀을 사용하는 경우 종료한 커넥션을 반환한다
참고
'Spring > Spring' 카테고리의 다른 글
[Spring] 트랜잭션 동기화 정리 (0) | 2022.08.13 |
---|---|
[Spring] 트랜잭션 추상화 정리 (0) | 2022.08.08 |
[Spring] 스프링 DataSource 간단하게 정리 (0) | 2022.08.08 |
[Spring] 테스트 대상(@InjectMocks) Mocking & Stubbing하기 (0) | 2022.07.24 |
[Spring] Mockito private method invocation 테스트하기 (0) | 2022.07.17 |