서버

Springboot3 - SpringBootTest에서 insert문 안 나가는 이유(@Transactional, @Rollback(false)

탐훈 2024. 12. 30. 12:10
728x90

 

insert 시키는 두가지 방법

1. @Rollback(false) 사용 (DB insert 후 rollback 처리안됨)

2. EntityManager의 flush 처리 (DB insert 후 rollback 처리됨)

 

 

 


 

 

 

1. @Rollback(false) 사용 (DB insert 후 rollback 처리안됨)

 

@SpringBootTest
@Transactional
class JpashowApplicationTests {

	@Autowired
	MemberRepository memberRepository;

	@Autowired
	MemberService memberService;

	@Autowired EntityManager em;

	@Test
	@Rollback(false)
	public void 회원가입() {
		// given
		Member member = new Member();
		member.setName("kim");

		Address address = new Address();
		address.setCity("test22");
		address.setStreet("street22");
		address.setZipcode("test zipcode");

		member.setAddress(address);

		// when
		// 영속성 콘텍스트에 들어감.
		Long saveId = memberService.join(member);

		// then
		Member findMember = memberRepository.findOne(saveId);

		assertEquals(member, findMember);
	}

 

 

@Rollback(false) 하는 경우

DB까지 주입된다. 

 


 

2. EntityManager의 flush 처리 (DB insert 후 rollback 처리됨)

 

repository에서 entityManager에게 얘기해준다.

"이거 관리해줘! DB에 들어갈 수도 있으니까"

 

이후 EnityManager는 

DB에 넣어달라고 하지 않으면 넣지 않는다. (em.flush())

 

그래서

영속성 컨텍스트 flush 해주는 순간

insert 쿼리문이 나간다. 

 

 

 

 

	@Test
	public void 회원가입() {
		// given
		Member member = new Member();
		member.setName("kim");

		Address address = new Address();
		address.setCity("test22");
		address.setStreet("street22");
		address.setZipcode("test zipcode");

		member.setAddress(address);

		// when
		// 영속성 콘텍스트에 들어감.
		Long saveId = memberService.join(member);

		// then
        // >>>> insert를 위한 flush 처리
		em.flush();

		Member findMember = memberRepository.findOne(saveId);

		assertEquals(member, findMember);
	}