일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- Spring
- 자료구조
- MSA
- 파이썬
- Proxy
- C
- 컴퓨터구조
- IT
- Data Structure
- 알고리즘
- Java
- 백준
- 네트워크
- Kafka
- design pattern
- react
- Galera Cluster
- JavaScript
- Heap
- 자바
- redis
- JPA
- Algorithm
- spring webflux
- 운영체제
- OS
- 디자인 패턴
- mongoDB
- c언어
- MySQL
Archives
- Today
- Total
시냅스
Spring 선언적 트랜잭션과 AOP, 프록시 객체에 대한 이해 본문
선언적 트랜잭션과 AOP
- 개발자는 트랜잭션 처리가 필요한 곳에 @Transactional 애노테이션만 붙여주면 된다.
- @Transactional 애노테이션이 특정 클래스나 메서드에 하나라도 있다면 실제 객체 대신에 트랜잭션을 처리해주는 프록시 객체가 스프링 빈에 등록된다.
- 스프링의 트랜잭션 AOP는 이 애노테이션을 인식해서 트랜잭션을 처리하는 프록시를 적용해준다.
- 위 케이스에서 tx()의 경우 프록시 객체가 호출되고 트랜잭션이 적용된다.
- nonTx() 는 트랜잭션이 없는 것을 확인할 수 있다.
- 트랜잭션은 구체적이고 자세한 것이 높은 우선순위를 가진다.
- e.g. 클래스 < 메서드
- 만약 트랜잭션이 적용되지 않은 함수 내부에서 트랜잭션이 적용된 함수를 호출한다면 트랜잭션이 적용되지 않는다.
- 객체.external() 을 호출한다 여기서 객체는 트랜잭션 프록시이다.
- 객체의 트랜잭션 프록시가 호출된다.
- external() 매서드에는 @Transactional이 없다 따라서 트랜잭션 프록시는 트랜잭션을 적용하지 않는다.
- 트랜잭션을 적용하지 않고 실제 객체 인스턴스의 external() 을 호출한다.
- external() 은 내부에서 실제 객체의 this.internal() 메서드를 호출한다.
- 이러한 문제를 회피하기 위해서는 internal() 을 다른 객체로 분리하여 적용할 수 있다.
- 또한 초기화 시점(@PostConstruct)에도 트랜잭션이 적용되지 않는다.
- 초기화 코드가 먼저 호출되고, 그 다음 트랜잭션 AOP가 적용되기 때문이다.
'Java, Spring' 카테고리의 다른 글
Java 함수형 프로그래밍 (0) | 2023.02.06 |
---|---|
Spring 트랜잭션 전파 정리 (0) | 2022.09.03 |
Spring MyBatis 정리 (0) | 2022.09.03 |
Spring JdbcTemplate 정리 (0) | 2022.09.02 |
Java 예외 관련 정리 (0) | 2022.08.25 |
Comments