본문 바로가기
백엔드/스프링+boot

Spring에서 동시성 test

by 임지혁코딩 2024. 3. 29.

# 현재 문제가 되었던 부분은, 상품을 조회하는 도중에 상품을 삭제하는 부분(수정도 마찬가지이다)에 대한 부분이었다.

이를 위해, 상품을 조회하는 도중에 상품을 삭제하는 동시성 문제에 대한 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