시냅스

Spring 선언적 트랜잭션과 AOP, 프록시 객체에 대한 이해 본문

Java, Spring

Spring 선언적 트랜잭션과 AOP, 프록시 객체에 대한 이해

ted k 2022. 9. 3. 17:14

선언적 트랜잭션과 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