Skip to content

[FIX] 커뮤니티 업데이트시 새로 생성되는 버그 수 #396

Description

@GANGHYEON02

게시글 상태 변경(채택·수정·관리자삭제) 시 원본 대신 새 글이 복제 생성됨

📊 버그 심각도 및 우선순위

  • P0 : 커뮤니티 핵심 동작(채택/수정) 장애 + 데이터 오염(중복 레코드 누적)
  • P1
  • P2

🐛 문제 상황 (현상)

  • 연관 이슈 번호 : #
  • 연관 도메인 : community
  • 문제 설명 :
    게시글의 상태를 바꾸는 모든 경로가 기존 레코드를 UPDATE하지 않고 새 레코드를 INSERT해서, 원본은 그대로 남고 복제글이 생성된다.
    • 답변 채택 (POST /api/comments/{commentId}/accept) : 부모 질문글과 동일한 글이 하나 더 생성됨. 정작 원본 글의 isAccepted는 계속 false라 상세·목록 모두 "답변 대기"로 유지됨.
    • 게시글 수정 (PATCH /api/posts/{postId}) : 수정 시 원본은 그대로 두고 새 글이 생성됨. FE는 원본 id로 이동하므로 사용자에겐 "수정 안 됨"처럼 보이고 실제 수정본은 새 글로 분리됨.
    • 관리자 삭제 (DELETE /api/posts/{postId}, admin) : 동일 원인으로 복제 발생(잠재).
    • FE는 올바른 id·값으로 요청 중 → BE 부수효과. FE 단독 대응 불가.

🔄 재현 방법 (Steps to Reproduce)

  1. 질문 게시판 글 목록 조회 → totalCount = 18 (예: post 25 "가나다라")
  2. POST /api/comments/92/accept → 200 성공
  3. 목록 재조회 → totalCount = 19, 새 postId 36 "가나다라"(=25의 복제) 등장 / 원본 25는 isAccepted=false 유지
  4. 게시글 수정: PATCH /api/posts/38 (data: title/content/subject) → 200 {"postId":42} (원본 38 대신 새 글 42 생성)

🕵️‍♂️ 원인 분석 및 수정 내역

  • Model / Policy
  • UseCase / Command
  • Service
  • Port / Adapter : PostRepositoryAdapter.save()가 항상 new PostJpaEntity(...)(id 없음)를 저장 → JPA가 신규로 판단해 INSERT. save()id 유무로 분기(id=null → INSERT / id≠null → findById 후 update)하도록 수정. 채택·수정·관리자삭제 세 경로가 모두 이 메서드를 공유하므로 한 곳 수정으로 전부 해결.
  • Repository
  • Controller
  • Response / Request

수정 파일

  • community/infrastructure/persistence/PostRepositoryAdapter.java (save(Post) 메서드)

참고

  • 채택 상태는 별도 status 값(ADOPTED 등)이 아니라 Post.isAccepted 불리언으로 관리됨. FE는 채택 여부를 isAccepted로 판단해야 함. (PostStatus enum에는 ACTIVE / ADMIN_DELETED만 존재)
  • accept 응답 data가 null인 점은 별도 개선사항(갱신 상태 반환)으로 분리 가능.

🚨 검증 및 회귀 방지 (TestCode)

  • 채택 후 posts 총개수 불변 + 원본 글 isAccepted=true 확인 (복제 미생성)
  • 게시글 수정 후 응답 postId가 원본과 동일 + 내용 반영 확인
  • 관리자 삭제 후 원본 status=ADMIN_DELETED, 신규 레코드 미생성 확인
  • 게시글 최초 생성(save with id=null)은 정상 INSERT 되는지 회귀 확인

📸 로그 및 참고 자료

  • 채택 복제: post 25 → 복제 36, post 28 → 복제 35
  • 게시글 수정 복제: post 38 수정 → 새 글 42 생성
  • FE는 accept/patch 엔드포인트만 호출, 글 생성 로직 없음 → BE 부수효과

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions