@Transactional 과 @SpringBootTest

greenTea·2023년 4월 21일
0

error 발생

🤔테스트를 돌리던 중 계속 unique sql 예외가 터져 골머리를 앓았다. 테스트 코드의 경우 @Transactional을 걸어주게 되면 rollback이 되기에 기본적으로 걸어 놓고 테스트를 진행하였는데 unique에러가 발생하여 정말 당황하였다.

처음에는 영속성 컨텍스트가 공유되어서 그럴지도 모르겠다고 생각하여 em.flushem.clear로 날려주고 테스트를 해보았지만 그래도 같은 에러가 발생하였다.

그래서 구글링을 통해 조사한 결과 mysql에서 auto_increment 문제일 수도 있다는 글을 보고 지우는 것만으로는 안된다고 하여서 아예 테스트마다 전부 다른 속성 값들을 배치하여 진행하였다.

그러자 테스트가 통과하였다.

확실히 다른 값을 주면 unique 에러가 발생할 수 없긴 하지만 뭔가 찜찜하였다. 그래서 더 구글링을 해본 결과 그 원인을 찾아냈다.

현재 내가 테스트하는 코드의 어노테이션은 아래와 같다.

테스트 코드의 어노테이션

@Transactional
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class AnswerServiceTest {

😭위에서 테스트를 돌릴 경우 랜덤 포트로 돌리고 있는데 이것이 문제가 되었다. 스프링 공식 문서를 보게 되면 랜덤 포트랑 같이 쓰면 다른 서버와 http client가 다른 스레드의 환경에서 진행되어서 transaction도 같이 분리된 다는 것이였다. 그래서 결국 rollback이 되지 않기에 unique 에러가 발생한 것이였다.

@Transactional
@SpringBootTest
class AnswerServiceTest {

실제로 제거를 해주자 귀신같이 잘 진행되었다. 앞으로는 주의해서 사용해야 겠다.

참고 블로그 : 👍kth990303

profile
greenTea입니다.

0개의 댓글