MockMvc를 이용한 Spring Boot 통합 테스트 중, mock 요청 시 특정 entity가 detach 상태가 되는 에러를 만났다.
에러 내용 : moim.getChatRoom() is null
그래서 해당 테스트 코드 내에서 moim.getChatRoom()
으로 null 체크를 했지만 null이 아닌 상태였다.
즉, mockMvc.perform()을 통한 요청에서만 null 값을 반환하며, 이는 엔티티의 영속 상태와 관련이 있다고 짐작했다.
구글링을 해봐도 적합한 해결책을 찾지 못해서 ChatGPT에게 물어봤다.
답변의 내용은 대충 이러하다.
service layer에서 DB에 엔티티를 조회했고, @Transactional 어노테이션 덕분에 moim 엔티티는 영속 상태가 맞으며, moim.getChatRoom() 또한 null값이 아니어야 하는게 맞다.
하지만, MockMvc는 실제 요청과 달리 해당 테스트 코드 내부 또는 @BeforeEach에서 세팅한 내용과 service layer의 동작 간에 동일한 트랜잭션을 보장하지 않는다.
따라서 @Transactional 어노테이션을 통해 실제 환경과 같이 동일한 트랜잭션 내에서 동작이 이루어지도록 설정해야 한다.