본문 바로가기
Side Project/Socket

@Transactional 어느 Layer에 두는게 맞을까? (2)

by asdft 2024. 2. 4.

이전 게시물에 이어서 얘기하자면

Spring Docs의 Tip 부분에는 다음과 같이 제시하고 있다.

Spring Docs

위의 Tip 부분을 살펴보면,

@Transactional 어노테이션은 인터페이스에 추가하는 대신 구체적인 클래스 및 메소드에 달도록 권장하고 있다.

Spring은 인터페이스에 주석을 추가하는 대신
@Transactional 주석으로 구체적인 클래스 (및 구체적인 클래스의 메서드)에만 주석을 달도록 권장합니다. 인터페이스 (또는 인터페이스 메소드)에 @Transactional 어노테이션을 배치 할 수 있지만 이는 인터페이스 기반 프록시를 사용하는 경우 예상 한 대로만 작동합니다.
Java 주석이 인터페이스에서 상속되지 않는다는 사실은 클래스 기반 프록시 (proxy-target-class = “true”) 또는 위빙 기반 측면 (mode = “aspectj”)을 사용하는 경우 트랜잭션 설정이 다음과 같음을 의미합니다.
프록시 및 위빙 인프라에 의해 인식되지 않으며 객체가 트랜잭션 프록시에 래핑되지 않으므로 확실히 나쁠 것입니다.

 

또한 Note 부분을 살펴보면,

'@Transactional 어느 Layer에 두는게 맞을까? (1)' 에서 다룬 Self-Invocation으로 인한 트랜잭션 내에서 호출된 외부 메소드의 경우 @Transactional의 적용 제한에 대해서도 말해주고 있다.

프록시 모드(기본값)에서는 프록시를 통해 들어오는 외부 메서드 호출만 차단됩니다. 이는 실제로 대상 객체의 다른 메소드를 호출하는 대상 객체 내의 메소드 자체 호출이 호출된 메소드가 @Transactional로 표시되어 있어도 런타임 시 실제 트랜잭션으로 이어지지 않음을 의미합니다.

 

 

이로써, @Transactional에 대해서 더 자세히 알게됐고, 좀 더 확실하게 사용할 수 있게된거 같다!

 

 

[참고]

https://docs.spring.io/spring-framework/docs/3.0.x/spring-framework-reference/html/transaction.html