오늘의 인기 글
최근 글
최근 댓글
Today
Total
01-02 02:44
관리 메뉴

우노

[Kotlin] @Transactional, Service vs Repository 어디에 적용할까? 본문

Web_App/Kotlin

[Kotlin] @Transactional, Service vs Repository 어디에 적용할까?

운호(Noah) 2024. 12. 26. 16:36

Spring에서 @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