# 현재 문제가 되었던 부분은, 상품을 조회하는 도중에 상품을 삭제하는 부분(수정도 마찬가지이다)에 대한 부분이었다.
이를 위해, 상품을 조회하는 도중에 상품을 삭제하는 동시성 문제에 대한 test 코드를 작성하도록 하겠다.
@Test
public void testDeleteProductAndThenFind() throws InterruptedException {
// Given
Long productId = 1234L;
String userEmail = "test@naver.com";
Product product = new Product(productId, "Test Product", 100,
"aGVsbG8gd29ybGQ=".getBytes(), "aGVsbG8gd29ybGQ=".getBytes(),
LocalDate.now(), true, 3002, LocalDate.now(), "hahaha",
"test@example.com");
productRepository.save(product);
// When
ExecutorService executorService = Executors.newFixedThreadPool(2);
CountDownLatch latch = new CountDownLatch(2);
executorService.execute(() -> {
productService.deleteProduct(productId,"test@exaple.com");
latch.countDown();
});
executorService.execute(() -> {
ResponseEntity<ProductResponse> foundProduct = productService.findProductDetail(productId);
assertNull(foundProduct.getBody()); //then
latch.countDown();
});
latch.await();
}
executorService에, thread를 몇개로 둘 것인지 정리한다.
2개의 thread는 동시에 동작하게 된다.
thread1은 , 삭제를 . thread2는 조회를 진행한다.
삭제과정에서 비관적 Lock을 걸어두었기 때문에, 조회 도중에도 대기하였다가
삭제가 다 되고 난 이후에야 조회를 진행한다.
이미 삭제가 되고 난 내용을 조회하여도, null이 반환될 수 밖에 없다.
NULL이 나옴을 확인하였고, TEST가 종료된다.
'백엔드 > 스프링+boot' 카테고리의 다른 글
MAIL로 첨부파일 JPG를 보내는 과정에서의 문제들 (0) | 2024.05.16 |
---|---|
WEBFLUX (1) | 2024.02.18 |
기타 기술 + JPA 기본 설정 (0) | 2024.01.04 |
VIew, View template (1) | 2024.01.04 |
오류 (4) | 2024.01.04 |