Spring
테스트 단 @Transactinal 롤백
Seung__Yong
2023. 3. 30. 17:32
테스트를 짜던 도중 set을 이용해 데이터를 변경시에는 DB에 반영이 안되는데 Service를 이용할 시에는 반영되는 현상을 보고 Transactinal을 붙였더니 뭔가 다 안되길래 해결한 경험을 적습니다!
Spring Boot Test에서는 테스트 수행 후에 트랜잭션 커밋 내역을 모두 롤백시킵니다.
어렴풋이 알고는 있었지만 평소에 테스트 할 때에 service난 repository를 주입받아서 사용하면 데이터가 저장되었던 기억과 혼동되어서 정확한 동작원리를 파악하지 못하고 있었습니다.
정확히는 테스트 레벨에 붙어있는 Transactional은 롤백 되지만 주입받아서 사용하는 Service단이나 Spring Data JPA에서 기본으로 제공하는 @Transactinal은 롤백되지 않습니다.
또한, 이 둘이 동시에 있을경우 Service단의 Transactional 커밋 내역은 롤백 됩니다.
정리
- Spring Data JPA제공 메서드는 @Transactinal이 붙어있다!
- 테스트 단에서의 @Transactional은 종료 시 롤백된다.
- 동시 사용시 테스트 단의 Transacinal로 인해 모든 결과 롤백
- 결과를 반영하기 위해서는 @Rollback(value = true) 해주면 된다.
- 또한 springBoot3.0이상부터는 Service단의 수정 부분에 @Transactinal을 반드시 붙여줘야 동작합니다.