본문 바로가기

JAVA/- Spring

[spring] 테스트시 Rollback 발생, 테스트시 트랜잭션 적용

test코드를 작성하고 성공은 했습니다. 하지만 db에 직접적으로 반영이 안되었습니다.

 

근데.. 테스트는 완료되는데 Rollback이 발생하네요.

콘솔에 Rolled back transaction for test context 라고 떴습니다.

 

찾아본 결과

스프링에서 @Test annotation과 함께 설정된 @Transactional은 항상 rollback됩니다.

따라서 create, update, delete의 로직이 정상적으로 수행됨은 확인하면서도 실제로 DB에 반영되지는 않습니다.

 

롤백이 되는 것과 에러가 발생하는것은 분명한 차이가 있습니다. 

PK(id)가 중복된다면 rollback이 아니라 에러가 발생한 경우입니다. 데이터베이스에 데이터가 없다고 정상처리되지 않았다고 판단하면 안됩니다. 

JUnit이 초록불이라면 데이터베이스에 값이 반영되지 않습니다 매번 실행한다고 해도 DB에 영향이 미치지 않습니다.

하지만 눈으로 직접 추가, 변경, 삭제를 확인해보고 싶다면 어떻게 해야 할까요. JUnit의 @Test 메서드를 실행하면서도 트랜잭션이 롤백되지 않도록 설정하면 됩니다.

 

첫번째 방법은 org.springframework.test.annotation.Rollback annotation을 사용하면 됩니다. 

  @Test
  @Transactional
  @Rollback(false)
  public void testAddContact() throws Exception {
    Contact contact = new Contact();
    contact.setFirstname("YG");
    contact.setLastname("Kim");
    
    contactDAO.addContact(contact);
    
    Assert.assertNotSame(0, contact.getId());
  }

@Rollback(false)라고 하면 test안에서 트랜잭션이 rollback되지 않고 실제로 commit이 됩니다. 

 

두번째 방법은 org.springframework.test.context.transaction.TransactionConfiguration annotation을 사용하면 됩니다. 

@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=false)
public class ContactDAOTest {
...
}

위와 같이 설정하면 모든 테스트 메서드의 롤백이 실행되지 않고 데이터베이스에 반영됩니다.
만약 위와 같이 설정하고 특정 메서드에서 롤백이 되기를 원한다면 @Rollback(true)로 지정하면 됩니다.

728x90