diff --git a/spring-transaction/src/main/java/com/example/springtransaction/propagation/LogRepository.java b/spring-transaction/src/main/java/com/example/springtransaction/propagation/LogRepository.java index 1460a3b6..ef5c3b33 100644 --- a/spring-transaction/src/main/java/com/example/springtransaction/propagation/LogRepository.java +++ b/spring-transaction/src/main/java/com/example/springtransaction/propagation/LogRepository.java @@ -3,6 +3,7 @@ package com.example.springtransaction.propagation; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; @@ -15,7 +16,7 @@ public class LogRepository { private final EntityManager em; - @Transactional + @Transactional(propagation = Propagation.REQUIRES_NEW) public void save(Log logMessage) { log.info("log 저장"); em.persist(logMessage); diff --git a/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberService.java b/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberService.java index 9eece107..29c3e015 100644 --- a/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberService.java +++ b/spring-transaction/src/main/java/com/example/springtransaction/propagation/MemberService.java @@ -27,6 +27,7 @@ public class MemberService { log.info("== logRepository 호출 종료 =="); } + @Transactional public void joinV2(String username) { Member member = new Member(username); Log logMessage = new Log(username); diff --git a/spring-transaction/src/test/java/com/example/springtransaction/propagation/MemberServiceTest.java b/spring-transaction/src/test/java/com/example/springtransaction/propagation/MemberServiceTest.java index 42b1b003..bee592b9 100644 --- a/spring-transaction/src/test/java/com/example/springtransaction/propagation/MemberServiceTest.java +++ b/spring-transaction/src/test/java/com/example/springtransaction/propagation/MemberServiceTest.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.UnexpectedRollbackException; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -110,4 +111,40 @@ class MemberServiceTest { assertTrue(memberRepository.find(username).isEmpty()); assertTrue(logRepository.find(username).isEmpty()); } + + /** + * memberService @Transactional:ON + * memberRepository @Transactional:ON + * logRepository @Transactional:ON Exception + */ + @Test + void recoverException_fail() { + //given + String username = "로그예외_recoverException_fail"; + + //when + assertThrows(UnexpectedRollbackException.class, () -> memberService.joinV2(username)); + + //then + assertTrue(memberRepository.find(username).isEmpty()); + assertTrue(logRepository.find(username).isEmpty()); + } + + /** + * memberService @Transactional:ON + * memberRepository @Transactional:ON + * logRepository @Transactional:ON(REQUIRES_NEW) Exception + */ + @Test + void recoverException_success() { + //given + String username = "로그예외_recoverException_success"; + + //when + memberService.joinV2(username); + + //then + assertTrue(memberRepository.find(username).isPresent()); + assertTrue(logRepository.find(username).isEmpty()); + } } \ No newline at end of file