본문 바로가기

스프링

AOP_Aspectj

 

 

스프링 AOP는 프록시가 적용되면 클라이언트는 프록시를 타깃 오브젝트라고 생각하고 프록시 메소드를 호출한다. 따라서 트랜잭션은 타깃메소드 호출전에 트랜잭션을 시작하고 호출 후에 트랜잭션을 커밋하거나 롤백해줄 것이다.

 

(1)은 클라이언트에서 프록시를 통해 들어온 호출이므로 당연히 프록시의 기능이 동작한다. 하지만 (2)의 경우 타깃 오브젝트 안에서의 호출이므로 프록시를 통하지 않고 직접 타깃 오브젝트 안에서의 호출이므로 프록시를 통하지 않고 직접 타깃 오브젝트의 메소드 호출이 일어난다.(데코레이터 패턴을 기억해보면 타깃클래스가 아닌 프록시 클래스를 호출하는 것과 같은 원리)

 

1. add() 메소드는 트랜잭션 전파속성이 항상 새로운 트랜잭션을 만들어 시작하도록 REQUIRES_NEW로 되어 있다. 따라서 다른 서비스 계층 오브젝트에서 트랜잭션이 시작된 후에 MemberSerivceadd() 메소드가 호출되면 기존 트랜잭션은 잠시 중단되고 새로운 트랜잭션을 시작한다.

2. MemberService 외의 오브젝트에서 MemberService의 메소드를 호출할 때는 항상 트랜잭션 프록시를 거쳐서 들어오기 때문에 메소드에 설정해둔 트랜잭션 속성이 정확히 적용된다.

3. 이번엔 클라이언트로부터 complexWork() 호출된다면 complexWork()는 클래스 레벨 트랜잭션을 적용받고 complexWork()가 호출되기 전에 프록시에서 트랜잭션을 시작할 것이다.

> 문제는 complexWork()에서 add() 메소드를 호출할 때 프록시를 이미 지나서 MemberSerivce 빈의 오브젝트로 들어왔으므로 트랜잭션 프록시를 다시 거치지 않고 add() 메소드가 바로 실행된다.

> add를 호출했음에도 새로운 트랜잭션이 생성되는 대신 complexWork()에서 시작된 트랜잭션에서 시작된 트랜잭션에 그냥 참여하게 된다.

 

스프링은 기본적으로 JDK 다이내믹 프록시를 사용하므로 프록시를 거쳐야 트랜잭션이 걸림

 

현재 진행중인 프록시를 가져올 수 있지만 단점은 Spring API의 비즈니스 로직을 가진 한심한 코드가 된다.

 

 

 

'스프링' 카테고리의 다른 글

스프링 MVC 이론  (0) 2021.02.06
트랜잭션_조합_WAS트랜잭션_고급  (0) 2021.02.06
JPA_JTA_하이버네이트 트랜잭션_2  (0) 2021.02.03
[Hibernate] 하이버네이트_1  (0) 2021.02.02
[JPA] ORM 정의  (0) 2021.02.01