스프링 트랜잭션 전파2 - 활용

:회원 가입을 시도한 로그를 남기는데 실패하더라도 회원 가입은 유지되어야 함.

: 이 요구사항을 만족하기 위해서 로그와 관련된 물리 트랜잭션을 REQUIRES_NEW를 사용해서 별도로 분리.

/**
 * MemberService @Transactional:ON
 * MemberRepository @Transactional:ON
 * LogRepository @Transactional(REQUIRES_NEW) Exception
 */
@Test
void recoverException_success() {
	 //given
	 String username = "로그예외_recoverException_success";

	 //when
	 memberService.joinV2(username); //예외를 복구하는 memberService.joinV2()를 사용

	 //then: member 저장, log 롤백
	 assertTrue(memberRepository.find(username).isPresent());
	 assertTrue(logRepository.find(username).isEmpty());
}

: MemberRepository 는 REQUIRED 옵션을 사용한다. 따라서 기존 트랜잭션에 참여.

: LogRepository 의 트랜잭션 옵션에 REQUIRES_NEW 를 사용.

: REQUIRES_NEW 는 항상 새로운 트랜잭션을 만들기 때문에 해당 트랜잭션 안에서는 DB 커넥션도 별도로 사용.

: 논리 트랜잭션은 하나라도 롤백되면 관련된 물리 트랜잭션은 롤백되어 버림.

: 이 문제를 해결하려면 REQUIRES_NEW 를 사용해서 트랜잭션을 분리.