- 동시성을 고려하여 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
'자바 > 리팩토링' 카테고리의 다른 글
[DB락] MYSQL INNODB 락 관련 게시물 참고 (0) | 2023.10.24 |
---|---|
[테스트코드] Mockito API (0) | 2023.10.22 |
[리팩토링]출고 → 배송 → 도착 순서 보장을 어떻게 할 수 있을까? (0) | 2023.10.08 |
[리팩토링]Spring boot 2.7 에서 schema.sql 한글 깨짐 (0) | 2023.10.07 |
[리팩토링] Mybatis 에서 XML 사용하지 않는 방법 (동적쿼리는 불가능..) (0) | 2023.10.07 |