You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
문제 설명 :
게시글의 상태를 바꾸는 모든 경로가 기존 레코드를 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)
질문 게시판 글 목록 조회 → totalCount = 18 (예: post 25 "가나다라")
POST /api/comments/92/accept → 200 성공
목록 재조회 → totalCount = 19, 새 postId 36 "가나다라"(=25의 복제) 등장 / 원본 25는 isAccepted=false 유지
게시글 수정: 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)하도록 수정. 채택·수정·관리자삭제 세 경로가 모두 이 메서드를 공유하므로 한 곳 수정으로 전부 해결.
게시글 상태 변경(채택·수정·관리자삭제) 시 원본 대신 새 글이 복제 생성됨
📊 버그 심각도 및 우선순위
P0: 커뮤니티 핵심 동작(채택/수정) 장애 + 데이터 오염(중복 레코드 누적)P1P2🐛 문제 상황 (현상)
연관 이슈 번호: #연관 도메인: community문제 설명:게시글의 상태를 바꾸는 모든 경로가 기존 레코드를 UPDATE하지 않고 새 레코드를 INSERT해서, 원본은 그대로 남고 복제글이 생성된다.
POST /api/comments/{commentId}/accept) : 부모 질문글과 동일한 글이 하나 더 생성됨. 정작 원본 글의isAccepted는 계속false라 상세·목록 모두 "답변 대기"로 유지됨.PATCH /api/posts/{postId}) : 수정 시 원본은 그대로 두고 새 글이 생성됨. FE는 원본 id로 이동하므로 사용자에겐 "수정 안 됨"처럼 보이고 실제 수정본은 새 글로 분리됨.DELETE /api/posts/{postId}, admin) : 동일 원인으로 복제 발생(잠재).🔄 재현 방법 (Steps to Reproduce)
totalCount = 18(예: post 25 "가나다라")POST /api/comments/92/accept→ 200 성공totalCount = 19, 새postId 36 "가나다라"(=25의 복제) 등장 / 원본 25는isAccepted=false유지PATCH /api/posts/38(data: title/content/subject) → 200{"postId":42}(원본 38 대신 새 글 42 생성)🕵️♂️ 원인 분석 및 수정 내역
Model/PolicyUseCase/CommandServicePort/Adapter:PostRepositoryAdapter.save()가 항상new PostJpaEntity(...)(id 없음)를 저장 → JPA가 신규로 판단해 INSERT.save()를 id 유무로 분기(id=null → INSERT / id≠null → findById 후 update)하도록 수정. 채택·수정·관리자삭제 세 경로가 모두 이 메서드를 공유하므로 한 곳 수정으로 전부 해결.RepositoryControllerResponse/Request수정 파일
community/infrastructure/persistence/PostRepositoryAdapter.java(save(Post)메서드)참고
Post.isAccepted불리언으로 관리됨. FE는 채택 여부를isAccepted로 판단해야 함. (PostStatus enum에는 ACTIVE / ADMIN_DELETED만 존재)🚨 검증 및 회귀 방지 (TestCode)
isAccepted=true확인 (복제 미생성)postId가 원본과 동일 + 내용 반영 확인📸 로그 및 참고 자료