SpringBootTest에서는 동시성 테스트가 되는데 DataJpaTest는 왜 안될까

태그
Spring
개발하다 뭐가 안되는
미완성
  • 하나의 자원에 대해 여러 주체가 접근할 때 갱신 이상이 발생하지 않도록 동시성 이슈를 테스트 해보고 해결하기 위해(Lock으로) 테스트 하던 중 SpringBootTest 에서는 되는데 DataJpaTest는 왜 안될까? 의문이 들었다.
  • 일단 두 Annotation의 개념과 차이 부터
  • SpringBootTest
    • 주로 통합 혹은 인수 테스트를 할 때 사용한다.
    • Bean을 주입 받을 수 있다.
  • DataJpaTest
    • 이름 그대로 JPA 를 테스트하는 경우에 주로 사용한다.
    • DataJpaTest 에서는 Transaction 어노테이션이 기본적으로 붙어 있다.
    • 매 테스트마다 Rollback을 시도한다. 따라서 테스트마다 격리될 수 있음
  • 문제 상황
    • 다음과 같은 코드를 작성했다. 30 개의 스레드로 하나의 좌석에 대해 동시 요청을 보내는 케이스다.
    • int count = 30; ExecutorService service = Executors.newFixedThreadPool(count); CountDownLatch latch = new CountDownLatch(count); for (int i = 0; i < count; i++) { service.execute(() -> { try { var command = new TicketReservation(1, ticket.getId()); ticketService.makeReservation(command); } catch (Exception e) { e.printStackTrace(); } finally { latch.countDown(); } }); } latch.await();

요약

📌
요약: