앞선 글에서 나는 400페이지짜리 점검 문서의 서명을 검사하는 도구를 이야기를 했다. 이번에도 자동화에 관한 이야기지만 대상이 다르다. 이번엔 한 장이 아니라, 두 장의 문서를 서로 맞춰보는 일이다.
매달 마감이 되면 나는 두 종류의 문서를 나란히 놓는다. 하나는 팀원들의 한 달 출근 기록이고, 다른 하나는 그달에 낸 휴가 신청서 묶음이다. 내가 하는 일은 단순하다. 출근 기록에 오전 반차나 연차라고 적힌 날마다, 거기에 맞는 휴가 신청서가 실제로 있는지 확인하는 것이다.
말로 쓰면 한 줄인데, 실제로는 종이를 스캔한 문서를 한 장씩 넘기며 손으로 적힌 표기를 읽고, 다른 문서에서 같은 사람의 같은 날짜를 찾아 맞춰봐야 한다. 한 건이라도 어긋나면 근태와 정산이 틀어진다. 매달 이 대조 업무에 시간을 쓰면서, 이것도 AI에 맡겨보면 어떨까 고민해 본 과정을 담아보았다.

출근 기록과 휴가 신청서는 애초에 다른 곳에서 만들어진다. 출근 기록은 한 달 치 근태를 한 장에 요약한 표이고, 휴가 신청서는 사람마다 날짜마다 따로 낸 개별 문서다. 하나는 요약본, 하나는 낱장이다. 이 둘을 맞추려면 요약본의 한 칸을 보고 낱장 더미에서 짝을 찾아야 한다.
번거로움은 규칙이 하나가 아니라는 데서 온다. 출근 기록에 휴가로 표기됐다고 해서 전부 신청서가 있어야 하는 건 아니다. 출장이나 교육은 근무의 일종이라 휴가 신청서를 쓰지 않는다. 당직도 마찬가지다. 당직은 쉬는 날이 아니라 일하는 날이라 신청서가 없다. 반대로 당직 다음 날 오후에 반차를 쓴 경우에는 신청서가 있어야 한다. 이런 예외를 머릿속에 두고 한 칸씩 대조하다 보면, 단순 확인인데도 신경이 계속 쓰인다.
그리고 두 문서 모두 손으로 쓰고 도장을 찍은 뒤 스캔한 것이다. 화면으로 보면 글씨가 보이지만 컴퓨터에는 글자 정보가 없다. 앞선 글에서 다룬 벽과 같다. 화면에 보이는 것과 컴퓨터가 읽을 수 있는 것은 다르다. 게다가 이번에는 인쇄된 글자가 아니라 사람이 손으로 적은 표기라, 읽어내기가 한층 까다롭다.
어긋남이 왜 문제가 되는지는 지나고 나서야 크게 느낀다. 출근 기록은 그 자체로 끝나는 문서가 아니라, 나중에 근태와 정산으로 이어지는 근거가 된다. 오전반차로 적혀야 할 날이 종일 근무로 남아 있거나, 신청서 없이 휴가로 처리된 날이 섞이면, 몇 달 뒤 다른 자료와 맞춰볼 때 숫자가 어긋난다. 그때는 이미 원본을 다시 꺼내 한 장씩 확인해야 하고, 사람들의 기억도 흐릿해진 뒤다. 매달 마감 때 30분을 들여 대조하는 이유가 여기에 있었다. 지금의 30분이 나중의 반나절을 막아준다.
이번에도 설계는 클로드 코드와 대화하며 잡았다. 나는 개발자가 아니라서, 내가 한 일은 문제와 규칙을 설명하는 것이었다. 매달 내가 어떤 순서로 대조하는지, 어떤 날은 건너뛰는지, 어디서 자주 헷갈리는지를 말로 풀어 주면 클로드가 그걸 코드와 절차로 바꿨다. 완성된 도구는 세 단계로 움직인다.
먼저 파이썬이 두 스캔 PDF를 페이지마다 고해상도 이미지로 바꾼다. 여기에는 1편 서명 검사 때 익혀 둔 PyMuPDF를 그대로 다시 썼다. 도구를 하나 만들고 나면 그 부품이 다음 도구에 또 쓰인다는 걸 이때 실감했다.
다음 단계가 고비였다. 그 이미지를 읽는 일이다. 1편의 서명 검사는 칸이 칠해졌는지만 보면 됐다. 잉크가 묻은 정도를 숫자로 재는 것으로 충분했고, 글자를 읽을 필요가 없었다. 이번에는 다르다. 손으로 쓴 오전반차와 연차를 구분해서 읽어야 한다. 픽셀 계산으로는 안 되는 일이고, 일반 OCR도 흘려 쓴 한글 앞에서는 거의 읽지 못했다. 그래서 이 부분은 코드가 아니라 AI에게 맡겼다. 렌더링한 이미지를 클로드에게 주고, 사람이 표를 훑듯 읽게 했다. 누가, 며칠에, 어떤 종류의 휴가인지를 목록으로 뽑는 것까지가 AI의 몫이다.
마지막으로 그 두 목록을 규칙에 따라 맞춘다. 성명, 날짜, 휴가 종류 세 가지가 모두 맞아야 한 건으로 친다. 출장과 교육과 당직을 건너뛰는 예외도 이 단계에 넣었다. 결과는 색으로 구분된 HTML 보고서 한 장으로 남는다. 정상은 초록, 애매한 건 노랑, 어긋난 건 빨강이다.
실행 방식은 1편과 같은 원칙을 지켰다. 명령어를 몰라도 되도록, 두 PDF 파일을 배치 파일 아이콘 위에 끌어다 놓으면 분류부터 이미지 변환까지 이어서 돌아가게 했다. 매달 쓰는 도구는 시작이 쉬워야 다음 달에도 손이 간다.

도구가 두 문서를 읽고 나면, 대조는 오히려 단순해진다. 출근 기록 쪽 목록과 신청서 쪽 목록을 양방향으로 맞춰본다. 출근 기록에는 반차라고 돼 있는데 신청서가 없으면 표시하고, 반대로 신청서는 있는데 출근 기록에 표기가 빠졌으면 그것도 표시한다. 한쪽으로만 맞추면 다른 쪽 누락을 놓치기 때문에 양쪽에서 본다.
처음 만든 버전은 당직 날을 전부 어긋난 건으로 올렸다. 당직에는 신청서가 없으니 도구 입장에서는 짝이 없는 게 맞다. 그 화면을 보고서야 나는 내가 머릿속으로만 알고 있던 예외를 도구에게 알려주지 않았다는 걸 알았다. 출장과 교육과 당직은 휴가가 아니라는 것, 다만 당직 다음 날 오후 반차는 대조 대상이라는 것. 이 예외를 규칙으로 넣고 나서야 도구가 올리는 건수가 실제로 봐야 할 것만 남게 줄었다.
AI가 글씨를 제대로 읽는지도 처음에는 믿을 수 없었다. 그래서 첫 달에는 도구를 돌리고도 내가 하던 방식대로 눈으로 한 번 더 대조했다. 도구가 읽은 목록과 내가 손으로 확인한 목록을 나란히 놓고, 사람과 날짜와 종류가 하나씩 맞는지 봤다. 몇 군데는 도구가 흐린 칸을 애매하다고 올렸는데, 그건 내가 봐도 애매한 칸이었다. 도구가 나보다 잘 읽는 건 아니었다. 다만 내가 헷갈리는 곳을 도구도 헷갈린다는 것, 그리고 내가 무심코 넘긴 곳을 도구는 넘기지 않는다는 것은 확인했다. 그 정도면 믿고 쓸 수 있다고 봤다. 사람보다 정확하기를 바란 게 아니라, 사람이 놓치는 곳을 대신 잡아주기를 바란 것이었으니까.

여기까지 만들자 도구가 두 목록을 맞춰 결과를 내놨다. 그런데 나는 그 결과를 그대로 믿지 않기로 했다.
원본이 손글씨이기 때문이다. 오전반차와 오후반차는 글씨체에 따라 헷갈릴 수 있고, 흐리게 스캔된 칸은 사람이 봐도 애매하다. 도구가 오전을 오후로 잘못 읽으면, 서류상 아무 문제가 없는데도 어긋난 것처럼 보이거나 그 반대가 된다.
그래서 도구의 역할을 좁혀 두었다. 도구는 두 문서를 전부 읽어 맞춰보고, 어긋난 것과 애매한 것만 한 화면에 모아 올린다. 있다 없다의 최종 판단은 사람이 그 화면을 보고 한다. 스물다섯 건이 넘는 걸 전부 대조하는 대신, 도구가 올린 몇 건만 사람이 확인하면 된다. 이게 30분을 1분으로 줄인 진짜 이유다. 시간이 준 건 대조를 안 해서가 아니라, 사람이 볼 곳이 몇 곳으로 좁아졌기 때문이다.
실제로 도구가 애매하다고 올린 칸을 열어보면, 종류를 적은 글씨가 반쯤 지워졌거나 칸 밖으로 삐져나간 경우가 많았다. 어떤 칸은 오전이라고 썼다가 오후로 고쳐 쓴 흔적이 겹쳐 있었다. 이런 칸을 도구가 알아서 결론 내게 두면 위험하다. 그래서 도구는 억지로 판정하지 않고 애매하다고 표시해 사람에게 넘긴다. 나는 원본을 확대해 다시 보고, 그래도 모르겠으면 그날 그 사람에게 직접 물어본다. 판단을 사람에게 남긴다는 건 이런 장면을 말한다. 도구가 스물네 건을 맞게 읽어도, 애매한 한 건을 사람이 보지 않으면 결국 그 한 건이 나중에 문제가 되기 때문이다.
한 달 치 실제 문서로 돌려봤다. 그달에는 출근 기록에 표기된 휴가와 신청서가 스물다섯 건 대 스물다섯 건으로 맞았다. 짝이 없는 건은 하나도 없었다. 숫자만 보면 전부 정상이다.
그런데 도구가 한 건을 올렸다. 신청서는 제때 제출돼 있는데, 그 신청서의 휴가 종류 칸에 표시가 빠져 있는 경우였다. 출근 기록에는 오전반차라고 적혀 있고 신청서도 있으니, 있다 없다만 세면 그냥 지나간다. 도구는 종류까지 맞춰봤기 때문에, 종류 표시가 비어 있는 그 한 장에서 걸렸다. 아마 급하게 쓰면서 동그라미 하나를 빠뜨렸을 것이다.
이런 건 자체는 크지 않다. 다만 근태 기록은 나중에 정산의 근거가 되기 때문에, 작은 표시 하나가 시간이 지나 문제가 되기도 한다. 그때 가서 찾으면 훨씬 번거롭다. 매달 한 번, 어긋난 곳을 미리 잡아두는 것만으로 뒤가 편해진다.
그 뒤로는 매달 같은 방식으로 돌린다. 어떤 달은 도구가 한 건도 올리지 않고, 어떤 달은 두세 건을 올린다. 올라온 건을 열어보면 대부분은 이렇게 쓰다가 빠뜨린 사소한 표시이고, 가끔은 신청서를 늦게 낸 경우다. 어느 쪽이든 그 자리에서 바로잡으면 끝난다. 예전에는 이런 걸 찾으려고 스물다섯 장을 넘겼는데, 지금은 도구가 짚어준 자리만 확인한다. 대조라는 일이 없어진 게 아니라, 내가 눈을 둬야 할 곳이 달라졌다.
한 가지 덧붙이면, 이 방식은 근태에만 쓰이지 않는다. 매달 같은 두 문서를 서로 맞춰보는 일은 생각보다 많다. 발주 내역과 정산 내역, 계획과 실적, 신청과 승인. 형태만 다를 뿐 구조는 같다. 한쪽에 있는 항목이 다른 쪽에도 있는지, 그리고 종류와 조건까지 맞는지 확인하는 일이다. 나는 휴가 대조로 시작했지만, 이 도구를 만들고 나서 다른 대조도 같은 방식으로 볼 수 있겠다는 생각이 들었다. 실제로 그중 몇 가지는 뒤이어 도구로 만들었다.
시간이 준 것도 좋았지만, 나에게 더 크게 남은 건 따로 있었다. 대조를 끝내고 나면 어떤 건을 봤고 어떤 건이 어긋났는지가 화면에 남는다. 확인했다는 말이 아니라, 어떻게 확인했는지가 함께 남는다.
마감 업무는 결국 누군가에게 제대로 봤다는 걸 설명해야 하는 일이다. 예전에는 그 근거가 내 기억뿐이었다. 지금은 매달 같은 형태의 기록으로 남으니, 나중에 물어봐도 그 화면을 다시 열면 된다. 시간을 줄인 것보다 이쪽이 실무에서는 더 든든하다.
이 도구를 만들며 다시 확인한 게 있다. 자동화가 사람을 빼는 일이라고 생각하기 쉬운데, 내 경우는 반대였다. 도구는 사람이 지치는 부분을 대신했다. 스물다섯 건을 한 장씩 넘기며 짝을 찾는 일 말이다. 그리고 판단이라는 마지막 한 걸음은 사람에게 남겼다.
나는 개발자가 아니다. 그런데도 매달 쓰는 도구를 하나 더 완성했다. 파이썬이 문서를 이미지로 바꾸고, AI가 손글씨를 읽고, 규칙이 대조하고, 마지막은 사람이 본다. 대단한 기술을 쓴 게 아니라, 내가 매달 하던 일을 단계별로 나눠 각각 잘하는 쪽에 맡긴 것이다. 혹시 매달 반복되는 대조나 확인에 시간을 쓰고 있다면, 그 일을 통째로 없애려 하기보다 사람이 볼 곳을 좁히는 방향으로 한번 생각해보시면 좋겠다. 거기서부터 생각보다 많은 게 바뀐다.
이 글이 마음에 드셨다면, 작가 페이지에서 알림 설정과 좋아요를 부탁드립니다.
이 글은 AI의 도움을 받아 작성했습니다.
ⓒ요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.