테스트를 짜던 도중 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을 반드시 붙여줘야 동작합니다.
'Spring' 카테고리의 다른 글
@preAuthorize() 로그인 페이지 매핑 (0) | 2023.04.28 |
---|---|
@AllArgsConstructor 사용 지양에 따른 리팩토링 (1) | 2023.04.19 |
SpringBoot3.0 Entity생성오류 (0) | 2023.03.30 |
SpringBoot 트랜잭션 직접 다루기 (0) | 2023.03.29 |
jwt인증 403(forbidden)에러 (1) | 2023.03.08 |