인프런 커뮤니티 질문&답변

AAPPII님의 프로필 이미지

작성한 질문수

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

사용자 스레드 vs 데몬 스레드

현재 제가 겪고 있는 상황인데 조언 부탁드립니다.

작성

·

411

·

수정됨

0

SpringBoot 에서 멀티 스레드로 크롤러가 돌아가는 프로젝트 입니다.

 

junit 테스트 코드를 통해 크롤러가 10개 정도 게시판 페이지를 정상적으로 가져오는지 확인하려고 하는데요.

 

현재 작성된 테스트 케이스는 아래와 같습니다.

@Test

void crawlerTest() {

// 크롤링 시작

crawlerRun();

 

while(스레드풀 작업 종료됐나??) {

// 작업이 안끝났으면

Thread.sleep(5000);

}

}

 

while 문이 있으면 정상적으로 10개의 게시판 페이지를 크롤링한 이후 DB에 적재됩니다.

 

다만 강의를 보면서 while 문이 없어도 되지 않을까 생각해서 삭제하거나 주석처리하면 올바르게 동작하지 않습니다.

 

[while 문 제거 후]

디버깅을 통해 값이 제대로 들어오는지 확인하면서

테스트 케이스를 돌리면 4~5 개정도만 DB 에 크롤링한 데이터가 저장되고 갑자기 오류도 없이 테스트가 종료됩니다.

 

디버깅없이 그냥 실행시키면 6개 정도 DB에 저장되고 테스트가 종료됩니다.

 

crawlerTest() 라는 테스트 코드가 Main Thread 라고 쳤을 때 다른 Thread 들은 정상적으로 동작 중이어야 하지 않나요..?

 

아니면 Spring 환경이라서 이런 문제가 발생하는 것인지

junit 테스트 코드라서 이런 문제가 발생하는건지 궁금합니다!

( Daemon Thread 는 아닙니다! )

답변 2

1

저도 예전에 비슷한 상황을 마주친 적이 있어서 질문을 올렸고,
스스로 답을 찾은 적이 있습니다. 해당 질문 링크를 공유합니다.

https://www.inflearn.com/questions/567543

 

추가적으로 이런 일정 시간 대기 또는 비동기 동작에 대한 Junit 테스트를 하고 싶다면

GitHub - awaitility/awaitility: Awaitility is a small Java DSL for synchronizing asynchronous operations

을 알아보시면 좋을 거 같습니다.

1

정수원님의 프로필 이미지
정수원
지식공유자

음..
이 부분은 테스트 스레드에서 수행하는 메카니즘과 메인 스레드에서 수행하는 메카니즘이 다르거나 여러 내부적인 연결고리가 있을 수 있습니다.
당장 메인 스레드에서 테스트 했을 때 그런 현상이 발생하지 않는다면 말이죠..
사실 JVM 이 테스트 스레드가 수행중인 메서드가 종료되었을 때 다른 유저 스레드를 강제로 종료시키지는 않습니다.

이 부분은 저도 정확한 원인을 좀 더 찾아 봐야 겠지만 테스트 스레드가 일반적으로 우리가 알고 있는 유저 스레드의 흐름에 좀 더 특수성을 가지도록 설계되어 있을 수도 있습니다.

좀 더 서치가 필요할 것 같습니다.

AAPPII님의 프로필 이미지

작성한 질문수

질문하기