본문 바로가기

프로그래밍/Spring

[스프링 부트] Test 이후 롤백(Rollback) 하지 않기

이 글은 오늘 배운 내용을 정리하는 블로그 글 입니다. 


스프링부트에서 테스트 코드를 작성할 때, 테스트 이후에 롤백을 하지 않는 방법에 대해서 알아보겠습니다. 

 

우선 예제 코드를 보겠습니다. 

 

 @Test
 public void Member_Join() throws Exception {
   // given
   Member member = new Member();
   member.setName("youngchulshin");

  // when
  Long savedId = memberService.join(member);

  // then
  Assert.assertEquals(member, memberRepository.findOne(savedId));
}

 

위 코드는 회원 가입이 정상적으로 동작하는지 검증하는 테스트 코드입니다. 

 

when 절에서 'memberService.join' 을 이용해서 'member'를 저장하고, then 절에서 'memberRepository.findOne'을 이용해서 정상적으로 저장이 되었는지 확인하고 있습니다. 

 

 

테스트를 실행해보겠습니다

 

그런데 테스트 코드를 실행해보면 쿼리에 insert 절이 없고, select 구문만 있습니다. 

 

 

이유는 기본적으로 테스트 코드가 실행된 이후에 롤백 되도록 되어 있기 때문입니다. 

어차피 롤백이 될 코드이기 때문에 JPA에서는 Insert 자체를 하지 않습니다. 

 

실제로 DB에서 조회를 해보면 정보가 없습니다. 

 

 

 

이제 DB에 저장이 되도록 수정해보겠습니다.

 

기존 코드에서 @Rollback(false) annotation을 추가해주면 됩니다. 

 

 @Test
 @Rollback(false)	// 이 부분이 추가되었습니다. 
 public void Member_Join() throws Exception {
   // given
   Member member = new Member();
   member.setName("youngchulshin");

  // when
  Long savedId = memberService.join(member);

  // then
  Assert.assertEquals(member, memberRepository.findOne(savedId));
}

 

테스트를 실행해보면 insert 쿼리가 실행되고 실제 DB에 데이터가 저장되는 것을 확인할 수 있습니다. 

 

 

 

 

기타 - 롤백은 하지만 Insert 쿼리를 보고 싶으면, EntityManager를 이용하면 됩니다. 

 

영속성 컨텍스트에 있는 데이터를 실제 DB로 넣어주는 명령어를 실행해서 Insert 쿼리를 확인할 수 있습니다. 

방법은 명시적으로 'flush'를 실행해주면 됩니다. 

 

@Autowired EntityManager em;	// EntityManster 추가

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

  // when
  Long savedId = memberService.join(member);
  em.flush();	// 명시적으로 flush 명령어를 실행해줬습니다

  // then
  Assert.assertEquals(member, memberRepository.findOne(savedId));
}

 

코드 중간에 보시면 'em.flush'를 실행하는 것을 볼 수 있습니다. 

이렇데 되면 실행 로그를 보면 'insert' 쿼리가 실행된 것을 확인할 수 있습니다. 

 

 

감사합니다.