- 하나의 자원에 대해 여러 주체가 접근할 때 갱신 이상이 발생하지 않도록 동시성 이슈를 테스트 해보고 해결하기 위해(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();
요약
요약: