🛠 육하원칙 기반 오류 보고 (Troubleshooting Guide)
1. 누가 (Who / Environment)
2. 언제 (When / Timeline)
- 발생 시점
- 댓글 등록(
create) 및 삭제(delete) API 비즈니스 로직 구현 및 정합성 테스트 과정 중
3. 어디서 (Where / Location)
- 비즈니스 로직, 데이터 접근 계층
CommentServiceImpl 내의 부모 엔티티(Review) 카운트 갱신 로직 부분
4. 무엇을 (What / Symptom)
- 동기화 로직 개편
- 리뷰의 댓글 개수(
commentCount)를 증가/감소시키는 방식을 기존의 '엔티티 객체 필드 수정(review.increaseCommentCount())' 에서 'Repository 벌크 연산(reviewRepository.increaseCommentCount())'으로 교체
5. 왜 (Why / Cause)
- 동시성 이슈
- 기존의 엔티티 수정 방식은 자바 메모리로 값을 읽어와 연산한 뒤 트랜잭션 종료 시점에
UPDATE를 수행. 이로 인해 다수의 사용자가 동시에 댓글을 달 경우, 서로 같은 과거의 카운트 값을 읽고 덮어쓰게 되어 조회수가 유실되는 Lost Update 현상이 발생할 위험이 있음
6. 어떻게 (How / Action)
- DB 원자적 연산 도입
- 메모리 연산을 제거, DB 레벨에서 즉각적으로 연산이 수행되는
@Modifying 벌크 쿼리를 ReviewRepository에 정의하여 호출
- JPA 동기화 제어
- 카운트 쿼리가 실행되기 전, 새 댓글이 DB에 확실히 반영되도록
commentRepository.saveAndFlush(comment)를 사용하여 1차 캐시와 DB 간의 실행 순서를 강제 동기화
- 방어 로직 설계
- 삭제 API(
delete)에서는 단순히 카운트를 내리지 않고, if (comment.getDeletedAt() == null) 조건문을 추가하여 '이미 논리 삭제된 댓글'로 인해 카운트가 중복 감소하여 음수(-1)가 되는 2차 오류를 원천 차단
- 결과 및 느낀점
- 동시 다발적인 댓글 작성/삭제 요청 시 발생할 수 있는 카운트 누락 및 데이터 오염을 원천 차단하여 부모-자식 도메인 간의 데이터 정합성을 확보