"@Transactional"은 어디에 서비스 레이어 또는 DAO를 배치해야합니까?


81

첫째, 이전에 묻고 답한 것을 물어 보았지만 검색 결과를 다시 얻을 수 없었을 가능성이 있습니다. 좋아요 일반적으로 (또는 항상 지금까지 :)) 우리는 서비스 계층에 트랜잭션 주석을 정의합니다. 일반적인 spring hibernate crud는 일반적으로

컨트롤러-> 관리자-> Dao-> Orm.

이제 클라이언트 사이트를 기반으로 한 도메인 모델 중에서 선택해야하는 상황이 생겼습니다. 클라이언트 A가 내 도메인 모델을 모두 사용하는 것이 좋지만 다른 클라이언트 사이트에서 웹 서비스를 제공하고 도메인 모델을 사용하지 않는다고 가정합니다.

어떤 레이어를 교체해야합니까? 웹 서비스에서 데이터를 가져 와서 다시 보낼 DAO 여야한다고 생각합니다. 즉, 별도로 작성된 두 개의 DAO 레이어가 시나리오에 따라 연결됩니다.

나는 이제 우리가 @TransactionalService layer를 넣을 때 타이트 커플 링을하고 있다는 것을 깨달았습니다 . 너무 많은 두뇌는 틀릴 수 없거나 잘못 될 수 없습니다 (나는 의심합니다).

그래서 질문은 "" @Transactional"위치 서비스 레이어 또는 DAO가 있어야 하는가?"입니다. 그리고 내가 교체해야 할 서비스 계층이 아래로 내려가는 것입니다.


6
이 질문은 실제로 Spring @Transactional Annotation Best Practice 의 중복입니다 .
Pascal Thivent

답변:


80

이상적으로 서비스 계층 ( Manager )은 비즈니스 로직을 나타내므로로 주석을 달아야합니다 @Transactional.

서비스 계층은 DB 작업을 수행하기 위해 다른 DAO를 호출 할 수 있습니다. 서비스 메서드에 3 개의 DAO 작업이있는 상황을 가정 해 보겠습니다. 첫 번째 DAO 작업이 실패한 경우 다른 두 개가 여전히 통과되어 일관성없는 DB 상태가됩니다. 서비스 계층에 주석을 달면 이러한 상황에서 벗어날 수 있습니다.


답장을 보내 주셔서 감사합니다. 답변 한 연도를 말씀해 주시겠습니까? 믿거 나 말거나 당신이 방금 타임머신의 존재를 증명했을지도 모른다고 생각합니다. 2015 년에 +1을했습니다.
Shahzeb

당신이 :) 질문 할 때까지 나는 올해를 통보하지 않았다
Badal

60

당신은 당신의 서비스가 트랜잭션 적이기를 원할 것입니다. DAO가 트랜잭션이고 각 서비스에서 서로 다른 DAO를 호출하는 경우 원하는 것이 아닌 여러 트랜잭션이있을 것입니다. 서비스 호출을 트랜잭션으로 만들면 해당 메서드 내의 모든 DAO 호출이 메서드의 트랜잭션에 참여합니다.


6
그가 @Transaction주석 에 전파 방법을 지정할 수 없었기 때문에 여기
Fotis Paraskevopoulos

1
그에만 작동 할 @FotisParaskevopoulos 그는이있는 경우 @Transactional모두 서비스 DAO를. 그러면 추가 주석이 나쁘지는 않지만 도움이되지 않습니다.
윌리엄 F. 제임슨

6

여러 DAO 구현을 가질 수 있으므로 @Transactional을 서비스 계층 메서드에 넣는 것이 좋습니다. 이것을 사용함으로써 우리는 우리의 서비스를 거래 적으로 만들 수 있습니다. 보내다

모범 사례는 일반 BasicService를 사용하여 공통 서비스를 제공하는 것입니다.

서비스는 @Transactional을 배치하기에 가장 좋은 장소이며, 서비스 계층은 논리적으로 트랜잭션으로 이동하는 사용자 상호 작용에 대한 세부 수준의 사용 사례 동작을 유지해야합니다. 이런 식으로 우리는 웹 애플리케이션 코드와 비즈니스 로직을 분리 할 수 ​​있습니다.

중요한 비즈니스 로직이없는 CRUD 응용 프로그램이 많이 있습니다. 컨트롤러와 데이터 액세스 개체 사이를 통과하는 서비스 계층을 갖는 것은 유용하지 않기 때문입니다. 이 경우 Dao에 트랜잭션 주석을 넣을 수 있습니다.

따라서 실제로는 어느 위치 에나 둘 수 있습니다. 그것은 당신에게 달려 있습니다.

서비스에 여러 호출이 있으면 서비스에 @Transactional이 필요합니다. @Transactional을 서비스에 넣으면 서비스에 대한 다른 호출이 다른 트랜잭션에서 실행됩니다.


0

응용 프로그램이 여러 모듈에 걸쳐 계층화되고 대부분의 작업이 @CRUD 기반 인 경우 응용 프로그램 유형에 따라 개인적으로 선택하는 것입니다. 그러면 서비스 수준에서 @transactional 주석을 사용하면 더 많은 의미를 갖게됩니다. 스케줄러, 작업 서버, @etl과 같은 엔진 유형 응용 프로그램 세션 및 사용자 개념이 존재하지 않는 앱을보고하면 컨텍스트 수준의 전파 트랜잭션이 가장 적합합니다 ... 트랜잭션 안티 패턴이 끝나는 모든 곳에 @transactional을 배치하여 클러스터 된 트랜잭션을 생성해서는 안됩니다 ... 어쨌든 실용적인 트랜잭션을 위해 control JTA2가 가장 적합한 대답입니다 ... 다시 말하지만 주어진 상황에서 사용할 수있는 날씨에 따라 다릅니다 ...


0

서비스 계층에서 @Transactional을 사용해야하며, 다른 모델에서 동일한 데이터를 제공해야하는 클라이언트 B의 도메인 모델을 변경하려면 다른 서비스를 제공하여 DAO 계층에 영향을주지 않고 도메인 모델을 변경할 수 있습니다. 인터페이스를 만들고 다른 모델에서 인터페이스를 구현하고 동일한 서비스로 클라이언트를 기반으로 모델을 채 웁니다.이 결정은 비즈니스 요구 사항과 프로젝트 범위를 기반으로합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.