우노
[Kotlin] @Transactional, Service vs Repository 어디에 적용할까? 본문
Web_App/Kotlin
[Kotlin] @Transactional, Service vs Repository 어디에 적용할까?
운호(Noah) 2024. 12. 26. 16:36Spring에서 @Transactional, 어디에 적용할까?
- Spring에서 트랜잭션 관리를 위해 사용하는 @Transactional은 주로 Service 계층과 Repository 계층에 적용됩니다.
- 두 계층에서의 사용법과 차이를 알아보고, 올바른 설계 방향을 살펴보겠습니다.
Service 계층에서 @Transactional
Service 계층은 비즈니스 로직을 처리하는 핵심 부분입니다.
이 계층에 @Transactional을 사용하면 비즈니스 작업 단위 전체를 하나의 트랜잭션으로 묶을 수 있습니다.
예제
@Service public class OrderService { @Transactional public void placeOrder(Order order) { orderRepository.save(order); paymentService.processPayment(order); } }
장점
- 트랜잭션 경계 설정: 비즈니스 로직 전체를 하나의 트랜잭션으로 묶어 관리 가능.
- 예외 처리: Service 계층에서 발생한 예외에 따라 트랜잭션을 자동으로 커밋하거나 롤백.
- 책임 분리: Repository는 데이터 접근만 담당하고, 트랜잭션 관리는 Service에서 처리.
언제 사용하면 좋을까?
- 여러 Repository 호출이나 외부 API 호출을 조합한 복잡한 로직을 처리할 때.
- 비즈니스 작업 전체를 하나의 트랜잭션으로 묶어야 할 때.
Repository 계층에서 @Transactional
Repository 계층은 데이터 접근 로직을 처리하는 곳입니다.
이 계층에 @Transactional을 사용하면 특정 데이터 접근 작업을 트랜잭션 단위로 묶을 수 있습니다.
예제
@Repository public class OrderRepository { @Transactional public void save(Order order) { entityManager.persist(order); } }
장점
- 특정 데이터 접근 로직만 트랜잭션으로 묶고자 할 때 유용.
- 단순한 데이터 작업에 적합.
단점
- 여러 Repository를 조합한 작업에서는 트랜잭션 경계가 불명확해질 수 있음.
- Service 계층에서 트랜잭션을 관리하지 않으면 코드가 비일관적이 될 수 있음.
언제 사용하면 좋을까?
- Service 계층이 필요 없을 정도로 간단한 데이터 작업만 처리할 때.
- 트랜잭션 범위를 좁게 설정하고 싶을 때.
Service vs Repository: 무엇을 선택해야 할까?
- 둘 중 하나를 선택해야 한다면 Service 계층에서 트랜잭션을 관리하는 것이 일반적으로 더 권장되며, 이유는 다음과 같습니다.
- Service 계층에서 트랜잭션 관리: 비즈니스 로직의 경계를 명확히 설정할 수 있음.
- Repository는 데이터 접근만 담당: 트랜잭션의 책임을 분리하고 역할을 명확히 할 수 있음.
- 예외 상황
- 간단한 애플리케이션이나 특정 Repository 메서드만 트랜잭션이 필요한 경우, Repository에 @Transactional을 사용하는 것도 괜찮습니다.
Service와 Repository에 동시에 사용하면?
- Service와 Repository에 중복으로 @Transactional을 사용해도 문제가 되지는 않습니다.
- 다만, Service 계층의 트랜잭션이 우선됩니다.
- 즉, Service에서 시작된 트랜잭션에 Repository가 참여하게 됩니다.
- 또한, 중복 사용의 단점이 발생합니다.
- 불필요한 코드 중복 발생.
- 트랜잭션 관리 책임이 명확하지 않음.
결론
- @Transactional은 어디에 적용하느냐에 따라 트랜잭션 관리 방식이 달라집니다.
- Service 계층: 비즈니스 로직 전체를 트랜잭션 단위로 묶어야 할 때 사용.
- Repository 계층: 특정 데이터 접근 작업만 트랜잭션 단위로 묶을 때 사용.
- 추천 설계
- 대부분의 경우 Service 계층에 @Transactional을 사용하고,
- Repository는 데이터 접근에 집중하도록 설계하는 것이 유지보수성과 확장성 면에서 유리합니다.
'Web_App > Kotlin' 카테고리의 다른 글
[Kotlin] @Transactional (0) | 2024.12.23 |
---|---|
[Kotlin] @Service vs @Component (2) | 2024.12.23 |
[Kotlin] Controller와 Service의 계층 구조 (0) | 2024.12.20 |
[Kotlin] @SqlResultSetMapping (0) | 2024.12.20 |
[Kotlin] ORM, JPA, Spring Data JPA (1) | 2024.12.18 |
Comments