채널톡 아이콘

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

김세희님의 프로필 이미지

작성한 질문수 19

Practical Testing: 실용적인 테스트 가이드

테스트를 작성하는 마음가짐

동시성 문제 테스트 관련해서 질문드립니다.

작성

·

105

·

수정됨

0

  • 학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!

  • 먼저 유사한 질문이 있었는지 검색해 보세요.

  • 서로 예의를 지키며 존중하는 문화를 만들어가요.

     

안녕하세요. 개인 프로젝트를 진행하다 궁금한 점이 있어 질문드립니다.

현재, 서로 다른 두 트랜잭션이 동시에 실행될 때 발생할 수 있는 동시성 문제를 해결하기 위해 락을 적용해두었습니다. 테스트 코드에서는 락이 없는 경우에는 문제 상황이 발생하고, 락 적용 시에는 정상 작동함을 보여주고자 합니다.

인터넷에서 관련 자료를 찾아본 결과, ExecutorCountDownLatch를 활용하여 동시성 문제를 테스트하는 방식을 많이 사용하길래, 저도 이를 적용해 테스트를 구성하려 하고 있습니다. 멀티스레딩 환경에서는 실행 순서가 보장되지 않으므로, 운이 나쁘면 두 트랜잭션이 순차적으로 실행될 수도 있다고 생각했고 실행 순서를 제어하여 문제가 발생할 수 있는 상황을 코드로 만들어야 한다고 생각했습니다.

그러나 ExecutorCountDownLatch만으로는 트랜잭션 단위로 묶인 작업들의 실행 순서를 제어하기 어려워, 원하는 동시성 문제 시나리오를 재현하는 데 한계가 있었습니다. wait, notify 등의 스레드 제어 메서드를 활용하면 원하는 실행 순서를 만들 수 있을 것 같지만, 이것이 최선의 방법인지 고민이 되어 질문드립니다.

 

선생님께서는 동시성 문제 테스트를 진행할 때, 실행 순서를 제어하여 문제가 발생하는 시나리오를 인위적으로 만들고 이런 상황에서도 정상 작동함을 확인하시나요? 아니라면 동시성 문제를 테스트할 때 어떤 방법을 사용하시는지 궁금합니다

답변 2

2

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 김세희 님!

말씀 주신 내용으로는 정확히 어떤 상황인지 다 알기가 어렵지만, 동시성 테스트에 대해서 제가 주로 접근하는 방법을 말씀드릴게요.

보통은 ExecutorCountDownLatch 를 사용하여 많은 요청(100회 정도, 혹은 그 이상)을 만들어내고, 동시적인 요청이 발생할 때 문제가 생기는 상황을 연출합니다. (실행 순서를 제어하여 일부러 만드는 상황과는 다릅니다.)
하지만 매번 이런 테스트를 자동화하여 수행하기에는 시간도 오래 걸릴 수 있고, 여러모로 부담이 되기도 해서, 이런 상황이면 현재 코드에서는 문제가 발생하는구나, 정도를 확인하는 용도로 사용합니다. 그리고 해당 테스트 코드는 비활성화 해 둡니다. (코드를 지우지 않고 비활성화 하는 이유는, 다음에도 저나 다른 누군가가 참고하고 활용할 수 있게 하기 위함입니다.)

실행 순서를 제어하는 방법을 사용할 수 있는 상황이라면 자동화할 수도 있고 가장 좋은 접근이겠지만, 보통은 동시성 문제가 생기는 상황을 의도적으로 구성하기 어려운 경우가 많은데요.
그렇기에 위와 같이 다건의 요청을 발생시키는 임시 테스트로 확인하시는 것이 그나마 접근하기 용이한 방법일 것 같습니다.

도움이 되셨기를 바랍니다.
감사합니다. 🙂

김세희님의 프로필 이미지
김세희
질문자

고민이 해결되었습니다 감사합니다

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 김세희님께서 멀티 스레드 환경에서 동시성 문제를 테스트하고자 하시는 데 있어 고민을 하고 계시네요.

동시성 문제는 테스트하기 까다로운 주제입니다. ExecutorCountDownLatch를 사용하여 멀티스레딩 환경을 설정하는 것은 올바른 접근입니다. 그러나 스레드의 실행 순서를 완벽히 통제하는 것은 쉽지 않으며, 특히 동일한 방식으로 반복적으로 문제 상황을 재현할 수 없다는 점에서 테스트 자동화에 어려움이 있습니다.

기존의 질문과 답변을 살펴보니, 실행 순서를 제어하기 위한 다양한 방법과 그 한계에 대해 논의된 사례가 있습니다. 먼저 다음의 답변들을 참고하시기 바랍니다:

  1. 테스트 동시성 관련 질문드립니다: ExecutorServiceCountDownLatch를 활용한 동시성 테스트 예제에 대한 설명과 해결 과정을 포함하고 있습니다. 이는 여러분이 고민하고 계신 부분과 직접적으로 연관된 내용을 담고 있습니다.

  2. 인자값을 LocalDateTime을 전달받는 경우 통합테스트에서는 어떻게 처리 되나요?: 시간과 같은 테스트하기 어려운 요소를 다루는 방법에 대해 논의되고 있으며, 이는 동시성 문제의 예측 불가능성과 공통점이 있을 수 있습니다.

선생님의 피드백에 따르면, 테스트에서 예측 불가능성을 컨트롤하려는 방법보다 코드의 설계를 통해 동시성 문제를 최소화하는 것이 더 효율적인 접근일 수도 있습니다. 또한, 비즈니스 로직의 테스트를 우선시하고, 동시성 문제에 대해서는 단위 테스트보다 환경 테스트 또는 스트레스 테스트에서 검토하는 방법도 고려할 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.