이전 게시물에 이어서 얘기하자면
Spring Docs의 Tip 부분에는 다음과 같이 제시하고 있다.
위의 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
'Side Project > Socket' 카테고리의 다른 글
List<String> 타입의 경우 Nullable 할 때 주의할 점. (0) | 2024.02.05 |
---|---|
[MySQL] 테이블 데이터 다 지우기 (0) | 2024.02.05 |
[Self-Invocation]@Transactional 어느 Layer에 두는게 맞을까? (1) (0) | 2024.02.04 |
[ERROR] Circle CI에서 오류가 생길경우 살펴볼 것! (0) | 2024.02.04 |
[Test]단위테스트 시 List가 empty & null일 경우 테스트 작성 팁 (0) | 2024.02.04 |