한 형상을 그리는 자동화는 어렵지 않습니다. 진짜 문제는 수십 개를 한 번에 그릴 때 생깁니다. 도면 작도 도구에 CSV 파일 한 장으로 여러 형상을 격자 배치하는 일괄 기능을 붙이면서 표에 잘못된 값이 하나라도 있으면 어떻게 되는가가 설계의 핵심이 됐습니다. 실무 표에는 늘 빈칸과 오타와 예상 못한 값이 섞이기 때문입니다. 그 견고함을 어떻게 만들었는지 정리합니다.
한 행의 실패가 전체를 멈추면 안 된다
CSV 일괄 작도의 흐름은 단순합니다. 파일을 한 줄씩 읽어 형상 종류와 치수로 해석하고 그 값으로 형상을 하나씩 그린 뒤, 다음 행으로 넘어가 격자로 늘어놓습니다. 문제는 스무 번째 행에서 값이 잘못돼 오류가 나면, 앞서 그린 열아홉 개까지 함께 날아가고 명령 전체가 중단된다는 데 있습니다.
수십 행짜리 표를 넣었는데 한 줄 오타 때문에 아무것도 안 그려지고 멈춘다면 도구로 쓸 수 없습니다. 그래서 원칙을 잡았습니다. 각 행의 처리를 독립적으로 두고 한 행이 실패해도 그 행만 건너뛰고 다음 행을 계속 처리한다. 헤더로 쓰인 첫 행과 중간의 빈 행도 자동으로 걸러 지나갑니다. 한 행의 실패가 그 행 안에 갇히도록 만들었습니다.
파싱에서 크래시가 나는 지점들
행을 값으로 바꾸는 파싱 단계가 가장 위험했습니다. 숫자를 읽을 때 흔히 쓰는 변환은 "abc" 같은 글자를 넣어도 조용히 0으로 바꿔 버립니다. 그러면 사용자가 실수로 비운 칸이 0짜리 형상으로 그려져, 오류도 아닌 채 잘못된 도면이 나옵니다. 그래서 값을 숫자로 바꾸기 전에 그것이 정말 숫자인지 먼저 검사하고 숫자가 아니면 빈 값으로 처리하도록 했습니다.
더 고약한 것은 깨진 값이 파싱 함수 자체를 터뜨리는 경우였습니다. 괄호가 짝이 맞지 않는 문자열처럼 예상 밖의 입력은 값을 읽는 과정에서 오류를 던지고 그 오류가 잡히지 않으면 배치 전체가 중단됩니다. 그래서 값을 해석하는 시도를 오류 감지 방어막으로 감싸, 어떤 이상한 문자가 들어와도 그 행이 실패로 처리될 뿐 전체 흐름이 끊기지 않게 했습니다. 값이 숫자로 시작하지 않으면 해석을 아예 시도하지 않는 방어도 앞에 뒀습니다.
그린 뒤에는 반드시 보고한다
일괄 작업에서 사용자가 가장 답답해하는 건 무엇이 됐고 무엇이 안 됐는지 모르는 상황입니다. 그래서 모든 행을 처리한 뒤 성공과 실패 건수를 명령창에 정리해 보여 주고 실패한 행은 몇 번째 행이 왜 실패했는지 사유와 함께 남깁니다. 사용자는 그 리포트만 보고 표의 어느 줄을 고쳐야 하는지 바로 압니다.
작도 전에는 수치가 기하학적으로 성립하는지도 검사합니다. 홀이 외곽선 밖으로 나가거나 홀끼리 겹치는 조합은 그리기 전에 걸러 실패로 처리합니다. 단, 개별 작업에서는 경고창을 띄우지만 일괄 작업에서는 창을 띄우지 않고 조용히 실패로 기록합니다. 수십 개를 그리는 도중에 경고창이 하나씩 뜨면 사용자가 계속 확인을 눌러야 하기 때문입니다.
전체를 한 번에 되돌린다
마지막 장치는 Undo입니다. 일괄 배치로 수십 개를 그려 놓고 마음에 안 들 때, 되돌리기를 수십 번 눌러야 한다면 그것도 고역입니다. 그래서 일괄 배치 전체를 하나의 Undo 그룹으로 묶었습니다. 되돌리기 한 번이면 방금 배치한 모든 형상이 함께 사라집니다.
이 네 가지 장치가 합쳐지면 일괄 작도는 견고해집니다. 잘못된 행은 격리되고 파싱은 크래시 없이 버티고 결과는 리포트로 투명하게 드러나고 전체는 한 번에 되돌릴 수 있습니다. 실무 표가 아무리 지저분해도 도구가 끝까지 돌고 무엇을 고칠지 알려 준다는 것이 일괄 기능을 실제로 쓰게 만드는 조건이었습니다.
작도 전 사전 검증의 원리는 AutoCAD 도면 작도 자동화 도구 사례에서 더 볼 수 있고 CSV 파일 자체의 한글 인코딩 처리는 한글 CAD 환경의 인코딩 함정에서, 도형을 순수 함수로 그리는 방식은 entmake로 도형, command로 치수에서 이어집니다.
자주 묻는 질문
표에 잘못된 행이 있으면 전체가 멈추나요?
멈추지 않습니다. 각 행의 처리를 독립적으로 두어, 한 행이 실패해도 그 행만 건너뛰고 다음 행을 계속 그립니다. 헤더로 쓰인 첫 행과 중간의 빈 행도 자동으로 걸러 지나갑니다. 한 줄의 오타가 나머지 작업을 무너뜨리지 않습니다.
빈칸이나 숫자가 아닌 값은 어떻게 처리하나요?
값을 숫자로 바꾸기 전에 정말 숫자인지 먼저 검사해, 빈칸이나 글자는 빈 값으로 처리하고 0으로 오인하지 않습니다. 괄호가 깨진 문자열처럼 파싱 함수 자체를 터뜨릴 수 있는 입력은 오류 감지 방어막으로 감싸, 이상한 값이 들어와도 그 행만 실패로 처리되고 전체는 계속 돕니다.
무엇이 실패했는지 알 수 있나요?
네. 모든 행을 처리한 뒤 성공과 실패 건수를 정리해 보여 주고 실패한 행은 몇 번째 행이 어떤 사유로 실패했는지 함께 남깁니다. 그 리포트만 보고 표의 어느 줄을 고쳐야 하는지 바로 알 수 있으며 일괄 배치 전체는 되돌리기 한 번으로 취소됩니다.