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

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

김상운님의 프로필 이미지
김상운

작성한 질문수

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

synchronized 키워드 후 테스트 실패나는 이유

작성

·

480

0

안녕하세요. 실패하는 이유를 간략하게 설명하셨는데 그 이유가 혹시 스프링의 aop 동작인 proxy 때문인가요?

저는 트랜잭션을 지우면 값이 decrease 되지 않고 100이 됩니다.

트랜잭션이 없기 때문에 100이 되어야 하는거 아닌가요?

답변 4

1

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

김상운님 안녕하세요.

saveAndFlush method 에는 사진에서 보시는것과 같이 기본적으로 @Transactional 이 선언되어있습니다 :)

image

0

김상운님의 프로필 이미지
김상운
질문자

data jpa 에서 제공하고 있다는걸 인지하지 못하고 있었넹..ㅠ 감사합니다!

0

김상운님의 프로필 이미지
김상운
질문자

강의 3분 0초에 트랜잭션 어노테이션을 지우신 부분이요!ㅎㅎ
트랜잭션을 어노테이션을 지우게 되면 테스트 케이스가 실패해야 하는게 아닌가 해서요..

지우게되면 어느곳에서도 트랜잭션 전파가 일어나지 않아서 저는 실패하게되는데 선생님께서는 성공하셔서요,, 제가 미흡한 부분이 많아 강의에 놓친 부분이 있나해서 질문을 남겼습니다!

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

@Transactional 을 주석처리하게 된다면 다른 스레드가 decrease 메소드에 접근하기 이전에 Database 에 commit 을 하기때문에 성공하는것이 맞습니다.

혹시 오류가 나시는 소스를 github 에 올리신 후 공유해주실 수 있으실까요 ?

김상운님의 프로필 이미지
김상운
질문자

친절한 답변 감사합니다!ㅎㅎ 제가 강의 내용중 saveAndFlush() 를 빼먹었었네요..!

해당 메서드 추가후 테스트 코드가 성공 되었습니다! 감사합니다!

제가 햇갈린 부분은 트랜잭션 어노테이션이 없으면 읽기는 가능한데 변경은 되지 않아 변경감지가 동작하지 않는데 어떻게 성공할까가 의문이었습니다. 하지만 saveAndFlush() 를 통해 다시 저장 후 flush 를 진행하여 성공하는 구나! 라고 이해했습니다.

하지만 결국엔 saveAndFlush() 가 일어나기 위해서는 @Transactional 어노테이션이 없어도 트랜잭션이 생기게 되고 이 동작 방식은 @Transactional 이 있을때와는 다르게 돌아간다고 생각해도 될까요!?

즉 쓰레드 접근 하나당 @Transactional 어노테이션이 없어도 @Transactional 어노테이션이 있을때와는 범위가 다른 트랜잭션 하나가 생긴다고 봐도 될까요?

0

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

김상운님 안녕하세요.

영상에서 간략하게 설명을 드렸던것처럼 Spring 의 @Transactional 어노테이션의 동작방식때문에 그렇습니다.

proxy 때문이라고 이해를 하셔도 될듯합니다.

이 부분은 어떤말씀인지 이해를 하지 못했습니다.

추가적인 설명을 부탁드려도 될까요 ?

저는 트랜잭션을 지우면 값이 decrease 되지 않고 100이 됩니다.

트랜잭션이 없기 때문에 100이 되어야 하는거 아닌가요?
김상운님의 프로필 이미지
김상운

작성한 질문수

질문하기