AI 업무 활용

AI가 작성한 코드를 체크리스트로 검토하는 방법

AI가 작성한 코드는 겉보기에는 완성되어 있어도 입력값, 예외 상황, 의존성, 오류 처리에 숨은 가정이 있을 수 있습니다. 작은 합성 CSV 예제로 코드를 단계별로 검토하는 방법을 확인합니다.

목차 보기

이런 분께AI 채팅 도우미로 간단한 Python 스크립트를 작성하고 실제 데이터에 적용하기 전에 체계적으로 검토하고 싶은 사람을 위한 내용입니다.

준비사항
  • Python 3.12
  • Python 스크립트 실행과 CSV 파일 구조에 대한 기본적인 이해

01AI가 작성한 코드도 검토해야 하는 이유

AI 채팅 도우미는 문법상 그럴듯한 코드를 빠르게 작성할 수 있지만, 그럴듯해 보인다는 것이 정확하다는 뜻은 아닙니다. 모든 입력 행이 완전하다고 가정하거나, 특정 열을 잘못 해석하거나, 기존 결과 파일을 덮어쓰거나, 설치되지 않은 패키지에 의존하거나, 특정 예외값이 들어왔을 때만 실패할 수도 있습니다. 따라서 코드가 보기 좋은지를 확인하는 데 그치지 말고 코드가 전제한 조건을 하나씩 확인해야 합니다.

간단한 코드 검토는 다섯 가지 질문으로 정리할 수 있습니다. 어떤 입력값을 기대하는가? 경계값이나 예외값에서는 어떻게 동작하는가? 오류는 어떻게 처리하는가? 어떤 의존성이 필요한가? 잘못된 결과를 찾아낼 수 있는 테스트는 무엇인가? 계산이 정확하더라도 기존 파일을 덮어쓴다면 안전하지 않을 수 있으므로 출력 방식도 함께 확인해야 합니다.

02먼저 작은 합성 예제로 확인하기

다음과 같은 합성 파일 orders.csv가 있다고 가정합니다. 열은 order_id, quantity, unit_price 세 개이고 데이터는 A001,2,10.00, A002,3,5.50, A003,1,8.00 세 행입니다. 예상 매출은 손으로 쉽게 계산할 수 있습니다. 2 × 10.00 = 20.00, 3 × 5.50 = 16.50, 1 × 8.00 = 8.00이므로 총수량은 6개, 총매출은 44.50이어야 합니다.

첫 검증 데이터를 이렇게 작게 만드는 데에는 이유가 있습니다. AI가 작성한 스크립트가 44.50을 출력한다면 직접 계산한 값과 비교할 수 있습니다. 처음부터 50,000행짜리 실제 업무 파일을 사용하면 그럴듯한 결과가 나와도 파싱이나 계산 오류를 발견하기 어려울 수 있습니다.

order_idquantityunit_price예상 매출
A001210.0020.00
A00235.5016.50
A00318.008.00
합계644.50

03입력과 출력 규칙을 명확하게 요청하기

단순히 매출을 요약하는 스크립트를 작성해 달라고 하기보다 파일 형식, 계산 방법, 오류 발생 시 동작, 출력 규칙을 구체적으로 지정하는 것이 좋습니다.

  1. orders.csv에 order_id, quantity, unit_price 열이 반드시 있어야 한다고 지정합니다.
  2. 누락되거나 잘못된 숫자 값을 임의로 추정하지 말고 오류로 처리하도록 요청합니다.
  3. 총수량과 총매출을 계산하도록 요청합니다.
  4. Python 3.12 표준 라이브러리만 사용하도록 지정합니다.
  5. 결과는 outputs 폴더에 저장하고 같은 출력 파일이 이미 있으면 덮어쓰지 말고 중단하도록 지정합니다.

04AI의 일반적인 답변을 검토하기

일반적인 답변에서는 csv.DictReader로 CSV를 읽고, 금액 계산에는 Decimal을 사용하며, 경로 처리는 pathlib로 수행하고 입력값을 명시적으로 검증할 수 있습니다. 코드가 깔끔해 보여도 요청사항을 제대로 구현했는지 각 분기와 조건을 직접 확인해야 합니다.

python
from csv import DictReader
from decimal import Decimal, InvalidOperation
from pathlib import Path

INPUT_FILE = Path("orders.csv")
OUTPUT_DIR = Path("outputs")
OUTPUT_FILE = OUTPUT_DIR / "order_summary.txt"
REQUIRED_COLUMNS = {"order_id", "quantity", "unit_price"}


def main():
    if not INPUT_FILE.is_file():
        raise SystemExit(f"Input file not found: {INPUT_FILE}")

    if OUTPUT_FILE.exists():
        raise SystemExit(f"Output already exists: {OUTPUT_FILE}")

    total_quantity = 0
    total_revenue = Decimal("0")

    with INPUT_FILE.open("r", encoding="utf-8", newline="") as file:
        reader = DictReader(file)

        if reader.fieldnames is None:
            raise SystemExit("Input file has no header row.")

        missing_columns = REQUIRED_COLUMNS - set(reader.fieldnames)
        if missing_columns:
            names = ", ".join(sorted(missing_columns))
            raise SystemExit(f"Missing required columns: {names}")

        for line_number, row in enumerate(reader, start=2):
            order_id = row["order_id"].strip()
            quantity_text = row["quantity"].strip()
            price_text = row["unit_price"].strip()

            if not order_id or not quantity_text or not price_text:
                raise SystemExit(f"Missing value on line {line_number}.")

            try:
                quantity = int(quantity_text)
                unit_price = Decimal(price_text)
            except (ValueError, InvalidOperation):
                raise SystemExit(f"Invalid numeric value on line {line_number}.")

            if quantity < 0 or unit_price < 0:
                raise SystemExit(f"Negative value on line {line_number}.")

            total_quantity += quantity
            total_revenue += quantity * unit_price

    OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    result = (
        f"total_quantity={total_quantity}\n"
        f"total_revenue={total_revenue:.2f}\n"
    )
    OUTPUT_FILE.write_text(result, encoding="utf-8")
    print(f"Wrote: {OUTPUT_FILE}")


if __name__ == "__main__":
    main()

05입력값, 예외 상황, 오류, 의존성 검토하기

검토 항목확인할 질문이 예제의 동작
입력값파일명, 열 이름, 인코딩, 데이터 형식이 명확한가?orders.csv와 세 개의 지정된 열을 요구하고 UTF-8 CSV로 엽니다.
예외 상황헤더 누락, 빈 값, 0, 음수가 들어오면 어떻게 되는가?필수값 누락과 음수는 거부하고 0은 허용합니다.
오류 처리잘못된 입력을 만났을 때 잘못된 결과를 계속 계산하지 않고 명확하게 중단하는가?값이 누락되거나 숫자가 잘못된 경우 해당 행 번호를 포함한 메시지와 함께 중단합니다.
의존성설명하지 않은 외부 패키지나 특정 버전을 요구하는가?Python 3.12 표준 라이브러리만 사용합니다.
출력 안전성기존 결과 파일을 덮어쓸 가능성이 있는가?outputs/order_summary.txt가 이미 있으면 중단합니다.
테스트작은 예제의 결과를 미리 계산할 수 있는가?합성 예제에서는 총수량 6, 총매출 44.50이 예상됩니다.

문법만 보고는 드러나지 않는 가정도 확인해야 합니다. 예를 들어 이 스크립트는 quantity와 unit_price가 음수인 경우만 거부하므로 0은 허용합니다. 수량이나 가격이 0이어도 되는지는 Python의 문제가 아니라 업무 규칙의 문제입니다. 실제 데이터에 적용하기 전에 이 규칙이 의도와 맞는지 사용자가 판단해야 합니다.

06실제 파일을 사용하기 전에 테스트 설계하기

정상 데이터만 테스트해서는 충분하지 않습니다. 서로 다른 상황을 의도적으로 만든 소수의 테스트 입력을 사용하면 스크립트의 실제 동작을 훨씬 잘 확인할 수 있습니다.

  • 정상 사례: 세 개의 합성 행에서 total_quantity=6, total_revenue=44.50이 나와야 합니다.
  • 열 누락: unit_price를 price로 바꾸고 계산 전에 스크립트가 중단되는지 확인합니다.
  • 빈 값: quantity 하나를 비우고 해당 행에서 오류를 표시하는지 확인합니다.
  • 잘못된 숫자: 5 대신 five를 넣고 거부되는지 확인합니다.
  • 음수: quantity 또는 unit_price에 -1을 넣고 중단되는지 확인합니다.
  • 0 값: quantity에 0을 넣고 이를 허용하는 동작이 실제 업무 규칙과 맞는지 판단합니다.
  • 기존 출력 파일: outputs/order_summary.txt를 미리 만든 뒤 덮어쓰지 않고 중단하도록 설계되었는지 확인합니다.
  • 헤더만 있는 빈 데이터 파일: 총수량 0과 총매출 0.00을 허용할지, 데이터가 없는 파일을 오류로 처리할지 결정합니다.

07이 체크리스트만으로 증명할 수 없는 것

이 체크리스트는 일반적인 구현 오류를 찾는 데 도움이 되지만 업무 요구사항 자체가 올바른지는 증명하지 못합니다. 환불 금액을 음수로 표시해야 하는지, 수량 0을 허용할지, 가격에 세금이 포함되는지, 같은 order_id가 여러 번 등장해도 되는지는 해당 규칙을 따로 정의하지 않는 한 스크립트가 스스로 판단할 수 없습니다.

규모가 크거나 위험도가 높은 스크립트라면 보안, 권한, 개인정보, 동시 실행, 수치 정밀도, 성능, 로그, 자동화 테스트까지 검토 범위를 넓혀야 합니다. 특히 경로 조작, 셸 명령, 네트워크 요청, 인증정보, 파일 삭제나 덮어쓰기 같은 작업을 수행하는 코드는 단순한 로컬 CSV 계산보다 더 엄격하게 검토해야 합니다.

실무에서는 입력 조건을 정의하고, 작은 예제를 직접 계산하고, 오류 발생 경로를 확인하고, 의존성을 확인하고, 출력 파일을 보호하고, 경계값을 테스트하는 순서로 검토할 수 있습니다. AI는 구현 초안을 만드는 데 활용할 수 있지만 실제 요구사항과 코드가 일치하는지는 사용자가 확인해야 합니다.

실행·검증 기록

2026-09-21 · hand-checked example · Python 3.12

  • 합성 예제의 계산은 손으로 확인했습니다: 2 × 10.00 = 20.00, 3 × 5.50 = 16.50, 1 × 8.00 = 8.00.
  • 예상 총수량은 손으로 확인했습니다: 2 + 3 + 1 = 6.
  • 예상 총매출은 손으로 확인했습니다: 20.00 + 16.50 + 8.00 = 44.50.
  • 예제 코드는 입력값 검증, 오류 처리, 의존성, 기존 출력 파일 보호 요구사항을 기준으로 수동 검토했습니다.
  • 예제 코드는 csv, decimal, pathlib 등 Python 표준 라이브러리만 사용합니다.
검증 범위의 한계
  • 이 글의 Python 코드는 직접 실행하지 않았으며 설명한 동작은 수동 코드 검토를 기준으로 작성했습니다.
  • 이 예제는 중복 order_id, 수량 0, 환불, 세금, 환율 변환, 매우 큰 파일에 대한 업무 규칙을 정의하지 않습니다.
  • 이 체크리스트를 통과하더라도 다른 데이터셋이나 운영 환경에서 스크립트의 보안성과 정확성이 자동으로 보장되는 것은 아닙니다.

사이트 전체의 작성·검증 원칙

참고 출처

설명과 예제는 직접 작성했습니다. 관련 동작과 개념은 아래 공식 자료에서 확인할 수 있습니다.