[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.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.인터페이스에 표시 할 수 있지만 경우에 따라 트랜잭션이 끝나지 않을 수도 있음을 경고합니다. Spring 문서의 10.5.6 절에있는 두 번째 팁을 참조하십시오.
인터페이스에 표시 할 수 있지만 경우에 따라 트랜잭션이 끝나지 않을 수도 있음을 경고합니다. Spring 문서의 10.5.6 절에있는 두 번째 팁을 참조하십시오.
이러한 이유로 구현에 넣는 것이 좋습니다.
또한 트랜잭션은 구현 세부 사항처럼 보이므로 구현 클래스에 있어야합니다. 트랜잭션이 필요하지 않은 로깅 또는 테스트 구현 (모의)을위한 래퍼 구현을한다고 가정 해보십시오.
-
==============================
3.Spring은 인터페이스 대신 구체적인 구현에 주석을 달 것을 권장한다. 인터페이스에서 어노테이션을 사용하는 것은 잘못된 것은 아니며 오히려 해당 기능을 오용하고 실수로 @Transaction 선언을 무시할 수 있습니다.
Spring은 인터페이스 대신 구체적인 구현에 주석을 달 것을 권장한다. 인터페이스에서 어노테이션을 사용하는 것은 잘못된 것은 아니며 오히려 해당 기능을 오용하고 실수로 @Transaction 선언을 무시할 수 있습니다.
인터페이스에서 트랜잭션 (transactional)을 표시하고 봄에 구현 클래스 중 하나를 참조하면 봄 객체가 @Transactional 주석을 존중하지 않는다는 사실이 분명하지 않습니다.
실제로는 다음과 같이 보입니다.
public class MyClass implements MyInterface { private int x; public void doSomethingNonTx() {} @Transactional public void toSomethingTx() {} }
-
==============================
4.구체적인 클래스에서 @Transactional 지원 :
구체적인 클래스에서 @Transactional 지원 :
필자는 일반적으로 API, 구현 및 웹 (필요한 경우)의 세 섹션으로 솔루션을 설계하는 것을 선호합니다. 의존성을 최소화하여 가능한 한 간단한 / 간단한 / POJO로 API를 유지하기 위해 최선을 다합니다. API를 많이 공유해야하는 분산 / 통합 환경에서 재생하는 경우 특히 중요합니다.
@Transactional을 넣으려면 IMHO가 효과적이지 않은 API 섹션에 Spring 라이브러리가 필요합니다. 따라서 트랜잭션을 실행중인 구현에서 추가하는 것을 선호합니다.
-
==============================
5.IFC의 예측 가능한 모든 구현자가 TX 데이터 (트랜잭션은 데이터베이스 만 처리 할 수있는 문제는 아님)에 대해 신경을 쓰면 오래 사용할 수 있습니다. 이 메소드가 TX에 대해 신경 쓰지 않는다면 (하지만 당신은 Hibernate를 위해 그것을 넣을 필요가있다.) 무엇이든 그것을 impl에 넣어야한다.
IFC의 예측 가능한 모든 구현자가 TX 데이터 (트랜잭션은 데이터베이스 만 처리 할 수있는 문제는 아님)에 대해 신경을 쓰면 오래 사용할 수 있습니다. 이 메소드가 TX에 대해 신경 쓰지 않는다면 (하지만 당신은 Hibernate를 위해 그것을 넣을 필요가있다.) 무엇이든 그것을 impl에 넣어야한다.
또한 인터페이스의 메소드에 @Transactional을 배치하는 것이 더 나을 수도 있습니다.
public interface FooService { @Transactional(readOnly = true) void doSmth(); }
-
==============================
6.간단하지만 설명하는 예제로 문제를 보여주는 아래의 링크를 살펴보십시오.
간단하지만 설명하는 예제로 문제를 보여주는 아래의 링크를 살펴보십시오.
http://kim.saabye-pedersen.org/2013/05/spring-annotation-on-interface-or-class.html
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
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 MVC - 날짜 필드 바인딩 (0) | 2018.12.16 |
---|---|
[SPRING] 다른 익명의 CacheManager는 이미 동일한 VM에 존재합니다 (ehCache 2.5). (0) | 2018.12.16 |
[SPRING] Spring 4.x / 3.x (Web MVC) REST API 및 JSON2 Post 요청은 모든 요청을 한 번 올바르게 가져 오는 방법을 알려줍니다. (0) | 2018.12.16 |
[SPRING] 스프링 컨트롤러의 범위와 인스턴스 변수 (0) | 2018.12.16 |
[SPRING] 롤백 전용으로 표시된 트랜잭션 : 원인을 찾는 방법 (0) | 2018.12.16 |