제목은 저렇지만, 실제로는 확인해보니 카운트 쿼리는 날아갔는데 엔티티 값이 업데이트 되지 않고 있던 것이었다.
Study 엔티티에 대해 @Formula 를 사용하여 카운트 값(스터디 참여인원 )을 서브쿼리를 통해 가져오도록 작성했다.
그런데 테스트코드에서 자꾸만 카운트 값이 0이 나오는 것이다 ㅇㅁㅇ..
그런데 테스트 코드에서 출력되는 쿼리를 확인하니 select…(select count(*)….)) 는 날아가고 있었다. 그럼에도 해당 객체의 카운트 값을 출력하면 계속해서 값이 0이 찍히고 있었다.
추측 원인
save 이후 find 를 하는 과정에서 기존에 영속성컨텍스트에 존재하는 값들에 대한 업데이트가 되지 않고 있는 것 같았다.
현재 테스트 클래스는 @DataJpaTest 를 사용한 슬라이스 테스트를 진행하고 있었다.
@DataJpaTest 에는 @Transationcal 이 포함되어있는데, 테스트에서 이 어노테이션은 매 테스트마다 롤백을 수행한다.
이로인해 select 쿼리까지 날아가지 않는 경우가 빈번했다.
현재 우리는 따로 EntityManager를 사용하고 있지 않고 JpaRepository 에 의존하고 있었기 때문에 롤백을 멈출 방법에 대해 바로 적용할 방법이 생각나지 않았다.
따라서 가장 바깥 트랜잭션의 롤백을 피하기 위해 트랜잭션의 전파레벨을 따로 설정하는 방식을 사용했다.
현재 테스트 메소드의 트랜잭션 레벨만을 NEVER 로 설정하였다.
이 결과 별개의 트랜잭션을 가졌고, 실제 카운트 값이 출력되는 것을 확인할 수 있었다.
역시나 영속성 컨텍스트에 값이 업데이트 되지 않는 문제가 맞는 것 같았다.
그런데 현재 테스트 코드에서 이 테스트 메소드의 트랜잭션 전파 레벨을 NEVER 로 설정할 경우 롤백이 일어나지 않아 @DataJpaTest 로 설정했음에도 다른 테스트 결과에 영향을 끼치게 된다는 문제점이 존재한다. ( 아직 해결하지 못했고, 임시적으로 @AfterEach 를 통해 모든 레포지토리를 deleteAllInBactch 로 clear 했다 )