작성
·
90
0
학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!
먼저 유사한 질문이 있었는지 검색해 보세요.
서로 예의를 지키며 존중하는 문화를 만들어가요.
안녕하세요 강사님.
테스트코드의 @Transactional은 마지막에 rollback을 하기 때문에 dirty checking을 하지 않고, 이로 인하여 update쿼리가 전송되지 않을것이라 생각했습니다.
하지만 로그에는
update
stock
set
created_date_time=?,
modified_date_time=?,
product_number=?,
quantity=?
where
id=?
Hibernate:
update
stock
set
created_date_time=?,
modified_date_time=?,
product_number=?,
quantity=?
where
id=?
이처럼 quantity를 변경한것에 대한 update쿼리가 전송되었습니다.
이 부분에 대해서 찾아본 결과
"테스트 코드 마지막에서 stockRepository.findAll()
을 통해 stock을 전체 조회할때, select쿼리가 db에 직접 날라가기 때문에 select쿼리가 수행되기전 flush()로 인하여 update쿼리가 날아갔다." 라고 이해했습니다. 제가 이해한 내용이 맞을까요?
답변 2
0
안녕하세요, 부자가될거야 님!
네 맞습니다! 테스트에는 @Transactional이 있고, OrderService에는 @Transactional이 없을 때, findAll() 시점에 flush()가 수행되어서 update 쿼리가 날아간 상황이 맞습니다.
감사합니다. 🙂
0
안녕하세요, 인프런 AI 인턴입니다. 부자가될거야님.
질문해주신 @Transactional
어노테이션의 동작 원리와 관련된 내용은 여러 수강생들 사이에서도 공통된 궁금증 중 하나입니다. 관련하여 유사한 질문과 답변들은 아래 링크를 통해 확인하실 수 있습니다.
@Transactional을 붙였을 때 “만” Stock 감소 검증에 성공합니다
@Transactional
을 사용했을 때와 사용하지 않았을 때의 차이로 인해 Stock 감소 검증에 성공하거나 실패하는 이유를 다루고 있습니다. 귀하의 질문과 유사하게 update 쿼리가 왜 발생하는지에 대해 논의되는 부분이 있습니다.@Transactional
동작과 쿼리 발생 시점을 논의하는 좋은 예입니다. 동시성 문제 해결을 위해 각 테스트의 쿼리가 어떻게 처리되는지에 대한 설명이 포함되어 있습니다.@Transactional
과 관련된 테스트 환경 설정에 도움이 될 것입니다.@Transactional
로 인해 롤백이 발생하더라도, 테스트 코드 내에서 stockRepository.findAll()
과 같은 쿼리 실행 시 데이터베이스와의 싱크를 맞추기 위해 flush()가 호출됩니다. 이는 Hibernate가 변경된 엔티티를 DB에 동기화하기 위해 update 쿼리를 발생시키는 원인입니다.@Transactional
은 트랜잭션 범위 내에서 엔티티의 변경 사항을 감지하지만, 트랜잭션이 끝나기 전에 데이터베이스와 동기화 해야하는 작업(flush)이 필요할 시에는 update 쿼리를 전송하게 됩니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.