설치 없이 오프라인으로 도는 데스크탑 앱으로 전달하기

업무 자동화4분 읽기

잘 도는 자동화 스크립트를 만드는 것과, 그것을 개발 환경이 없는 사람에게 쥐여 주는 것은 전혀 다른 일입니다. 통계 담당자에게 "파이썬을 깔고 가상환경을 만든 다음 명령어를 치세요"라고 할 수는 없습니다. 데이터는 내부 망 밖으로 나가면 안 되니 웹 서비스로 올릴 수도 없었습니다. 무역통계 교차분석 자동화를 실제로 쓰이게 만든 것은 엔진만큼이나 이 전달 방식이었습니다. 설치가 필요 없는 오프라인 데스크탑 앱으로 묶은 과정을 정리합니다.

전달 방식이 자동화의 수명을 정한다

아무리 좋은 자동화도 실행 문턱이 높으면 안 쓰입니다. 매번 개발자를 불러야 돌아가는 도구는 결국 개발자의 일감으로 남고 정작 담당자는 예전 방식으로 되돌아갑니다. 그래서 목표를 분명히 했습니다. 통계 담당자가 개발자 없이, 인터넷 없이, 설치 없이, 더블클릭 한 번으로 돌릴 수 있어야 한다. 이 조건이 기술 선택을 거의 다 결정했습니다.

두 부류의 사용자를 함께 상정했습니다. 하나는 평소에 클릭으로 일하는 담당자이고 다른 하나는 나중에 이 작업을 예약이나 배치로 자동화하고 싶어 할 운영자입니다. 앞쪽에는 화면이 필요하고 뒤쪽에는 명령줄이 필요합니다. 그래서 같은 엔진 위에 화면과 명령줄 두 개의 입구를 나란히 얹었습니다.

클릭으로 쓰는 한글 화면

담당자용 화면은 PySide6로 만들었습니다. 입력 폴더와 출력 폴더를 찾기 버튼으로 고르고 실행 버튼을 누르면 처리가 시작됩니다. 여기서 신경 쓴 것은 "지금 뭐 하고 있는지"를 사람이 알 수 있게 하는 것이었습니다. 큰 엑셀을 읽는 동안 화면이 멈춘 것처럼 굳으면 사용자는 프로그램이 죽었다고 생각합니다. 그래서 무거운 처리는 화면과 분리된 별도 흐름에서 돌리고 진행률 바와 단계별 한글 로그로 지금 어느 단계인지를 실시간으로 보여 줍니다.

끝난 뒤의 동선도 챙겼습니다. 처리가 완료되면 결과 엑셀을 바로 열 수 있는 버튼이 뜨고 문제가 생기면 검은 콘솔 창에 알 수 없는 오류가 쏟아지는 대신 무슨 일이 났는지를 알려 주는 다이얼로그가 뜹니다. 오류에는 사람이 대응할 수 있게 코드와 안내 문구를 붙였습니다. 입력 폴더가 없을 때, 출력 폴더에 문제가 있을 때, 분석 중 오류가 났을 때를 구분해 각기 다른 안내를 보여 줍니다.

예약과 배치를 위한 명령줄

운영자용 명령줄은 같은 엔진을 다른 입구로 노출한 것입니다. 입력 폴더와 출력 폴더, 허용 오차를 옵션으로 받아 화면 없이 처리하고 성공과 실패를 종료 코드로 돌려줍니다. 종료 코드로 성공과 실패가 갈리므로 예약 작업이나 배치 스크립트에 연결해 "실패하면 알림"처럼 엮을 수 있습니다. 진행 로그도 그대로 파일로 남길 수 있어 사람이 안 보는 시간에 돌려도 나중에 무슨 일이 있었는지 확인됩니다.

화면과 명령줄을 각각 따로 만든 것이 아니라 하나의 엔진에 두 입구를 얹었다는 점이 중요합니다. 계산과 검증의 본체는 한 곳에 있고 GUI와 명령줄은 그 위에 씌운 껍데기입니다. 그래서 엔진을 고치면 두 입구에 동시에 반영되고 화면에서 확인한 결과와 배치로 돌린 결과가 어긋날 일이 없습니다.

단일 실행 파일로 묶기

마지막 관문은 배포였습니다. 파이썬과 여러 라이브러리에 의존하는 프로그램을, 아무것도 깔려 있지 않은 윈도우에서 그대로 돌게 만들어야 했습니다. PyInstaller로 코드와 의존성을 하나의 실행 파일로 묶어 받는 사람은 그 파일 하나만 있으면 되도록 했습니다. 파이썬 설치도, 라이브러리 설치도, 네트워크 연결도 필요 없습니다. 완전히 오프라인으로 도는 단일 실행 파일이라 데이터가 내부 환경을 벗어나지 않습니다.

전달 방식을 이렇게까지 신경 쓴 이유는 하나입니다. 자동화의 성패는 코드가 도느냐가 아니라 그 코드를 대상 사용자가 실제로 계속 쓰느냐에서 갈리기 때문입니다. 설치 문턱을 없애고 진행 상황을 보여 주고 오류를 사람 말로 안내하고 결과를 바로 열어 주는 이 작은 배려들이 모여야 자동화가 담당자의 손에 남습니다. 통계 담당자가 분기마다 개발자 없이 이 파일을 그대로 돌려 쓰고 있다는 것이 그 증거입니다.

이 앱이 실행하는 검증은 셀 단위 무오차 검증에서, 앱이 읽어 들이는 엑셀의 헤더 처리는 엑셀 헤더 자동 감지 설계에서 다룹니다. 전체 사례는 무역 통계 엑셀 교차분석 자동화에서 볼 수 있습니다.

자주 묻는 질문

왜 웹 서비스가 아니라 데스크탑 앱으로 만들었나요?

통계 원본 데이터가 내부 환경 밖으로 나가면 안 되는 성격이었기 때문입니다. 웹 서비스는 데이터를 서버로 올려야 하지만 오프라인 데스크탑 앱은 사용자의 컴퓨터 안에서만 처리하므로 데이터가 밖으로 나가지 않습니다. 설치 없이 더블클릭으로 쓸 수 있다는 점도 비개발자에게 맞았습니다.

GUI와 명령줄을 둘 다 만든 이유가 있나요?

사용자가 두 부류이기 때문입니다. 평소 클릭으로 일하는 담당자에게는 진행률을 보여 주는 화면이 맞고 예약 작업이나 배치로 자동화하려는 운영자에게는 종료 코드로 성공과 실패를 판별하는 명령줄이 맞습니다. 같은 엔진에 두 입구를 얹어 어느 쪽으로 돌려도 결과가 같습니다.

실행하려면 파이썬을 따로 설치해야 하나요?

아니요. PyInstaller로 코드와 의존성을 하나의 실행 파일로 묶었기 때문에 파이썬이나 라이브러리를 따로 깔 필요가 없습니다. 네트워크 연결도 요구하지 않으며 윈도우에서 그 파일 하나만 있으면 완전히 오프라인으로 돕니다.

#엑셀자동화#데스크탑앱#PyInstaller#PySide6

업무자동화 구축이 필요하신가요?

무료 상담 신청