서버
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);
}