AI가 만든 코드를 작은 데이터로 검증하기
손계산할 수 있는 네 행과 12개 단위 테스트로 집계 함수를 확인합니다. 정상 값뿐 아니라 빈 입력, 0, 소수, 잘못된 입력까지 검증합니다.
“자동화해 줘”를 실행 가능한 작업 설명으로 바꿉니다. 민감정보 없는 합성 샘플과 손으로 확인한 기대 결과를 붙여, 팀별 작업 기록 집계 스크립트를 요청하는 문장을 완성합니다.
이런 분께간단한 파일 정리나 집계를 AI에 요청하려는 비개발 실무자
좋은 요청문은 긴 역할 지시보다 구체적인 업무 규칙을 담습니다. “파일을 잘 정리해 줘”만으로는 읽을 폴더, 결과 이름, 중복 처리, 덮어쓰기 여부가 정해지지 않습니다. 이 글에서는 한 주의 합성 작업 기록을 팀별로 합치는 작은 일로 범위를 제한합니다. 결과는 재사용할 수 있는 요청문과 입력·기대 결과 파일입니다.
| 항목 | 이 예제에서 정한 내용 |
|---|---|
| 목적 | 팀별 완료 건수·작업 시간·건당 시간을 확인 |
| 입력 | 현재 폴더의 UTF-8 input.json |
| 출력 | 새 output.json; 기존 파일이 있으면 중단 |
| 계산 | 팀별 합계를 구한 뒤 시간 ÷ 완료 건수 |
| 예외 | 0건이면 평균 null; 잘못된 행은 전체 중단 |
| 허용 범위 | 로컬 파일만; 원본 보존; 외부 접속 없음 |
“건당 시간”이 실제로 무엇을 뜻하는지도 적어야 합니다. 이 합성 예제에서는 입력 minutes 전체를 해당 행의 completed 건수에 대응하는 작업 시간으로 정의합니다. 대기 시간이나 미완료 작업 시간을 포함한다면 이 평균의 의미가 달라지므로 먼저 업무 정의를 고칩니다.
| 기록 ID | 팀 | 완료 건수 | 작업 시간 |
|---|---|---|---|
| S001 | 설계 | 3건 | 90분 |
| S002 | 설계 | 2건 | 50분 |
| O001 | 운영 | 4건 | 80분 |
| H001 | 지원 | 0건 | 0분 |
설계 팀은 5건, 140분이므로 건당 시간은 28분입니다. 행별 건당 시간 30분과 25분의 단순 평균 27.5분을 쓰면 작업 건수의 차이가 반영되지 않습니다. 운영 팀은 4건, 80분, 건당 20분입니다. 지원 팀의 0건은 계산 가능한 평균이 없다는 뜻이므로 null로 표시합니다.
input-sample.json과 expected-output.json은 이런 차이를 보여 주는 한 쌍입니다. JSON은 구조화된 데이터를 담는 형식이며, null은 숫자 0과 다릅니다. 이 구분은 Python 공식 json 문서의 값 대응 설명에서도 확인할 수 있습니다.
다음 조건을 만족하는 로컬 Python 스크립트를 작성해 주세요.
[업무 목적]
한 주의 작업 기록을 팀별로 합쳐 완료 건수, 작업 시간 합계(분), 건당 작업 시간(분/건)을 확인합니다.
이 요청의 모든 기록은 합성 샘플입니다. 실명, 고객 정보, 계약 내용, 사내 경로, 계정 키는 포함하지 않습니다.
[실행 환경과 범위]
Python 3 표준 라이브러리만 사용합니다. 외부 패키지 설치, 인터넷 접속, 유료 API 호출, 이메일 전송은 하지 않습니다.
현재 작업 폴더의 input.json만 읽습니다. 하위 폴더 탐색, 원본 수정, 파일 삭제는 하지 않습니다.
새 output.json을 만듭니다. output.json이 이미 있으면 덮어쓰지 말고 이유를 알려주며 종료합니다.
[입력 형식]
UTF-8 JSON 배열입니다. 각 행에는 record_id, team, completed, minutes 네 키만 있습니다.
record_id는 중복되지 않는 비어 있지 않은 문자열입니다.
team은 설계, 운영, 지원 가운데 하나입니다. 알 수 없는 팀은 임의로 바꾸지 않습니다.
completed와 minutes는 0 이상의 정수입니다. 문자열 숫자, true/false, null, 누락 값은 허용하지 않습니다.
입력 배열은 비어 있어도 됩니다. 한 행의 오류라도 있으면 전체 집계를 중단합니다.
[입력 샘플]
[
{"record_id":"S001","team":"설계","completed":3,"minutes":90},
{"record_id":"S002","team":"설계","completed":2,"minutes":50},
{"record_id":"O001","team":"운영","completed":4,"minutes":80},
{"record_id":"H001","team":"지원","completed":0,"minutes":0}
]
[처리 규칙]
팀별 completed와 minutes를 각각 합합니다.
minutes_per_completed = 팀 작업 시간 합계 / 팀 완료 건수 합계입니다.
행별 평균을 다시 평균하지 않습니다. 건수가 0이면 minutes_per_completed는 JSON null입니다.
평균은 계산 후 Decimal의 ROUND_HALF_UP 방식으로 소수 둘째 자리까지 반올림해 JSON 숫자로 저장합니다.
출력에는 입력에 나타난 팀만 넣고, 팀 순서는 설계 → 운영 → 지원으로 고정합니다.
빈 입력의 출력은 빈 배열 []입니다.
[기대 결과]
[
{"team":"설계","total_completed":5,"total_minutes":140,"minutes_per_completed":28.0},
{"team":"운영","total_completed":4,"total_minutes":80,"minutes_per_completed":20.0},
{"team":"지원","total_completed":0,"total_minutes":0,"minutes_per_completed":null}
]
JSON 숫자는 28과 28.0의 표기가 달라도 같은 값으로 비교합니다.
[오류 원칙]
파일 없음, 잘못된 JSON, 배열이 아닌 최상위 구조, 중복 record_id, 필수 키 누락,
추가 키, 허용되지 않은 팀, 음수/문자열/불리언 숫자를 발견하면 성공 결과를 만들지 않습니다.
오류 메시지는 행 번호(1부터 시작)와 필드 이름, 오류 이유만 출력하고 입력 내용 전체를 출력하지 않습니다.
입력 오류를 0으로 바꾸거나 잘못된 행을 조용히 건너뛰지 않습니다. 종료 코드는 실패를 나타내야 합니다.
[답변 형식]
먼저 목적, 입력, 출력, 오류 처리, 남은 가정을 짧게 요약합니다.
그 다음 완성 스크립트와 실행 방법, 이 샘플의 기대 결과를 제시합니다.
요구사항끼리 충돌하거나 업무 의미를 확정할 수 없으면 코드를 쓰기 전에 해당 쟁점만 질문합니다.
실제로 실행하지 않았다면 실행 완료라고 쓰지 않습니다.
다른 업무에 재사용할 때는 팀 이름만 바꾸지 말고 목적, 입력의 정의, 계산식, 0과 빈 값의 의미, 기대 결과를 함께 바꿉니다. 입력 샘플과 기대 결과가 어긋나면 AI가 어느 쪽을 기준으로 삼을지 불명확해집니다.
OWASP는 입력 형식과 값의 업무상 의미를 함께 확인하도록 설명합니다. 이 글에서는 그 구분을 요청문에 옮겨 “정수인가”와 “0 이상인가”, “허용된 팀인가”를 따로 정했습니다. 요청문에 적었다는 사실만으로 반환 코드가 해당 규칙을 구현했다고 볼 수는 없습니다.
| 모호한 지시 | 생기는 문제 | 더 구체적인 표현 |
|---|---|---|
| 평균을 구해 줘 | 행별 평균인지 전체 합계의 비율인지 불명확 | 팀 시간 합계 ÷ 팀 완료 건수 합계 |
| 오류는 알아서 처리해 줘 | 행을 버리거나 0으로 채울 수 있음 | 오류가 하나라도 있으면 결과를 만들지 않고 중단 |
| 결과를 저장해 줘 | 원본이나 기존 결과를 덮어쓸 수 있음 | 새 output.json; 파일이 이미 있으면 중단 |
| 내 폴더를 정리해 줘 | 대상 범위가 넓고 예상 행동이 불분명 | 현재 폴더의 input.json 한 개만 읽기 |
요청문은 구현을 위한 합의 문서입니다. 코드가 올바르게 실행되는지, 파일을 안전하게 다루는지, 실제 업무 자료와 맞는지는 받은 코드에서 별도로 확인해야 합니다. 이 자료는 합성 샘플의 기대값을 Python으로 검산했고 요청문에 필수 항목이 있는지 확인했습니다. AI 서비스에 요청하거나 생성 코드를 실행한 결과는 포함하지 않습니다.
참고자료는 2026년 9월 19일 공식 페이지에서 확인했습니다. Python과 OWASP 문서는 입력 형식과 검증 원칙의 근거이며, 특정 AI 서비스의 답변 품질을 보장하는 자료는 아닙니다.
Windows 로컬 Python 표준 라이브러리; 공식 출처 확인일 2026-09-19
코드·입력 데이터·실행 안내가 포함되어 있습니다. 압축을 풀고 README.txt부터 읽어 주세요.
예제 ZIP 다운로드직접 작성한 연습 자료 · 원본을 따로 보관한 뒤 실행하세요.
설명과 예제는 직접 작성했습니다. 관련 동작과 개념은 아래 공식 자료에서 확인할 수 있습니다.