Version
Situtation
- 오래전부터 프로젝트에 멀티 모듈이 구성되어 있음
- CI 서버에서 수행되는
gradle
테스트들의 시간이 오래 걸림
- 일부 테스트들이 깨지는 현상이 있었음
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKLLB77HOFD0KVVFLM6795V1NUR: PUBLIC.ORDER FOREIGN KEY(PRODUCT_ID) REFERENCES PUBLIC.PRODUCT(ID) (5518)"; SQL statement:
Analysis
- H2에
ddl-auto
가 create-drop
로 설정되어 있음
- 테이블이
drop
되는 과정에서, 데이터베이스 외래키 제약 조건을 맞추지 못하는 테스트 데이터들이 존재
- 테스트 케이스가 워낙 많고,
@DatabaseSetup
을 쓰고 있는 상황이기 때문에 모든 데이터들을 수정하는 것은 보류
Trial
- 테스트 데이터들이 정합성에 맞게끔 생성하는 것은 수정 범위가 크고, 비효율적이라고 생각
- 테스트를 통해서 생성된 데이터들은 해당 클래스 범위에서만 유효하면 되고, 다른 클래스들에서는 보이지 않기 위해서
@Transactional
적용
Result
- 테스트 클래스의
@Transactional
을 적용하여 해당 데이터가 커밋되기전에 롤백하도록 변경
- 테스트 클래스에서 롤백이 성공되면 아래의 로그를 확인할 수 있음
2023-09-18 23:38:17.234 INFO 93809 --- [ main] o.s.t.c.transaction.TransactionContext : Rolled back transaction for test: [DefaultTestContext@609640d5 testClass = ...]