Devin.KR

SQL로 독서 현황 조회하고 공개 정보 분리하기

표·필터·집계를 익히고 공개 결과에서 개인정보를 제외합니다.

진도 0%

레슨

  1. 행·열과 필요한 열 조회

    기록 ID와 표의 한 행을 연결합니다.

  2. 완료 여부와 쪽수 필터

    논리 조건과 NULL을 구분합니다.

  3. 독서 통계 집계

    COUNT·SUM과 빈 결과의 의미를 설명합니다.

  4. 공개 보고서에 필요한 정보만

    개인정보의 목적·보관·공개 범위를 구분합니다.

독서 기록에서 공개용 SQL 보고서를 생성합니다.

m06 미션 solution 전체와 기존 49개 테스트를 유지하고 reporting.py·report.sql·개인정보 문서를 확장합니다.

요구사항

  • 표준 라이브러리 sqlite3로 기존 JSON을 읽어 실습 DB를 만들고 report.sql을 실행합니다.
  • 가상의 owner_name·owner_email은 실습 입력에만 두고 공개 결과·로그에서 제외합니다.
  • docs/privacy.md에 수집 목적·보관 범위·삭제 기준을 적습니다.
  • build_report(records, sql_path=None)는 rows·completed·total_pages를 반환합니다. rows는 id/title/pages/completed 네 열의 전체 행을 ID 순서로, completed는 완료 1인 공개 행을 ID 순서로, total_pages는 완료 행의 NULL이 아닌 쪽수 합(없으면 0)입니다.
  • report_from_json(path)는 기존 load_store를 사용합니다. 기존 JSON의 다섯 필드 검증은 유지하며 가상 owner와 NULL은 별도 조회 fixture에만 둡니다. report.sql은 신뢰하는 단일 SELECT이며 공개 열 계약이 다르면 빈 입력에서도 REPORT_COLUMNS 오류를 냅니다.
  • 입력 행은 고유 ID인 가상 fixture입니다. SQLite는 메모리에 생성하고 finally로 닫습니다. 값은 자리표시자로 삽입하며 원본·입력·로그를 변경하거나 개인정보를 출력하지 않습니다.

완료 기준

  • 공개 결과의 열은 id·title·pages·completed만이며 이름·이메일이 포함되지 않습니다.
  • 완료 필터·정렬·합계가 같은 JSON 입력의 Python 계산 결과와 일치합니다.
  • 빈 목록·NULL을 포함한 제공 fixture 검증이 통과합니다.
  • 기존 49개와 신규 12개 총 61개 unittest가 통과합니다. 원본 파일 바이트 보존·입력 보존·공개 열 검사·JSON 및 로그 누출 방지를 포함합니다.
python3 -m unittest discover -s tests -p "test_*.py"
미션 시작 코드
모범 답안모범 답안 내려받기

검토 기준

  • SELECT * 대신 공개 열 목록을 선택한 근거가 있습니다.
  • 실제 개인정보 없이 가상 자료로 검증합니다.