요즘들어 Transactional 처리에 대해서 글을 많이 남기는 것 같다.
금일 포스팅은 Spring Transactional 처리를 Proxy가 아닌 Aspectj 로 설정한 트랜잭션을 알아보겠다. 계속 포스팅했던 @Transactional은 동일한 클래스의 메서드들을 호출 할때를 말하였다.
예전 포스팅 중 2번
@Transactional이 적용되지 않은 메서드에서 적용된 메서드를 호출하면 Transaction이 무시된다. 이 내용을 한번 보자
만약 @Transactional 적용 되지 않은 메서드에서 적용된 메서드를 호출할때 무시된다고 나와있다. 맞다 무시된다. 무시되는 것도 맞지만 그 상태에서 R을 제외하고 CUD를 2번 이상 할 경우에는 에러도 내뱉는다.
왜냐하면 Proxy모드에서는 외부 메서드를 호출할 때만 aop 적용되어 메서드를 가로챈다.
그리고 또 알아야 할것이 @Transactional 어노테이션이 붙어 있는 함수는 접근 제어자가 무조건 public 이어야 한다. 그렇지 않다면 트랜잭션이 적용되지 않는다.
만약 이 조건들을 만족해야 한다면 Aspectj를 써야한다.
그럼 한번 어떻게 설정하는지 알아보자
일단 필자는 Spring boot기준이라 그 기준으로 설명하겠다. 딱히 설명할 것도 없긴한데..
@SpringBootApplication
@EnableTransactionManagement(proxyTargetClass = true, mode = AdviceMode.ASPECTJ)
@EnableLoadTimeWeaving
일단 설정 파일에 위와같이 설정 해준다. 그럼 소스에서 추가할 것은 이게 다이다.
마지막으로 한가지 해줄것이 있는데 java 아규먼트를 설정 해야 한다.
spring-instrument-{version}.RELEASE.jar 와
aspectjweaver-{version}.jar 를 다운받자.
메이븐 레파지토리 사이트 가면 jar를 다운 받을 수 있다.
이클립스는 실행할때 VM arguments 인텔리j 는 VM options에다가 아래와 같이 넣어주자.
-javaagent:{path}\\spring-instrument-4.2.6.RELEASE.jar
-javaagent:{path}\\aspectjweaver-1.5.3.jar
그리고 실행하면 끝난다.
이제 우리는 @Transactional이 있는 함수의 접근제어자가 public 아니어도 트랜잭션이 가능하며, 위의 2번과 같은 상황에서도 트랜잭션이 가능하다.
근데 굳이 이렇게까지 하면서 쓸일이 있을까 싶다. 물론 쓸일이 있으면 쓰겠지만 그럴일은 거의 없을것 같다. 기존의 Proxy를 써도 웬만하면 다 개발가능할 것같다.