@Transcational 어노테이션에는 정말정말 매우 많은 기능이 있다
- 선언만으로 트랜잭션 보장
- DB 접근 계층 추상화
- 리소스 동기화 (쓰레드별 트랜잭션 관리)
- 격리레벨 조정
- 전파레벨 설정
- 롤백 에외 설정 (특정 예외에 대해선 롤백하지 않는다)
- readOnly + JPA사용시 약간의 성능 향상 (스냅샷 저장 X)
원리
이 마법을 어떻게 스프링은 이루어냈을까?
AOP로 이것을 해낸다
사실 이 하나만으로 해낼 수는 없고 AOP와 IoC와 빈 후처리기(Bean Post Processor), 프록시가 이것을 해낸다
우선 스프링은 메서드 혹은 클래스 레벨에 @Transactional 어노테이션이 있는 클래스에 대해
CGLIB이란 라이브러리를 통해서 동적으로 생성한 Proxy객체를 생성하고 내부의 target필드에 원본 객체를 놓는다
그리고 Bean으로 올릴 때 BeanPostProcessor를 통해 원본 객체가 아닌 프록시 객체로 교체한다
이 모든 것이 있어야 @Transcational이 가능하다...
(약간 다른맥락+TMI지만 스프링은 Bean을 생성할때 DFS 알고리즘으로 생성한다, 객체 생성시 생성자 주입등의 또 다른 필요한 Bean이 발견되면 그것을 우선으로 생성하려 한다)
참고
아래에 디버거를 걸면 자세한 정보를 알 수 있을 것 같다
어드바이스: TransactionInterceptor
포인트컷: TransactionAttributeSourcePointcut
어드바이저: BeanFactoryTransactionAttributeSourceAdvisor
DB접근 계층 추상화
스프링은 Jdbc, JPA 등 여러 DB접근 기술에 대해 추상화를 했다
각 구현체는 커밋, 롤백하는 구현부가 모두 다르다!!
PlatformTransactionManager가 추상화한 클래스이며
구체 클래스는
DataSourceTranscationManager (JDBC) (Spring 5.3+ : JdbcTransactionManger)
JpaTransactionManager (JPA) 등이 있다
리소스 동기화 부제: Thread와 커넥션의 관계...?
스프링은 기본적으로 한 요청 쓰레드에 대해 트랜잭션이 열린다면 DB커넥션에서 하나를 가져온다...
즉 1쓰레드 : 1트랜잭션 : 1DB커넥션이다
JTA등을 커스터마이징 하면 1쓰레드에 대해 각기 다른 DB에 대한 커넥션을 연결할 수 있는 것으로 알고 있다 (틀린 정보일 수 있다)
1쓰레드: 1트랜잭션: 각기 다른 DB커넥션
-으로 보인다
트랜잭션 동기화 매니저(TransationSyncronyzationManger)에서 ThreadLocal에 현재 쓰레드에 대한 커넥션을 보관한다
## 참고 자료
## 첨언
오랜만에 옛날 내용을 상기하여 작성했습니다 (틀린 얘기가 중간에 있을 수 있습니다 ㅠㅠ)
'Back-end > 기타 (BE)' 카테고리의 다른 글
엑셀 VBA 자동화 기록 (4) | 2023.12.20 |
---|---|
[동시성] 오프라인 선점 락 (Redis) (0) | 2023.12.12 |
스프링 배치 getting start (0) | 2021.03.25 |
뉴렉쳐 Servlet & JSP [61 ~ 70강] (0) | 2020.11.01 |
뉴렉쳐 Servlet & JSP [51 ~ 60강] (0) | 2020.10.07 |
hi hello... World >< 가장 아름다운 하나의 해답이 존재한다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!