SQL로 독서 현황 조회하고 공개 정보 분리하기
표·필터·집계를 익히고 공개 결과에서 개인정보를 제외합니다.
진도 0%
레슨
- 행·열과 필요한 열 조회
기록 ID와 표의 한 행을 연결합니다.
- 완료 여부와 쪽수 필터
논리 조건과 NULL을 구분합니다.
- 독서 통계 집계
COUNT·SUM과 빈 결과의 의미를 설명합니다.
- 공개 보고서에 필요한 정보만
개인정보의 목적·보관·공개 범위를 구분합니다.
독서 기록에서 공개용 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 * 대신 공개 열 목록을 선택한 근거가 있습니다.
- 실제 개인정보 없이 가상 자료로 검증합니다.