🤍 전 강의 25% 할인 중 🤍

2024년 상반기를 돌아보고 하반기에도 함께 성장해요!
인프런이 준비한 25% 할인 받으러 가기 >>

  • 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Service, Repository 트랜잭션

24.05.22 22:20 작성 조회수 91

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
[JPA 적용1 - 개발] 14:08 에서 일반적으로 비즈니스 로직을 시작하는 서비스 계층에 트랜잭션을 걸어준다고 했는데 Service + Repository 둘다 트랜잭션을 거는 경우도 있을까요?

둘다 트랜잭션을 거는 경우에 Service에서는 정상적으로 작동해서 트랜잭션이 걸리지 않고, Repository에서는 롤백이 되는 경우도 있을까요?

답변 2

·

답변을 작성해보세요.

1

codesweaver님의 프로필

codesweaver

2024.05.23

안녕하세요. 김지연님, 공식 서포터즈 코즈위버입니다.

서비스와 리포지토리 모두에 트랜잭션을 거는 경우는 흔하지는 않습니다. AI 답변의 링크처럼, 서비스를 생략한 앱 형태라면 리포지토리에 트랜잭션을 걸기는 하나 이 경우도 드뭅니다.

둘 다 트랜잭션을 견 경우, 보통 리포지토리에서 롤백이 발생하면 서비스에서도 롤백 처리됩니다. 그러나 리포지토리에서 롤백이 발생하더라도 서비스는 강제로 커밋하도록 설정을 할 순 있습니다만, 권장하지 않는 방법입니다. 리포지토리 상태오 ㅏ무관하게 서비스를 강제 커밋하려면 아래의 어노테이션 설정을 이용해야합니다.

 @Transactional(propagation = Propagation.REQUIRES_NEW)
 public Xxx 서비스메서드() { ... }

 

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.05.22

안녕하세요, 인프런 AI 인턴입니다.

김지연님의 질문에 대한 답변으로, 실제 운영에서 트랜잭션을 Repository에 적용하기도 하나요? 이 질문과 transactional 질문이 김지연님의 질문에 답할 수 있는 내용을 포함하고 있습니다.

일반적으로, 트랜잭션 어노테이션(@Transactional)을 서비스 계층(Service)에 적용하는 것이 일반적인 패턴입니다. 서비스 계층에서 비즈니스 로직을 처리하는 과정에서 여러 개의 DB 조작을 하나의 트랜잭션으로 묶어서 데이터의 일관성을 유지하는 것이 목적이기 때문입니다.

하지만, 트랜잭션을 Repository에 적용하기도 하나요?에서 언급된 것처럼, JPA를 사용할 때 데이터 변경 작업은 반드시 트랜잭션 안에서 이루어져야합니다. 이 때문에 서비스 계층 외에도 Repository 계층에 트랜잭션을 적용할 필요가 있을 수 있습니다. 하지만 이는 주로 읽기 전용 트랜잭션의 경우이거나, 몇몇 특수한 상황에서 필요할 때 제한적으로 사용됩니다.

transactional 질문에서 설명한 것처럼, 트랜잭션을 서비스 계층에 거는 주된 이유는, 이 계층에서 처리해야 하는 여러 작업들을 하나의 트랜잭션으로 묶어 관리하기 위함입니다. 이는 비즈니스 로직의 실행 중 발생할 수 있는 여러 변경 사항들이 모두 성공적으로 처리되거나, 실패할 경우 함께 롤백되어야 하는 필요성 때문입니다.

질문하신 것처럼 서비스와 리포지토리 둘 다에 트랜잭션을 적용하는 경우가 있을 수 있으나, 트랜잭션의 범위와 관리는 주로 서비스 계층에서 이루어집니다. 또한, 스프링의 트랜잭션 전파 방식(Propagation)에 따라 서비스 계층에서 시작한 트랜잭션이 리포지토리 계층으로 전파되며, 이 과정에서 발생하는 모든 데이터의 변경 사항들은 하나의 트랜잭션으로 관리되어야 합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

채널톡 아이콘