Search
Duplicate
📒

[Database Study] 04-x. 테스트 - DB 트랜잭션⭐

상태
미진행
수업
Database Study
주제
연관 노트
3 more properties
참고

테스트 - 데이터베이스 분리

NOTE
실제 데이터베이스를 연동해서 테스트를 하면 데이터베이스에 이미 과거에 서버를 실행하면서 저장했던 데이터가 보관되어 있기 떄문에 이 데이터가 현재 테스트에 영향을 준다.
이러한 문제를 해결하기 위해 테스트 전용 데이터베이스를 별도로 운영한다!
jdbc:h2:tcp://localhost/~/test local에서 접근하는 서버 전용 데이터베이스
jdbc:h2:tcp://localhost/~/testcase test 케이스에서 사용하는 전용 데이터베이스

테스트 - 트랜잭션 사용

NOTE
테스트에서 매우 중요한 원칙
테스트는 다른 테스트와 격리해야 한다
테스트는 반복해서 실행할 수 있어야 한다
테스트가 끝날 떄 마다 추가한 데이터에 DELETE SQL을 사용하는 방식도 있지만, 비정상적으로 종료되면, DELETE SQL을 호출하지 못할수도 있다
그래서 트랜잭션의 RollBack을 사용함!

데이터 롤백

//class ItemRepositoryTest @Autowired ItemRepository itemRepository; //트랜잭션 관련 코드 @Autowired PlatformTransactionManager transactionManager; TransactionStatus status; @BeforeEach void beforeEach() { //트랜잭션 시작 status = transactionManager.getTransaction(new DefaultTransactionDefinition()); } @AfterEach void afterEach() { // ... //트랜잭션 롤백 transactionManager.rollback(status); }
Java
복사
@BeforeEach : 각 테스트가 시작하기전 트랜잭션을 시작한다
@AfterEach : 각 테스트가 종료되면 rollback 한다.

@Transactional

스프링은 테스트 데이터 초기화를 위해 트랜잭션을 적용하고 롤백하는 방식을 @Transactional 어노테이션으로 지원한다
앞선 코드의 롤백과 흐름이 동일함
@Transactional @SpringBootTest class ItemRepositoryTest {}
Java
복사
[ 참고]
강제로 커밋하기
만약 rollback을 하지않고 commit을 하고싶다면 다음과 같이 작성한다
//@Rollback(value = false) // 1번 방법 @Commit // 2번 방법 @Transactional @SpringBootTest class ItemRepositoryTest {}
Java
복사