티스토리 뷰

반응형
private 메서드와 동일 클래스 메서드 내에서 @transaction을 선언한다면 동작하지 않는다.

 

private method에서의 동작

public class Bean {
  public void doStuff() {
     doPrivateStuff();
  }
  @Transactional
  private void doPrivateStuff() {

  }
}

///...

Bean bean = (Bean)appContext.getBean("bean");
bean.doStuff();

 

@Transcation annotaion은 private 메서드에 어노테이션을 적용했을때는 동작하지 않는다.

 

스프링은 Transcation을 처리하기 위해 빈 객체에 대한 프록시 객체를 생성을 하는데,

스프링 프록시는 타깃 클래스를 상속해서 프록시를 만드는 방법을 사용하기 때문에 상속이 불가능한 private 메서드의 경우 적용이 불가능하다.


마찬가지로 final이 적용된 메서드도 동작하지 않는다.

 

만약, private 메서드에 transcation 처리를 하고 싶다면 AspectJ를 이용하여 처리 할 수 있다.

 

 

inner method에서의 동작

public class Bean {
   public void doStuff() {
      doTransactionStuff();
   }
   
   @Transactional
   public void doTransactionStuff() {
      //...
   }
}

//트랜잭션 동작함
Bean bean = (Bean)appContext.getBean("bean");
bean.doTransactionStuff();

//트랜잭션 동작 안함
Bean bean = (Bean)appContext.getBean("bean");
bean.doStuff();

 

스프링 프록시는 프록시를 통해 들어오는 외부 메서드의 호출에서만 가로챌 수 있다. 내부 메서드에 적용한 @Transctional을 알 수 없다.



즉, 대상 객체 내의 메서드 내부에서의 다른 메서드 호출은 호출된 메서드가 @Transctional로 표시돼있더라고 런타임 시 실제 트랜잭션으로 이어지지 않는다.

 

 


참고

 

https://amitstechblog.wordpress.com/2011/05/20/spring-transactions-behavior-on-private-and-internal-methods/

 

https://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring

 

https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=19505747

 

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/01   »
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
글 보관함