@Transactional annotation: 인터페이스 정의 또는 구현 클래스 어디에 배치해야 합니까?
코드 제목에 대한 질문:
@Transactional (readonly = true)
public interface FooService {
void doSmth ();
}
public class FooServiceImpl implements FooService {
...
}
대
public interface FooService {
void doSmth ();
}
@Transactional (readonly = true)
public class FooServiceImpl implements FooService {
...
}
http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html 에서
인터페이스에 주석을 다는 것이 아니라 주석을 사용하여 구체적인 클래스에만 주석을 다는 것이 좋습니다.확실히 배치 가능합니다.
@Transactional
인터페이스(또는 인터페이스 방식)에 대한 주석입니다만, 이것은 인터페이스 베이스의 프록시를 사용하고 있는 경우에만 동작합니다.주석이 상속되지 않는다는 것은 클래스 기반 프록시를 사용하는 경우 트랜잭션 설정이 클래스 기반 프록시 인프라스트럭처에 의해 인식되지 않고 오브젝트가 트랜잭션프록시로 랩되지 않는다는 것을 의미합니다(확실히 좋지 않습니다).Spring 팀의 조언을 듣고 구체적인 수업(및 구체적인 수업의 방법)에만 주석을 달아주세요.@Transactional
석입니니다다주의: 이 메커니즘은 프록시를 기반으로 하므로 프록시를 통해 수신되는 '외부' 메서드 호출만 대행 수신됩니다.이것은 '자기 호출' 즉, 대상 객체의 다른 메서드를 호출하는 대상 객체 내의 메서드는 호출된 메서드가 다음과 같이 표시되더라도 실행 시 실제 트랜잭션으로 이어지지 않는다는 것을 의미합니다.
@Transactional
!
(첫 번째 문장에 강조가 추가되고, 원본에서 강조가 추가된다.)
Spring은 인터페이스가 아닌 구체적인 구현에 주석을 다는 것을 권장합니다.인터페이스에서 주석을 사용하는 것은 잘못된 것이 아닙니다. 단지 해당 기능을 잘못 사용하여 실수로 @Transaction 선언을 무시할 수 있습니다.
인터페이스로 트랜잭션에 마크를 붙이고 나서 봄의 다른 곳에서 그 실장 클래스 중 하나를 참조하는 경우, 스프링에 의해 생성되는 객체가 @Transactional 주석을 따르지 않는 것은 분명하지 않습니다.
실제로는 다음과 같습니다.
public class MyClass implements MyInterface {
private int x;
public void doSomethingNonTx() {}
@Transactional
public void toSomethingTx() {}
}
인터페이스에 배치할 수 있지만 경우에 따라서는 트랜잭션이 발생하지 않을 수 있습니다.Spring 문서의 Secion 10.5.6의 두 번째 힌트를 참조하십시오.
인터페이스에 주석을 다는 것이 아니라 @Transactional 주석을 사용하여 구체적인 클래스(및 구체적인 클래스의 메서드)에만 주석을 다는 것이 좋습니다.인터페이스(또는 인터페이스 방식)에 @Transactional 주석을 배치할 수 있지만, 이것은 인터페이스 기반 프록시를 사용하는 경우에만 작동합니다.Java 주석이 인터페이스에서 상속되지 않는다는 것은 클래스 기반 프록시(flass-target-class="true") 또는 위빙 기반 측면(mode="flashj")을 사용하는 경우 트랜잭션 설정이 프록시 및 위빙 인프라에 의해 인식되지 않으며 개체가 트랜잭션 프록시로 포장되지 않는다는 것을 의미합니다.확실히 나쁘겠지.
나는 이러한 이유로 그것들을 시행하는 것을 추천한다.
또한 트랜잭션은 구현 세부사항으로 생각되므로 구현 클래스에 속해야 합니다.트랜잭션이 필요 없는 로깅 또는 테스트 구현(모크)을 위한 래퍼 구현이 있다고 상상해 보십시오.
구체적인 클래스에서 @Transactional 지원:
저는 일반적으로 API, 구현 및 웹(필요한 경우)의 3가지 섹션으로 구성된 솔루션을 설계하는 것을 선호합니다.의존성을 최소화하여 API를 최대한 경량/심플/POJO로 유지하도록 노력하고 있습니다.API를 많이 공유해야 하는 분산/통합 환경에서 플레이하는 경우 특히 중요합니다.
@Transactional을 삽입하려면 API 섹션에 Spring 라이브러리가 필요한데 IMHO는 유효하지 않습니다.따라서 트랜잭션이 실행되고 있는 구현에 추가하는 것이 좋습니다.
예측 가능한 IFC의 모든 구현자가 TX 데이터에 관심을 갖는다면 인터페이스에 배치하는 것은 문제 없습니다(트랜잭션은 데이터베이스에서만 처리되는 문제가 아닙니다).이 방법이 TX에 대해 신경 쓰지 않는 경우(단, 휴지 상태 또는 기타 용도로 TX를 배치해야 함)에는 해당 내용을 지정합니다.
또, 배치하는 것이 조금 더 나을 수도 있습니다.@Transactional
인터페이스 내의 메서드:
public interface FooService {
@Transactional(readOnly = true)
void doSmth();
}
언급URL : https://stackoverflow.com/questions/3120143/where-should-i-put-transactional-annotation-at-an-interface-definition-or-at-a
'itsource' 카테고리의 다른 글
JavaScript로 끝남 (0) | 2022.12.24 |
---|---|
파일이 python에서 디렉토리인지 일반 파일인지 확인하는 방법 (0) | 2022.12.24 |
페이지 새로 고침 없이 폼 데이터를 PHP로 전달하는 AJAX와 함께 폼 제출 (0) | 2022.12.24 |
ASSERTION을 생성하려고 할 때 설명할 수 없는 mysql 오류가 발생했습니다. (0) | 2022.12.24 |
수정된 환경에서 Python 하위 프로세스/팝업 (0) | 2022.12.24 |