| 일 | 월 | 화 | 수 | 목 | 금 | 토 | 
|---|---|---|---|---|---|---|
| 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
													
											
												
												- 파이썬
 - 자바
 - c언어
 - Kafka
 - design pattern
 - IT
 - 알고리즘
 - Algorithm
 - redis
 - JavaScript
 - Heap
 - Data Structure
 - MSA
 - 컴퓨터구조
 - MySQL
 - mongoDB
 - Spring
 - 운영체제
 - react
 - 백준
 - spring webflux
 - 디자인 패턴
 - Java
 - OS
 - JPA
 - Proxy
 - C
 - 자료구조
 - 네트워크
 - Galera Cluster
 
													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