복붙노트

[SPRING] @Transactional 어노테이션은 인터페이스 정의 나 구현 클래스에서 어디에 넣어야합니까?

SPRING

@Transactional 어노테이션은 인터페이스 정의 나 구현 클래스에서 어디에 넣어야합니까?

코드 제목의 질문 :

@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 {
   ...
}

해결법

  1. ==============================

    1.http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html에서

    http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html에서

    (강조는 첫 번째 문장에 강조 표시, 다른 부분은 원본과 동일합니다.)

  2. ==============================

    2.인터페이스에 표시 할 수 있지만 경우에 따라 트랜잭션이 끝나지 않을 수도 있음을 경고합니다. Spring 문서의 10.5.6 절에있는 두 번째 팁을 참조하십시오.

    인터페이스에 표시 할 수 있지만 경우에 따라 트랜잭션이 끝나지 않을 수도 있음을 경고합니다. Spring 문서의 10.5.6 절에있는 두 번째 팁을 참조하십시오.

    이러한 이유로 구현에 넣는 것이 좋습니다.

    또한 트랜잭션은 구현 세부 사항처럼 보이므로 구현 클래스에 있어야합니다. 트랜잭션이 필요하지 않은 로깅 또는 테스트 구현 (모의)을위한 래퍼 구현을한다고 가정 해보십시오.

  3. ==============================

    3.Spring은 인터페이스 대신 구체적인 구현에 주석을 달 것을 권장한다. 인터페이스에서 어노테이션을 사용하는 것은 잘못된 것은 아니며 오히려 해당 기능을 오용하고 실수로 @Transaction 선언을 무시할 수 있습니다.

    Spring은 인터페이스 대신 구체적인 구현에 주석을 달 것을 권장한다. 인터페이스에서 어노테이션을 사용하는 것은 잘못된 것은 아니며 오히려 해당 기능을 오용하고 실수로 @Transaction 선언을 무시할 수 있습니다.

    인터페이스에서 트랜잭션 (transactional)을 표시하고 봄에 구현 클래스 중 하나를 참조하면 봄 객체가 @Transactional 주석을 존중하지 않는다는 사실이 분명하지 않습니다.

    실제로는 다음과 같이 보입니다.

    public class MyClass implements MyInterface { 
    
        private int x;
    
        public void doSomethingNonTx() {}
    
        @Transactional
        public void toSomethingTx() {}
    
    }
    
  4. ==============================

    4.구체적인 클래스에서 @Transactional 지원 :

    구체적인 클래스에서 @Transactional 지원 :

    필자는 일반적으로 API, 구현 및 웹 (필요한 경우)의 세 섹션으로 솔루션을 설계하는 것을 선호합니다. 의존성을 최소화하여 가능한 한 간단한 / 간단한 / POJO로 API를 유지하기 위해 최선을 다합니다. API를 많이 공유해야하는 분산 / 통합 환경에서 재생하는 경우 특히 중요합니다.

    @Transactional을 넣으려면 IMHO가 효과적이지 않은 API 섹션에 Spring 라이브러리가 필요합니다. 따라서 트랜잭션을 실행중인 구현에서 추가하는 것을 선호합니다.

  5. ==============================

    5.IFC의 예측 가능한 모든 구현자가 TX 데이터 (트랜잭션은 데이터베이스 만 처리 할 수있는 문제는 아님)에 대해 신경을 쓰면 오래 사용할 수 있습니다. 이 메소드가 TX에 대해 신경 쓰지 않는다면 (하지만 당신은 Hibernate를 위해 그것을 넣을 필요가있다.) 무엇이든 그것을 impl에 넣어야한다.

    IFC의 예측 가능한 모든 구현자가 TX 데이터 (트랜잭션은 데이터베이스 만 처리 할 수있는 문제는 아님)에 대해 신경을 쓰면 오래 사용할 수 있습니다. 이 메소드가 TX에 대해 신경 쓰지 않는다면 (하지만 당신은 Hibernate를 위해 그것을 넣을 필요가있다.) 무엇이든 그것을 impl에 넣어야한다.

    또한 인터페이스의 메소드에 @Transactional을 배치하는 것이 더 나을 수도 있습니다.

    public interface FooService {
        @Transactional(readOnly = true)
        void doSmth();
    }
    
  6. ==============================

    6.간단하지만 설명하는 예제로 문제를 보여주는 아래의 링크를 살펴보십시오.

    간단하지만 설명하는 예제로 문제를 보여주는 아래의 링크를 살펴보십시오.

    http://kim.saabye-pedersen.org/2013/05/spring-annotation-on-interface-or-class.html

  7. from https://stackoverflow.com/questions/3120143/where-should-i-put-transactional-annotation-at-an-interface-definition-or-at-a by cc-by-sa and MIT license