다음 테스트 코드에서 @Transactional
, @Rollback
의 역할을 알아본다.
@SpringBootTest
@Transactional
@Rollback(value = false)
class MemberRepositoryTest {
@Autowired
MemberRepository memberRepository;
@Test
void testMember() {
Member member = new Member("memberA");
Member savedMember = memberRepository.save(member);
Member findMember = memberRepository.findById(savedMember.getId()).get();
assertThat(findMember.getId()).isEqualTo(member.getId());
assertThat(findMember.getUsername()).isEqualTo(member.getUsername());
assertThat(findMember).isEqualTo(member);
}
}
testMember 테스트 메소드 내 memberRepository를 사용하기 위해서 @Transactional
어노테이션이 필요하다. 없으면 다음 에러가 뜬다.
org.springframework.dao.InvalidDataAccessApiUsageException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
...
Caused by: jakarta.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
...
Transaction 메소드를 사용하기 위해 필요해 보인다.
@Rollback
값은 기본적으로 true다. @Transactiona
l을 통해 DB에 변경사항이 반영이 되지 않고 롤백 된다. 따라서 save를 통한 insert 쿼리를 확인할 수 없다. 이를 확인하기 위해 @Rollback 어노테이션 값을 false로 두어 공부할 때 확인한다.
롤백하지 않으면 위처럼 insert 쿼리를 확인할 수 있다.
유익한 자료 감사합니다.