영속성 컨테스트로 인한 꼬임 해결

문한성·2023년 3월 24일
0
post-thumbnail

기존코드

 @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에서 사용하기 위한 방법이다.

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글