From 169fa2d725ba133026af9d0ce1effd9b5f31db45 Mon Sep 17 00:00:00 2001 From: Ethan Date: Thu, 12 Oct 2023 23:50:05 +0900 Subject: [PATCH] =?UTF-8?q?test:=20=ED=95=99=EC=8A=B5=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20stage2=20=EC=A3=BC=EC=84=9D=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../transaction/stage2/SecondUserService.java | 2 +- .../java/transaction/stage2/Stage2Test.java | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/study/src/test/java/transaction/stage2/SecondUserService.java b/study/src/test/java/transaction/stage2/SecondUserService.java index 80a3450474..0d240fe854 100644 --- a/study/src/test/java/transaction/stage2/SecondUserService.java +++ b/study/src/test/java/transaction/stage2/SecondUserService.java @@ -46,7 +46,7 @@ public String saveSecondTransactionWithMandatory() { return TransactionSynchronizationManager.getCurrentTransactionName(); } -// @Transactional(propagation = Propagation.NOT_SUPPORTED) + @Transactional(propagation = Propagation.NOT_SUPPORTED) public String saveSecondTransactionWithNotSupported() { userRepository.save(User.createTest()); logActualTransactionActive(); diff --git a/study/src/test/java/transaction/stage2/Stage2Test.java b/study/src/test/java/transaction/stage2/Stage2Test.java index 2a0cb5ee81..4db7d6c1e3 100644 --- a/study/src/test/java/transaction/stage2/Stage2Test.java +++ b/study/src/test/java/transaction/stage2/Stage2Test.java @@ -36,8 +36,8 @@ void tearDown() { } /** - * 생성된 트랜잭션이 몇 개인가? - * 왜 그런 결과가 나왔을까? + * 생성된 트랜잭션이 몇 개인가? 1 + * 왜 그런 결과가 나왔을까? Required는 트랜잭션이 없을 때만 새로 생긴다. */ @Test void testRequired() { @@ -50,8 +50,8 @@ void testRequired() { } /** - * 생성된 트랜잭션이 몇 개인가? - * 왜 그런 결과가 나왔을까? + * 생성된 트랜잭션이 몇 개인가? 2 + * 왜 그런 결과가 나왔을까? Reauired_New 옵션은 트랜잭션 존재 유무와 관계 없이 항생 새로 생긴다. */ @Test void testRequiredNew() { @@ -69,6 +69,7 @@ void testRequiredNew() { /** * firstUserService.saveAndExceptionWithRequiredNew()에서 강제로 예외를 발생시킨다. * REQUIRES_NEW 일 때 예외로 인한 롤백이 발생하면서 어떤 상황이 발생하는 지 확인해보자. + * secondUserService에서 발생한 예외 때문에 롤백되지만 firstUserService는 롤백되지 않는다. */ @Test void testRequiredNewWithRollback() { @@ -83,6 +84,7 @@ void testRequiredNewWithRollback() { /** * FirstUserService.saveFirstTransactionWithSupports() 메서드를 보면 @Transactional이 주석으로 되어 있다. * 주석인 상태에서 테스트를 실행했을 때와 주석을 해제하고 테스트를 실행했을 때 어떤 차이점이 있는지 확인해보자. + * 기존 Transaction이 있으면 새로 만들고 없으면 논리적 트랜잭션으로 동작 */ @Test void testSupports() { @@ -97,7 +99,9 @@ void testSupports() { /** * FirstUserService.saveFirstTransactionWithMandatory() 메서드를 보면 @Transactional이 주석으로 되어 있다. * 주석인 상태에서 테스트를 실행했을 때와 주석을 해제하고 테스트를 실행했을 때 어떤 차이점이 있는지 확인해보자. + * 트랜잭션이 없으면 예외를 발생 * SUPPORTS와 어떤 점이 다른지도 같이 챙겨보자. + * 트랜잭션이 없으면 새로운 논리적 트랜잭션을 만드는 Support와 달리 Mandatory를 예외를 발생시킨다. */ @Test void testMandatory() { @@ -112,7 +116,7 @@ void testMandatory() { /** * 아래 테스트는 몇 개의 물리적 트랜잭션이 동작할까? * FirstUserService.saveFirstTransactionWithNotSupported() 메서드의 @Transactional을 주석 처리하자. - * 다시 테스트를 실행하면 몇 개의 물리적 트랜잭션이 동작할까? + * 다시 테스트를 실행하면 몇 개의 물리적 트랜잭션이 동작할까? simpleJparRepository 때문에 모두 2개씩 사용된다. *

* 스프링 공식 문서에서 물리적 트랜잭션과 논리적 트랜잭션의 차이점이 무엇인지 찾아보자. */ @@ -122,13 +126,15 @@ void testNotSupported() { log.info("transactions : {}", actual); assertThat(actual) - .hasSize(1) - .containsExactly("transaction.stage2.FirstUserService.saveFirstTransactionWithNotSupported"); + .hasSize(2) + .containsExactly("transaction.stage2.FirstUserService.saveFirstTransactionWithNotSupported", + "transaction.stage2.SecondUserService.saveSecondTransactionWithNotSupported"); } /** * 아래 테스트는 왜 실패할까? * FirstUserService.saveFirstTransactionWithNested() 메서드의 @Transactional을 주석 처리하면 어떻게 될까? + * 트랜잭션이 없으면 새롭게 시작하기 때문에 정상동작한다. */ @Test void testNested() { @@ -142,6 +148,7 @@ void testNested() { /** * 마찬가지로 @Transactional을 주석처리하면서 관찰해보자. + * NEVER는 트랜잭션이 없어야 정상동작한다. */ @Test void testNever() {