점검이 전부 통과인데 결과물이 엉망인 이유 — 빈칸 자동 채움과 개수 검사
결론부터 말할게요. 점검이 전부 통과했다는 말은 "내가 물어본 것만 통과했다"는 뜻입니다. 결과물은 엉망인데 화면은 초록불이라면, 볼 곳은 두 군데예요. 빈칸을 프로그램이 대신 채우는 자리, 그리고 검사 항목이 "몇 개인가"만 묻고 있는지. 아래 설명은 데이터 양식 규격인 JSON Schema와 파이썬 검사 도구 pytest의 공식 문서를 2026년 7월 28일에 직접 열어 대조한 내용입니다.
이 글을 쓰게 된 계기는 저희 쪽 자동화에서 점검 항목이 전부 통과로 표시됐는데 결과물 여러 편이 같은 구조로 반복된 일이었어요. 다만 그 건수와 편수는 외부에서 확인할 수 없는 저희 운영 메모라 근거로 쓰지 않고, 계기로만 한 줄 적어 둡니다.
빈칸을 프로그램이 대신 채우면 검사는 통과로 셉니다
자동으로 채워진 값은 검사 입장에서 사람이 적은 값과 구분되지 않아요. 그래서 "필수 항목이 다 찼는가"를 묻는 검사는 아무 문제 없이 통과합니다.
견적서를 자동으로 만드는 도구를 떠올려 보세요. 담당자가 "할인 구분"을 비워 두면 프로그램이 기본값 "일반"을 넣습니다. 검사는 빈칸이 없으니 통과. 특별 단가로 나갔어야 할 견적이 몇 달 동안 일반 단가로 나가도 화면은 계속 초록불입니다. 사람이 판단해야 할 자리를 프로그램이 대신 메운 순간, 검사는 그 판단이 있었는지 없었는지 알 방법이 사라져요.
여기서 헷갈리기 쉬운 게 "기본값"이라는 말입니다. 데이터 양식을 정의하는 국제 규격인 JSON Schema 공식 문서는 default(기본값)를 설명하면서 이렇게 못 박아 둡니다.
"This value is not used to fill in missing values during the validation process." — 이 값은 검증 과정에서 빠진 값을 채워 넣는 데 쓰이지 않습니다. (JSON Schema, Annotations, 2026-07-28 확인)
쉽게 말하면 기본값은 "보통은 이런 값이 들어갑니다"라고 사람에게 알려 주는 설명용 메모예요. 검증이 대신 채워 주는 값이 아닙니다. 그런데도 값이 채워져서 나온다면, 그건 검증이 아니라 그 앞뒤의 조립·생성 단계에서 누군가 그렇게 만들어 둔 거예요. 원인을 찾을 때 검사기부터 뒤지면 안 나오는 이유가 여기 있습니다.
사람이 판단할 자리는 채우지 말고 멈추게 하세요
고치는 방향은 단순합니다. 사람이 골라야 하는 항목이 비어 있으면 대충 채우지 말고 그 자리에서 작업을 멈추게 하는 거예요.
규격 쪽에도 이걸 받쳐 주는 장치가 있습니다. JSON Schema에는 값에 따라 검사를 갈라 주는 조건부 규칙(if·then·else)이 있어요. "구분이 특별 단가면 승인자 항목도 반드시 있어야 한다"처럼, 앞의 값이 무엇이냐에 따라 뒤에 붙는 조건을 다르게 적용하는 방식입니다(JSON Schema, Conditional subschemas, 2026-07-28 확인). 값을 채워 넣어 넘기는 대신, 조건이 안 맞으면 걸러내는 쪽으로 설계할 수 있다는 뜻이에요.
엑셀이나 사내 양식을 쓰는 분이라면 코드를 안 건드려도 같은 효과를 낼 수 있습니다. 자동 입력 수식을 지우고, 그 칸이 비면 저장이나 출력이 안 되게 막아 두는 것만으로 충분해요.
검사 개수는 확인 범위가 아닙니다
두 번째 함정은 숫자예요. 검사 몇 개 통과라는 숫자는 "무엇을 확인했는가"와 거의 상관이 없습니다.
파이썬 검사 도구인 pytest 공식 문서를 보면 이유가 바로 보입니다. 값 목록을 넘겨 같은 검사를 여러 번 돌리는 방식(parametrize)을 설명하는 예제에서, 값 3개를 넘기자 결과가 collected 3 items로 잡히고 각 검사에 test_eval[6*9-42]처럼 값이 붙은 이름이 따로 달립니다(pytest, How to parametrize fixtures and test functions, 2026-07-28 확인). 확인하는 내용은 하나인데, 대상이 늘어난 만큼 건수가 늘어난 겁니다.
그러니까 대상 문서가 7건이면 같은 항목 하나가 7건으로 표시돼요. 항목을 하나도 늘리지 않고도 숫자는 몇 배가 됩니다. 검사 건수가 많다는 말은 꼼꼼히 봤다는 뜻이 아니라 대상이 많다는 뜻일 수 있어요.
나머지 절반은 더 단순합니다. pytest의 검사는 파이썬 기본 assert 문으로 적어 둔 조건을 확인하는 방식이에요(pytest, How to write and report assertions in tests, 2026-07-28 확인). 적어 두지 않은 조건은 통과도 실패도 하지 않습니다. 아예 화면에 나타나지 않으니 없다는 것도 눈치채기 어렵고요.
여기에 개수 검사가 겹치면 완성입니다. 소제목이 4개 이상인지, 항목이 3~5개인지 같은 건 세면 답이 나오니 만들기 쉬워요. 반대로 "이 문장이 진짜 핵심을 말하고 있는가", "독자가 할 일이 적혀 있는가"는 세는 방법이 없어서 아무도 적어 두지 않습니다. 그러면 그 항목은 영원히 확인되지 않아요.
견적서와 회의록에서 똑같이 벌어지는 일
이 조합은 글 만드는 자동화만의 문제가 아닙니다. 빈칸 자동 채움과 개수 검사가 한 도구 안에 같이 들어 있으면 어떤 업무든 같은 사고가 나요.
- 회의록 정리 도구 — "결정 사항" 칸이 비면 "논의"로 채우게 해두면, 결정이 하나도 없는 회의록만 쌓이는데 형식 검사는 계속 초록불입니다.
- 견적·주문 양식 — 구분값이 비면 "일반"이 들어가고, 검사는 항목 개수만 셉니다. 단가가 몇 달째 틀려도 아무 표시가 안 뜹니다.
- 지원서·신청서 취합 — 선택 항목이 비면 첫 번째 보기가 자동으로 들어가게 해두면, 응답한 적 없는 답이 통계에 그대로 섞입니다.
공통점이 보이시죠. 셋 다 "빠진 게 없는가"는 확인하지만 "내용이 맞는가"는 아무도 묻지 않습니다. 그리고 자동화는 잘못을 막아 주는 게 아니라, 대상 수만큼 똑같이 복제해 줍니다.
오늘 10분이면 되는 점검 두 가지
- 빈칸을 프로그램이 대신 채우는 곳을 찾아 목록으로 적으세요. 그리고 항목마다 "이건 사람이 판단할 값인가, 그냥 늘 같은 값인가"를 표시합니다. 사람이 판단할 값이면 자동 채움을 끄고, 비었을 때 멈추게 바꿉니다.
- 검사 항목을 한 줄씩 소리 내어 읽어 보세요. 전부 "몇 개인가"로 끝난다면, 결과물의 내용은 아무도 보고 있지 않은 상태입니다. 이때 개수 검사를 열 개 더 붙이는 걸로 덮으면 안 돼요. 그건 물어보는 개수만 늘리는 겁니다.
모든 자동 채움이 나쁜 건 아닙니다. 통화 단위, 작성 연도, 부서명처럼 언제나 같은 값은 자동으로 넣는 편이 실수가 적어요. 구분해야 할 건 사람이 매번 다르게 골라야 하는 항목 하나뿐입니다.
의미를 보는 검사를 자동으로 만들기 어렵다면, 대상 전체를 한꺼번에 만들지 말고 대표 1건만 먼저 완성해서 사람이 처음부터 끝까지 읽는 방식이 가장 쌉니다. 그 1건이 괜찮을 때 나머지로 늘리면, 잘못이 복제되기 전에 멈출 수 있어요.
확인한 기준과 남은 한계
- JSON Schema — Annotations : 기본값(default)은 검증 중 빠진 값을 채우지 않는다는 원문 문장 (확인일 2026-07-28)
- JSON Schema — Conditional subschemas : 값에 따라 추가 검증을 갈라 적용하는 if·then·else 규칙 (확인일 2026-07-28)
- pytest — How to parametrize fixtures and test functions : 값 하나마다 검사 1건으로 집계되는 방식과 예제 표기 (확인일 2026-07-28)
- pytest — How to write and report assertions in tests : 적어 둔 조건만 확인한다는 기본 동작 (확인일 2026-07-28)
한계도 같이 적습니다. 위 내용은 이 두 도구의 문서가 설명하는 동작이고, 다른 검증 라이브러리나 사내 도구가 똑같이 움직인다고 단정할 수는 없어요. pytest assert 페이지는 직접 인용이 아니라 문서 취지를 옮긴 것이고, 글머리에 적은 저희 쪽 점검 기록은 외부에서 대조할 수 없어 근거로 쓰지 않았습니다.
정리하면 이렇습니다. 통과 표시가 늘어난다고 안심할 근거가 늘어나는 게 아니에요. 물어보지 않은 항목은 물어보지 않은 채로 남아 있고, 빈칸을 대신 채우는 자리는 그 항목을 영영 물어볼 수 없게 만듭니다. 오늘은 자동 채움 자리 목록을 적고, 검사 항목을 소리 내어 읽어 보는 것까지만 하면 충분해요.
댓글
댓글 쓰기
질문은 자유롭게 남겨주세요. 광고성 댓글, 비방, 개인정보가 포함된 댓글은 삭제될 수 있습니다.