[리팩토링]동시성을 가지는 서비스에 대한 테스팅 - ExecutorService 와 Future

  • 동시성을 고려하여 pessimisstic lock 을 통해 select 이후 해당 행에 대한 잠금을 수행하고, 업데이트 delete 등을 수행하였다.
  • 그렇다면,,? 서비스를 테스트할때는 어떻게 동시적으로 서비스를 수행하는 사용자에 대한 고려를 반영할 수 있을까 고민이 되었다.

병렬처리를 위한 Java

  • ExecutorServiceFuture
    • 여러 스레드를 사용하여 비동기 작업을 수행하고 결과를 관리할 수 있도록 해주는 컴포넌트입니다.
  1. ExecutorService 와 그 역할
    1. Java 의 쓰레드 풀을 관리하는 서비스
    1. 쓰레드의 생성, 실행 및 종료를 관리할 수 있다.
    int numberOfThreads = 100;
    ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
    • 쓰레드 풀을 매개변수 갯수 만큼 관리할 수 있게 된다.
  1. Future
    1. 비동기 작업 결과를 참조하고 관리할 때 사용할 수 있다.
    1. 초기 테스트 코드의 경우
      • 쓰레드가 여럿 실행되면서 실제로
      • 10번 스레드에서 실패!
      • 2번 성공
      • 1번 성공
      • 등의 경우 특정 스레드에서 실패했더라도 다른 스레드에서 성공하여서 테스트가 지멋대로 성공처리가 되어버리는 경우가 발생했다.
    • 하지만, Future 를 통해
      for (int i = 0; i < numberOfThreads; i++) {
          /* 비동기 작업의 제출 */
      }
      for (Future<?> future : futures) {
          future.get();  // 작업의 완료를 기다리고 결과를 가져옴
      }
      executorService.shutdown();  // 쓰레드 풀 종료
      • 모든 스레드가 작업이 완료될때를 기다리고 결과를 가져오면서
      • 정확한 테스트가 가능하도록 도움을 줄 수 있다.

Uploaded by N2T