테스트를 진행하기 전에 @BeforeEach를 통해서
먼저 테스트에 쓸 user들을 테스트 DB에 넣어두었다.
그런데, 테스트를 돌리면 유저가 없다는 예외(커스텀 예외)가 발생했다.
원인을 확안하기 위해서 디버깅을 해봤다.
테스트 시작 전에 @BeforeEach로 user를 db에 저장했는데도
테스트 내부에서 테이블에 있는 모든 레코드를 가져오는 findAll()을 실행하면
아무것도 뜨지 않았다.
user를 save할 때 insert 쿼리가 발생하지도 않았다.
혹시 트랜잭션이 flush가 안돼서 그런건가?
평소에는 이 방식으로 save를 해도 db에 잘 들어갔지만,
일단 flush를 해서 해결해기로 했다.
그런데, 이번엔 트랜잭션이 없다는 예외가 터졌다.
단위 테스크 클래스에 @Transactional는 정상적으로 달려 있었다.
트랜잭션이 정말 없어서 생긴 문제는 아닌 것으로 보인다.
이런 예외는 처음봐서 디버깅으로 원인을 파악해봤다.
프록시로는 정상적으로 만들어지는 것으로 보인다.
트랜잭션도 정상적으로 활성화된 것으로 보였다.
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
logging.level.org.springframework.transaction=TRACE
디버깅을 직접하는 걸로는 원인파악이 잘 안돼서
로그 수준을 좀더 높여봤다.
로그를 보니 원인이 보였다.
메서드마다 트랜잭션이 시작하고 끝나고 있는 게 문제였다.
원래는 트랜잭션 하나로 작업돼야하는 상황인데 이런 문제가 발생한 것.
메서드마다 서로 다른 트랜잭션 매니저를 쓰기때문에 트랜잭션이 달라진 것으로 보인다.
현재 채팅 기능 때문에 트랜잭션을 다 분리해놨는데
채팅을 제외하고선
트랜잭션 매니저 하나로 다 묶어주었다.
트랜잭션을 분리하는 건 채팅 기능 강의를 들으면서 그래야 나중에 채팅을 저장할 때 문제가 없다고 해서 한 것이다.
이렇게 트랜잭션 매니저를 분리한 이유는 다른 기능들과 달리 실시간 메시지 전송/수신이 중요하며, 다른 트랜잭션의 롤백에 영향받지 않아야 하기 때문인 것으로 보인다.
참고로 primaryTransactionManager로 하니까 계속 transactionManager를 못 찾겠다고 예외가 떴다. 스프링에서 기본 설정된 transactionManager가 없어서 그런걸로 보였다.
그래서 이름을 그냥 transactionManager로 변경했다.