티스토리 뷰

트랜잭션 동작 원리

  • transaction은 스프링aop Proxy를 통해 처리가 됩니다

 

트랜잭션 동작 방식

  • CGLIB(bytecode 생성) <- 부트에서 기본

    • 클래스에 대한 Proxy가 가능합니다
    • 처음 호출 되었을때 동적으로 bytecode를 생성하여 이후 호출에서는 재사용합니다
  • JDK Proxy (Reflection) <- mvc 기본

    • 인터페이스에 대한 Proxy만을 지원합니다
    • JVM에 의하여 Intercept한 다음 invoke 메써드를 호출할 때 JDK의 reflection을 이용하여 호출하게 되는것이다
    • Proxy를 사용할 때 실행속도를 저하시키는 원인이 됩다.


    https://private-space.tistory.com/98

 

 

동일한 빈에서 트랜잭션이 동작 안하는 코드

public class MoneyService {

    private final MoneyRepository moneyRepository;

    public void give() {

        Money money = new Money(BigDecimal.valueOf(10000));
        Money saveMoney  = this.save(money);
        log.info(saveMoney.getMoney().toString());
    }

    @Transactional
    public Money save(Money money) {
        Money saveMoney = moneyRepository.save(money);
        throw new RuntimeException("error");
//        return saveMoney;
    }

}
//프록시 객체로 우리가 만든 메서드를 한번 감싸서, 메서드 위 아래로 코드를 삽입 해줍니다.

public class MoneyServiceProxy extends MoneyService{
  private final TransactonManager manager = TransactionManager.getInstance();

  public void save(Money money) {
    try {
      manager.begin();
      super.save(money);
      manager.commit();
    } catch (Exception e) {
      manager.rollback();
    }
  }
}

해당 코드에서 보면 트랜잭션 걸려있는 메소드 대상으로 프록시 객체가 생성이 됩니다
이제 save 할때는 proxy 객체를 통해서 save 메소드를 접근해야하는데
그대로 호출하면 트랜잭션이 적용안된 save 메소드에 접근하기때문에 트랜잭션이 동작을 안합니다

 

 

주의할점

  • private method에 트랜잭션 어노테이션 추가 X (상속을 해서 프록시 객체 생성을 해야하기 때문)
  • 같은 빈에서 트랜잭션 적용된 메소드 호출 X

'Spring' 카테고리의 다른 글

[Spring] 영속성 컨텍스트(Persistence Context)란?  (0) 2020.11.24
[Spring] Jackson이란?  (0) 2020.11.23
[Spring] 트랜잭션(transaction)이란?  (0) 2020.11.23
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함