프로젝트의 요구사항은 사용자가 이메일을 통해 리뷰 삭제 요청을 받으면, 해당 이메일의 답신을 기반으로 리뷰를 삭제하거나 상태를 업데이트하는 기능을 구현하는 것이었습니다. 이를 위해 IMAP 프로토콜을 사용하여 이메일 서버와 상호작용하며, 이메일 답신을 분석하여 적절한 데이터베이스 조작을 수행해야 했습니다.
문제: 리뷰 삭제 시, review_visibility_requests
테이블의 외래 키 제약 조건이 위반되는 오류가 발생했습니다.
Cannot delete or update a parent row: a foreign key constraint fails
분석 및 해결:
reviews
테이블의 리뷰가 삭제될 때, 해당 리뷰를 참조하는 review_visibility_requests
테이블의 데이터가 남아 있어 외래 키 제약 조건이 위반되었습니다.DELETED
로 업데이트하여 논리적으로 삭제 처리하는 방법을 선택했습니다. 이를 통해 외래 키 제약 조건을 유지하면서 데이터의 무결성을 보장했습니다.문제: 이메일 답신을 제대로 분석하지 못해, 올바른 리뷰 ID를 추출하거나 답신에 따라 적절한 작업을 수행하지 못하는 문제 발생.
분석 및 해결:
문제: 다중 스레드 환경에서 동시에 여러 리뷰 삭제 요청을 처리할 때, 데이터 무결성 문제 발생.
분석 및 해결:
DELETED
로 변경하여 논리적으로 삭제하는 방법을 채택했습니다.리뷰 삭제 시, 리뷰의 상태를 DELETED
로 변경하는 로직을 추가하고, 이메일 답신을 처리하여 적절한 리뷰를 삭제 또는 상태 업데이트하는 기능을 구현했습니다.
@Transactional
public void deleteReview(Long reviewId) {
Review review = reviewRepository.findByIdAndStatus(reviewId, ReviewStatus.ACTIVE)
.orElseThrow(() -> new ApiException(ErrorCode.REVIEW_NOT_FOUND));
reviewVisibilityRequestRepository.updateVisibilityRequestStatusByReviewId(reviewId, ReviewerResponse.AGREED);
review.setStatus(ReviewStatus.DELETED);
reviewRepository.save(review);
}