🤔테스트를 돌리던 중 계속 unique sql
예외가 터져 골머리를 앓았다. 테스트 코드의 경우 @Transactional
을 걸어주게 되면 rollback
이 되기에 기본적으로 걸어 놓고 테스트를 진행하였는데 unique
에러가 발생하여 정말 당황하였다.
처음에는 영속성 컨텍스트가 공유되어서 그럴지도 모르겠다고 생각하여 em.flush
와 em.clear
로 날려주고 테스트를 해보았지만 그래도 같은 에러가 발생하였다.
그래서 구글링을 통해 조사한 결과 mysql
에서 auto_increment
문제일 수도 있다는 글을 보고 지우는 것만으로는 안된다고 하여서 아예 테스트마다 전부 다른 속성 값들을 배치하여 진행하였다.
그러자 테스트가 통과하였다.
확실히 다른 값을 주면 unique
에러가 발생할 수 없긴 하지만 뭔가 찜찜하였다. 그래서 더 구글링을 해본 결과 그 원인을 찾아냈다.
현재 내가 테스트하는 코드의 어노테이션은 아래와 같다.
@Transactional
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class AnswerServiceTest {
😭위에서 테스트를 돌릴 경우 랜덤 포트로 돌리고 있는데 이것이 문제가 되었다. 스프링 공식 문서를 보게 되면 랜덤 포트랑 같이 쓰면 다른 서버와 http client
가 다른 스레드의 환경에서 진행되어서 transaction
도 같이 분리된 다는 것이였다. 그래서 결국 rollback
이 되지 않기에 unique
에러가 발생한 것이였다.
@Transactional
@SpringBootTest
class AnswerServiceTest {
실제로 제거를 해주자 귀신같이 잘 진행되었다. 앞으로는 주의해서 사용해야 겠다.
참고 블로그 : 👍kth990303