@Transactional
public Long delete(Long storeId, Long reviewId) {
Review review = findOne(reviewId);
Store store = storeService.findById(storeId);
store.reviewDelete(review.getRating());
review.getFileList().stream()
.map(UploadFile::getStoredFileName).forEach(awsS3FileStore::deleteFile);
reviewRepository.delete(review);
store.updateRatingAverage(ratingAverage(store));
return reviewId;
}
기존 코드에서는 아직 영속성 컨테스트에서 flush가 되지 않아서 DB에 적용이 되어있지 않고 영속성 컨테스트에 캐시와 쿼리문이 그대로 남아있었다.
그 상태에서 값을 변경해서 삭제되었던 review가 다시 돌아오는 상황이 발생했다.
@Transactional
public Long delete(Long storeId, Long reviewId) {
Review review = findOne(reviewId);
Store store = storeService.findById(storeId);
store.reviewDelete(review.getRating());
review.getFileList().stream()
.map(UploadFile::getStoredFileName).forEach(awsS3FileStore::deleteFile);
reviewRepository.delete(review);
entityManager.flush();
store = storeService.findById(storeId);
store.updateRatingAverage(ratingAverage(store));
return reviewId;
}
flush를 해줘서 영속성 컨테스트를 DB에 적용한후 다시 store를 db에서 불러온후에 변경사항을 수정하면 해결이 가능했다. Transactional이 끝난후에야 영속성 컨테스트가 닫히기 때문에 같은 Transacrional에서 사용하기 위한 방법이다.