[Spring Boot] @Test에서 multi thread로 동시성 테스트하기

YE Kim·2023년 8월 8일
0

동시성이슈

목록 보기
3/6

이 글은 인프런 '재고시스템으로 알아보는 동시성이슈 해결방법' 강의를 듣고 작성한 글입니다.
현재 위치 : 6강

목적

테스트 작성 시 multi thread로 동시에 일어나는 일을 가정한다.

사전 지식

멀티 스레드란?

  • 정의 : 프로세스 내에서 실행되는 흐름의 단위. 여기서는 하나의 프로그램 내에서 실행되는 처리 단위를 뜻하며, 멀티 스레드란 동시에 여러 요청을 처리하는 기능.

  • 스프링에서는?
    내장된 was 톰 캣이 thread pool 관리를 하여 여러 요청이 들어오면 자동으로 멀티 스레드로 처리한다.

다뤄봤던 스레드 예제

  • 대학교 과제에서 c언어 pthread의 pid, tid, join 등을 다뤄봤음.

결론 : 사용 방법 (주석 참고)

방법 1. execute(()->{}) 로 직접 함수 작성 및 실행
방법 2. implements Runnable, submit() 으로 custom 실행 객체 작성 및 실행


예제 :

@Test
void multiThreads() throws InterruptedException {

	// thread 사용할 수 있는 서비스 선언, 몇 개의 스레드 사용할건지 지정	
    ExecutorService executorService = Executors.newFixedThreadPool(2);
	
    // 다른 스레드 작업 완료까지 기다리게 해주는 클래스
    // 몇을 카운트할지 지정
    // countDown()을 통해 0까지 세어야 await()하던 thread가 다시 실행됨
	CountDownLatch latch = new CountDownLatch (2);

	// thread 실행
    // 보통 for문안에서 여러번 같은 코드를 실행시킴
    executorService.execute(() -> {
		// thread가 실행할 작업 코드 ...
        
        // CountDownLatch의 카운트 감소
        latch.countDown();
        
        // count가 0이 될 때까지 대기
        latch.await();
    });
    
	// 또는 executorService에 Runnable을 상속받은 클래스를 직접 submit할 수도 있음.
    executorService.submit(new CustomRunnable());

}

CustomRunnable.java

// Runnable 클래스 상속
public class CustomRunnable implements Runnable {
   
    public CustomRunnable() {}
	
    // 어떤 일을 실행할건지 override 필요
    @Override
    public void run() {
		// 뭔가 실행할 내용
    }
}

참고

ExecutorService : 1, 2

CountDownLath : https://1minute-before6pm.tistory.com/30

profile
주니어 백엔드 개발자

0개의 댓글