in-memory db를 사용하여 repository delete를 테스트 하는 법
테스트 폴더에 application.yml을 생성하여 in-memory database를 사용중이다.
application.yml 안 내용은 다음과 같다.
아무것도 없어도 되지만 로그를 보기 위해서 show-sql를 추가했다.
format이 잡힌 형식으로 뽑아낼수도 있지만 여러개의 데이터를 insert하고 delete 하기 위해서 하지 않았다.
내가 짠 코드는 다음과 같다.
해당 코드를 작성한 이유는 N+1 및 jpa delete에 대해 공부하고 블로그 글을 작성하려고 했다.
문제는 내가 예상한 insert 100개의 로그는 정상적으로 나타나지만 delete 로그가 나타나지 않는것이다.
이걸 위해서 application.yml을 하루종일 수정했지만 별다른 반응이 없었다.
method를 분리도 해보고 서비스에 넣어도 보고 했지만 실패...
다음처럼 그냥 끝나버린다.
아무리 해도 이상했다. 그래서 혹시 @BeforeEach 안에 존재하는 애들만 로그가 찍히는건가 해서 다음과 같은 테스트를 했다.
원래 @BeforeEach에서 하는 insert 작업만을 돌리고 따로 로그를 확인했다.
결과는 insert 쿼리가 발생하지 않는다.
뇌피셜로 트랜잭션내에서 db가 저장되지 않고 롤백이 되기 때문에 로그가 sql 로그가 찍히지 않는것으로 보인다.
메소드에 트랜잭션 어노테이션을 작성하면 해당 메소드가 끝날때 커밋이 들어가는걸로 알고있는데, 동시에 롤백도 진행돼야 하기 때문에 그냥 롤백만 되는것같다.
첫번째 테스트에서 insert 로그가 나타났던것은 @BeforeEach를 사용해서 내가 원하는 테스트를 동작하기 전 해당 메소드가 끝나고 다음 메소드를 타기 전에 커밋이 이루어지기에 뜨는것 같다.
해결 방법은 다음과 같다.
delete를 하고 flush를 해주면 된다.
jpa의 경우 영속성 컨텍스트에 저장됐다가 db에 적용이 되는데, 플러시를 하면 바로 db까지 적용이 된다.
그러면 delete 하는 sql log까지 확인할 수 있다.
원래 하려던게 있었는데 이상한곳에서 갑자기 헷갈려서 고생했다.
'Java & Spring Boot' 카테고리의 다른 글
Java 객체, 클래스, 인스턴스의 차이 (0) | 2022.07.18 |
---|---|
자바에서 효율적으로 Exception 커스텀하기 (0) | 2022.02.08 |
기본 클래스 org.gradle.wrapper.GradleWrapperMain을(를) 찾거나 로드할 수 없습니다. (0) | 2021.11.04 |
Querydsl OneToMany 조건 검색, ListPath (0) | 2021.10.20 |
QueryDSL 서브쿼리 Sort 적용 (0) | 2021.10.12 |