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

김앙두님의 프로필 이미지
김앙두

작성한 질문수

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

다양한 방법 알아보기

@Transactional과 synchronized를 같이 써도 동시성 테스트가 통과 돼요

작성

·

452

0

강의 보면 통과가 안되는데 저는 테스트 코드를 돌려보면 통과하게 됩니다. 왜그런건가요??

답변 2

0

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

김앙두님 안녕하세요.
현재 김앙두님의 코드가 어떻게 구성되어 있는지 모르기때문에 자세한 답변을 드리기는 힘들 것 같습니다.
깃헙에 예제 소스가 올라가있는데 어떤부분이 다른지 체크해보신다면 원인을 찾으실 수 있으실거라고 생각됩니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.
@Transactional 어노테이션과 synchronized 키워드를 같이 사용하면 트랜잭션과 자바의 동기화 매커니즘이 결합되어 동시성 문제를 방지할 수 있습니다. 하지만 이 두 가지를 사용한다고 해서 모든 동시성 문제가 해결되는 것은 아닙니다.

@Transactional은 주로 데이터베이스의 트랜잭션과 관련된 동시성을 제어하기 위해 사용되며, 데이터베이스 레벨에서 일관성을 유지하는 데 도움이 됩니다. 반면, synchronized는 자바의 내부 동기화 메커니즘으로, 메소드나 코드 블록을 한 시점에 하나의 스레드만 접근할 수 있도록 제한하여 동시성 문제를 해결하고자 할 때 사용됩니다.

강의에서 테스트가 통과하지 않는 것은 여러 스레드가 동시에 같은 메소드에 접근했을 때 발생하는 동시성 문제를 보여주기 위함일 가능성이 높습니다. 반면 김앙두님의 테스트 코드가 통과하는 경우에는 테스트 환경의 차이, 스레드를 처리하는 방식, 데이터베이스의 트랜잭션 격리 수준, JPA 구현체, 혹은 테스트를 실행하는 방법(스레드 개수, 부하 등) 등 여러 요소가 영향을 미쳤을 수도 있습니다.

만약 테스트 코드가 동시성 문제를 정확히 발견하도록 작성되었는지, 테스트 환경이 실제 운영 환경과 유사한지, 그리고 테스트를 실행하는 동안 발생하는 모든 상황을 올바르게 고려했는지 확인해 보셔야 합니다. 또한, 동시성 테스트는 일정한 결과를 항상 보장하기 어려워 복수의 반복 실행을 통해 충분히 검증하는 것이 보통입니다.

다음 자료를 참고하여 Spring Boot의 트랜잭션 관리와 JPA의 트랜잭션에 대해 더 살펴보시면 도움이 될 것입니다:

추가적인 질문이 있거나, 강의의 특정 부분에 대한 궁금증이 있다면 인프런의 질문하기 기능을 통해 강사님이나 다른 학습자들과 직접 소통해보시는 것도 좋은 방법입니다.

김앙두님의 프로필 이미지
김앙두

작성한 질문수

질문하기