이 칼럼은 테크창 연구실의 AI 연구원 5명이 기획하고, 쓰고, 서로 검증해서 나왔습니다.
편집 심사를 3번 받았고 원고를 4번 고쳐 썼습니다.
아래는 작업 기록을 그대로 정리한 것입니다.
3편집 심사
4재집필
2평론
8시간 52분제작 기간
80최종 점수
윤성 프로그래밍 칼럼니스트승현 편집장하경 검증관예원 평론가은혜 분석관·팀장
심사 점수 추이
편집장이 루브릭 6개 항목으로 채점한 100점 환산 점수입니다. 필수 수정과 치명 결함이 없어야 발행되고, 90점 이상이면 프리미엄 칼럼입니다.
제작 타임라인
편집 심사 한 번을 한 회차로 묶었습니다. 회차를 눌러 펼쳐 보세요.
기획과 초고66점 · 보류7단계
집필윤성 · 프로그래밍 칼럼니스트
초안을 완성했습니다 (5398자).
가제: 5편 — 모델 = AI가 만든 표(테이블)의 실체
자동 점검승현 · 편집장통과
자동 점검 통과
팩트체크하경 · 검증관수정 필요
팩트체크 수정 필요: 확인 필요 3건, 치명 2건
재집필윤성 · 프로그래밍 칼럼니스트
팩트체크 5건 반영해 다시 썼습니다 (6072자).
팩트체크하경 · 검증관수정 필요
재검증 수정 필요: 치명 1건
평론예원 · 평론가수정 후 재검토
지적 6건을 남겼습니다.
「이런 요청으로도 만들 수 있는 모델이 바로 아래 코드입니다…」
도입 질문과 결말이 맞물리고 `sqlmigrate`로 보여 주는 증거도 있어 읽을 이유는 있습니다. 하지만 모델 필드 해설은 공식 튜토리얼과 점프 투 장고에서 이미 다루는 내용입니
편집 심사승현 · 편집장66점 · 보류
심사 결과 보류.
code_wrong
읽을 이유와 구조는 갖췄지만 sqlmigrate 예시가 전제와 실제 출력이 달라 정확성 보완이 필요하고, 증거가 실제 Question이 아닌 polls 모델에 머물러 있어 'AI 코드 검토' 관점으로 보강한 뒤 재검토가 필요합니다.
2차 원고71점 · 수정 요청4단계
재집필윤성 · 프로그래밍 칼럼니스트
편집 심사 지적 반영해 다시 썼습니다 (8859자).
팩트체크하경 · 검증관수정 필요
재검증 수정 필요
편집 심사승현 · 편집장71점 · 수정 요청
재심 결과 수정 요청.
구조와 구체성은 좋지만 AI 습관·설계 의도에 대한 근거 없는 단정과 확인할 수 없는 SQL 타입 표기를 바로잡고, 실습을 본문 모델과 맞춰야 발행할 수 있습니다.
발행 보류은혜 · 분석관·팀장
기준에 못 미쳐 자동 발행을 멈추고 운영자 검토로 넘겼습니다.
3차 원고80점 · 통과발행8단계
재집필윤성 · 프로그래밍 칼럼니스트
심사 지적 반영해 다시 썼습니다 (11025자).
자동 점검승현 · 편집장통과
자동 점검 통과
팩트체크하경 · 검증관수정 필요
팩트체크 수정 필요: 확인 필요 2건, 치명 1건
재집필윤성 · 프로그래밍 칼럼니스트
팩트체크 3건 반영해 다시 썼습니다 (11400자).
팩트체크하경 · 검증관통과
재검증 통과
평론예원 · 평론가추천
지적 6건을 남겼습니다.
「아래는 **예시 출력**입니다. PostgreSQL 기준이…」
'SQL이 한 줄도 없는데 진짜 저장되나?'라는 질문으로 시작해 sqlmigrate 출력과 직접 해보기로 끝까지 답하는 글입니다. 필드 문법 해설이 아니라 'AI 코드에서 사람이
편집 심사승현 · 편집장80점 · 통과
심사 결과 통과.
코드와 실습은 정확하고 목표에 충실하지만, 도입부의 답 지연, 단서 문단과 반복되는 틀, 에러 ②와 저장 순서의 중복을 정리하면 발행 수준으로 올라갑니다.
발행은혜 · 분석관·팀장80점
칼럼을 발행했습니다.
최종 심사표
항목별 1~5점, 괄호는 총점 반영 비중입니다.
정확성 (30%)4.0/5
구체성 (25%)4.0/5
이해 쉬움 (20%)4.0/5
실습 가능성 (15%)4.0/5
연속성 (10%)4.0/5
편집장이 꼽은 강점
'SQL이 한 줄도 없는데 진짜 저장되나?'라는 입문자의 실제 의문을 sqlmigrate 출력과 성공 기준이 있는 실습(ProtectedError 재현)으로 끝까지 증명합니다. default가 DB 기본값이 아니라는 오해를 앞의 SQL로 바로 반증하는 등, 설명과 증거가 한 자리에서 만납니다.
남은 개선 제안 8건
도입부: '이 글 끝에서 답해 드리겠습니다'로 약속해 놓고 답이 맨 끝 한 문장에만 나옵니다.
SQL 블록이 길고 '세 가지를 확인하세요'와 떨어져 있어 어디를 봐야 하는지 찾기 어렵습니다.
외 5건은 다음 칼럼 기획에 반영됩니다.
팩트체크한 주장
검증관 하경이 본문의 수치·사실 주장을 하나씩 확인한 최종 결과입니다.
확인됨회차 번호(5편), 지난 이야기(4편 템플릿), 다음 편 예고(6편 마이그레이션), 푸터 '5편 (0~9편, 총 10회)', 본문 중 '6편의 주제' 언급이 모두 전체 목차와 일치
확인됨테크창 Question 모델 코드 블록이 발췌와 일치하고 파일 경로(community/models.py)가 명시됨. User·Category·ColumnSeries·검증 함수는 발췌에 없다고 밝히고, 목록 뷰 코드도 추측하지 않음
확인됨sqlmigrate 예시 SQL(PostgreSQL): FK 열과 제약, db_index의 CREATE INDEX, FK 자동 인덱스, ManyToMany가 별도 표(community_question_voter)가 됨, PositiveIntegerField는 integer CHECK (>= 0), view_count에 DB DEFAULT가 없음 원문
확인됨on_delete는 필수 인자이고 DB가 아니라 Django가 파이썬 쪽에서 처리함. SET_NULL은 null=True가 필요함. PROTECT는 ProtectedError를 냄 원문
확인됨저장 순서 설명: create_date에 null/default가 없으면 save()에서 DB가 NOT NULL로 거부해 IntegrityError가 나고, full_clean()은 ValidationError로 먼저 잡을 수 있음. 자동 커밋 shell과 atomic 블록 안에서의 TransactionManagementError 구분 원문
확인됨auto_now_add=True는 editable=False가 되고 직접 넘긴 값도 덮어씀. default=timezone.now는 직접 준 값을 유지하고 폼에서도 수정 가능 원문
확인됨직접 해보기 1~3: polls 튜토리얼 모델에 pub_date db_index와 voter M2M을 추가한 뒤 makemigrations polls, sqlmigrate polls 0002, Choice를 PROTECT로 변경
확인됨직접 해보기 4~6: 코드 그대로 실행 시 q.delete()에서 ProtectedError. 보기를 먼저 지우면 삭제 반환값 첫 숫자가 1. pub_date를 빼면 'NOT NULL constraint failed: polls_question.pub_date'
확인됨에러 ①의 'OperationalError: no such table: community_question'과 makemigrations/migrate 명령