이 블로그는 방문자가 계정을 만들지 않고도 이름과 비밀번호를 입력해 댓글을 남기는 구조로 시작했습니다. 원래 글에는 댓글과 답글을 추가했다는 화면만 있었지만, 실제 운영에서는 작성보다 삭제·숨김·답글 관계를 정확히 처리하는 일이 중요합니다. 2026년 9월 20일 코드 점검에서 확인한 구조와 수정 내용을 정리합니다.

댓글 하나에 필요한 상태

Comment는 대상 게시글 post, 부모 댓글 parent, 작성자 이름, 비밀번호 해시, 본문을 보관합니다. 일반 댓글은 parent가 비어 있고 답글은 부모 댓글을 참조합니다. is_deleted는 삭제 표시, is_hidden은 신고 또는 관리자 조치에 의한 숨김 상태입니다.

처음 댓글 기능을 추가했을 때의 게시글 하단 화면

위 화면은 최초 구현 당시의 기록입니다. 현재 동작 설명과 검증은 아래 기준을 따릅니다.

비밀번호를 다시 입력받아 삭제하기

댓글을 저장할 때 비밀번호는 Django의 make_password()로 해시하고, 삭제 요청에서는 check_password()로 입력값을 비교합니다. 해시는 복호화해서 원문을 찾는 값이 아니며, 올바른 입력인지 확인하는 데 사용합니다. Django 비밀번호 관리 문서

비밀번호가 맞으면 댓글 행 자체를 삭제하는 대신 is_deleted=True로 바꾸고 본문을 삭제 안내문으로 교체합니다. 부모 댓글 행을 남겨야 그 아래 답글의 연결을 유지할 수 있기 때문입니다. 잘못된 비밀번호로 요청했을 때는 내용과 상태가 그대로 남아야 합니다.

이번 점검에서는 삭제 저장 시 updated_at도 갱신하도록 지정되어 있었지만, Comment 모델에는 해당 필드가 없었습니다. 따라서 비밀번호가 맞아도 저장 단계에서 예외가 날 수 있었습니다. 실제 모델에 있는 is_deleted, content만 저장하도록 수정했습니다. 신고 누적으로 숨기는 경로에도 같은 문제를 고쳤습니다. Django update_fields 설명

답글은 한 단계만 허용하고 한 번만 표시하기

폼 검증은 부모 댓글이 같은 게시글에 속하는지 확인하고, 그 부모가 이미 답글이면 추가 답글을 거절합니다. 화면에서 답글 버튼을 감추는 것에 더해 서버에서도 확인해야 다른 요청 경로로 깊이가 늘어나는 것을 막을 수 있습니다.

목록 조회도 이 구조와 맞아야 합니다. 모든 댓글을 바깥 목록에 넣고 각 댓글의 replies를 안쪽에서 다시 출력하면 답글이 두 번 나타납니다. 현재 상세 화면은 parent__isnull=True인 부모 댓글만 조회하고 답글을 미리 불러옵니다.

comments = post.comments.filter(
    parent__isnull=True,
).prefetch_related("replies")

신고와 빠른 반복 작성을 어떻게 처리하나

현재 신고 기록에는 댓글과 신고 IP의 조합에 대한 중복 제약이 있습니다. 같은 IP의 반복 신고를 그대로 누적하지 않고, 서로 다른 IP의 신고가 3개 이상이면 댓글을 숨깁니다. 다만 IP는 사람을 증명하는 값이 아니므로, 이 규칙만으로 신고가 정당하다고 판단할 수는 없습니다. 관리자 확인이 필요한 완화 장치입니다.

작성 요청에는 IP별 짧은 시간의 횟수 제한, 비어 있어야 하는 숨겨진 입력값 검사, 링크·문구 검사도 있습니다. 상세 화면을 연 뒤 1초 안에 전송된 요청을 거절하는 시간 검사도 실제 상세 뷰에서 시작 시각을 기록하도록 연결했습니다. 이 기준은 자동 요청을 줄이는 보조 수단이며 스팸을 완전히 막는다고 보장하지 않습니다.

이번 수정에서 검증한 결과

아래는 운영 댓글에 시험 글을 남긴 결과가 아니라 별도 Django 테스트 DB에서 확인한 결과입니다.

검증 입력·행동 확인 결과
틀린 비밀번호로 삭제 요청 댓글 유지
올바른 비밀번호로 부모 댓글 삭제 삭제 표시, 비밀번호 해시 유지, 기존 답글 보존
같은 IP 반복 신고 뒤 서로 다른 IP로 총 3개 신고 중복 기록 제외, 숨김 상태 저장
부모 댓글 한 개와 답글 한 개 조회 답글 문장 한 번만 표시
페이지를 연 직후 제출 / 시간 조건을 충족한 뒤 제출 빠른 요청 거절 / 정상 댓글 저장
답글의 ID를 부모로 전달 두 번째 단계 답글 거절
비공개 글에 작성·삭제·신고 요청 공개 댓글 경로에서 접근 거절

남은 운영 점검도 있습니다. 같은 회사·가정에서 IP를 공유할 때의 오탐, 여러 서버 프로세스에서의 캐시 기반 횟수 제한, 신고 동시 요청은 이 테스트만으로 충분히 평가하지 못합니다. 비회원 비밀번호를 잃어버렸을 때의 삭제 요청 절차도 관리 정책과 연결해 정해야 합니다.

글 작성 단계의 이미지 선택 흐름은 썸네일 선택·저장 구현 기록에서 확인할 수 있습니다. 댓글 본문이나 개인정보와 관련한 요청은 문의하기를 이용해 주세요.