인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

최광섭님의 프로필 이미지

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

Pessimistic Lock 활용해보기

테스트에서 트랜잭션 어노테이션 질문 있습니다.

작성

·

83

0

먼저 좋은 자료 감사합니다.
해당 예제대로 진행하면 전부 동작 잘하는데 비관적 락 테스트 할때 테스트에 @Transactional을 붙이면 동작이 지연되다 실패하는데 그러한 이유로 테스트 전후 처리를 해주시는 걸까요?

테스트에서 @Transactional(롤백)을 사용안하시는 이유가 있을까요?

답변 2

0

최상용님의 프로필 이미지
최상용
지식공유자

최광섭님 안녕하세요.
테스트케이스에서 롤백을 활용하지 않는 이유는 롤백하지 않아도 되기때문입니다.

실무에서 데이터베이스까지 같이 테스트를 해보고자 할때는 테스트컨테이너 같은것을 활용하여 진행합니다.
이는 실행시마다 데이터가 없는 상태로 생성이 되기때문에 별도로 사용하지 않아도 되기때문입니다.

혹시 롤백을 사용해야 하는 이유가 있다면 어떤 이유때문인지 알 수 있을까요?

최광섭님의 프로필 이미지
최광섭
질문자

네 안녕하세요. 개인 프로젝트 진행시에 테스트 케이스를 작성하는데 있어 CRUD와 같은 단순 기능들은 데이터베이스까지 통합하여 테스트하고 있었습니다. 따라서 트랜잭션 어노테이션을 일괄적으로 붙여 사용하여 해당 동시성 테스트도 어노테이션이 적용되어 문제가 되었었네요. 아래 답변에서 확인하여 동시성 테스트는 별도 케이스로 처리하고 전후 데이터 삭제처리해서 전체 테스트 케이스 성공하도록 처리했는데 아직 좋은 방법인지는 모르겠네요.

0

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

안녕하세요, 인프런 AI 인턴입니다. 최광섭님.

@Transactional 애노테이션을 테스트에서 사용하게 되면, 트랜잭션이 메소드 실행 전후로 시작되고 종료됩니다. Pessimistic Lock을 사용할 경우, 트랜잭션이 락을 점유하고 있는 동안 다른 트랜잭션이 동일한 자원을 접근하려고 할 때 기다리게 되는데, 테스트 코드 내에서 모든 트랜잭션이 동일한 스레드 내에서 시작되어 종료되면 이 락은 해제되지 않아서 결국 대기가 길어지게 됩니다.

비관적 락 테스트 시 @Transactional을 테스트 메소드에 사용하면, 테스트 메소드 차원의 큰 트랜잭션이 형성되고, 다중 스레드 환경에서 정상적인 락 해제가 이루어지지 않아 전체 테스트가 지연되고 실패할 수 있습니다. 즉, 트랜잭션이 시작되어 해제되지 않는 상태로 다른 스레드에서의 접근이 대기 상태가 되기 때문입니다.

이러한 이유로 트랜잭션을 개별적으로 처리하고, 테스트 스레드 내 트랜잭션을 사용하여 DB 상태를 롤백하는 형태로 진행하지 않는 것이 일반적입니다.

관련하여 참고하실 수 있는 유사한 질문과 답변은 아래 URL에서 확인하실 수 있습니다:

  1. PESSIMISTIC_WRITE 테스트 시 테스트 클래스 위 @Transactional

해당 답변에서 @Transactional를 테스트 메소드에 사용할 경우 발생할 수 있는 문제에 대해 보다 자세히 설명해 드리고 있습니다.

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