자바/리팩토링
[리팩토링]동시성을 가지는 서비스에 대한 테스팅 - ExecutorService 와 Future
OverTheHorizon3410
2023. 10. 10. 23:10
- 동시성을 고려하여 pessimisstic lock 을 통해 select 이후 해당 행에 대한 잠금을 수행하고, 업데이트 delete 등을 수행하였다.
- 그렇다면,,? 서비스를 테스트할때는 어떻게 동시적으로 서비스를 수행하는 사용자에 대한 고려를 반영할 수 있을까 고민이 되었다.
병렬처리를 위한 Java
ExecutorService
와Future
- 여러 스레드를 사용하여 비동기 작업을 수행하고 결과를 관리할 수 있도록 해주는 컴포넌트입니다.
- ExecutorService 와 그 역할
- Java 의 쓰레드 풀을 관리하는 서비스
- 쓰레드의 생성, 실행 및 종료를 관리할 수 있다.
int numberOfThreads = 100; ExecutorService executorService = Executors.newFixedThreadPool(numberOfThreads);
- 쓰레드 풀을 매개변수 갯수 만큼 관리할 수 있게 된다.
- Future
- 비동기 작업 결과를 참조하고 관리할 때 사용할 수 있다.
- 초기 테스트 코드의 경우
- 쓰레드가 여럿 실행되면서 실제로
- 10번 스레드에서 실패!
- 2번 성공
- 1번 성공
- 등의 경우 특정 스레드에서 실패했더라도 다른 스레드에서 성공하여서 테스트가 지멋대로 성공처리가 되어버리는 경우가 발생했다.
- 하지만, Future 를 통해
for (int i = 0; i < numberOfThreads; i++) { /* 비동기 작업의 제출 */ } for (Future<?> future : futures) { future.get(); // 작업의 완료를 기다리고 결과를 가져옴 } executorService.shutdown(); // 쓰레드 풀 종료
- 모든 스레드가 작업이 완료될때를 기다리고 결과를 가져오면서
- 정확한 테스트가 가능하도록 도움을 줄 수 있다.
Uploaded by N2T