
Python


Project UniBox는 여러 업무 프로그램에서 반복적으로 필요했던 데이터 변환, 파일 배포, Database Backup, 주소록 추출, 검색용 데이터 생성 등의 작업을 한 곳에서 실행할 수 있도록 만든 Python 기반 개인 업무 자동화 Desktop Tool이다.
기존에는 기능마다 별도의 Python 환경이나 Script를 실행하고, Folder를 직접 찾거나 명령어를 입력해야 했다. UniBox에서는 이런 작업을 하나의 Application으로 통합해 버튼 클릭 또는 Drag & Drop만으로 처리하도록 구성했다.
현재는 주로 내가 실제 업무에 사용하고 있으며, 내가 업무를 수행하기 어려운 경우를 대비해 업무 Backup 담당자까지 총 2명이 동일한 Workflow로 사용할 수 있도록 구성했다.
프로젝트 개발 : 2025.10.23 ~ 2025.10.24 / 이후 실제 업무에 맞춰 지속 개선
| Project | 개인 업무 자동화 및 운영 지원 통합 Desktop Tool |
| User | 실제 업무 담당자 + Backup 담당자 / 2인 사용 |
| Role | 업무 분석 · 기획 · UI/UX · Architecture · Python 개발 · 배포 · 운영 |
| Application | Python 3.11 · CustomTkinter · TkinterDnD2 |
| Data | Pandas · openpyxl · BeautifulSoup · lxml |
| Integration | Excel · HTML · File System · MariaDB · Outlook |
| Distribution | PyInstaller 기반 Windows Application |
| Current | v7.0 · 현재 실제 업무에서 가장 자주 사용하는 내부 업무지원 Tool |
업무용 프로그램을 여러 개 운영하다 보니 각 프로그램에서 공통적으로 사용하거나 주기적으로 갱신해야 하는 데이터와 파일이 계속 생겼다.
예를 들어 Excel 원본을 다른 프로그램에서 사용할 CSV로 변환하거나, Outlook 주소록을 업무용 데이터로 추출하거나, Database를 Backup하거나, HTML 매뉴얼에서 검색용 데이터를 다시 생성하는 작업 등이 있었다.
이러한 기능들은 각각 복잡한 개발이 필요한 작업은 아니었지만, 작업을 할 때마다 해당 프로젝트의 가상환경이나 Script를 찾아 실행하고 경로와 명령을 다시 확인해야 했다.
기존 방식
업무 A
└─ 가상환경 실행 → Script 실행 → 결과 확인
업무 B
└─ 대상 Folder 이동 → File 수동 반영
업무 C
└─ Terminal 실행 → DB Backup Command 입력
업무 D
└─ Outlook Data 별도 추출
업무 E
└─ HTML Parsing Script 실행
↓
작은 작업인데도
매번 "어디서 어떻게 했지?"를 다시 확인하나씩 보면 짧은 작업이지만 반복될수록 귀찮음이 누적됐고, 결국 필요한 Data를 제때 갱신하지 않는 문제로도 이어졌다.
그래서 자주 사용하는 기능을 하나의 실행 파일 안으로 모아 업무를 처리하기 위해 개발 환경으로 다시 들어갈 필요가 없는 개인 업무용 Utility를 만들기로 했다.
UniBox는 하나의 특정 업무를 위한 프로그램이라기보다, 여러 업무 시스템 사이에서 반복적으로 필요한 작업을 모아놓은 개인 업무 운영 Hub에 가깝다.
Excel │ HTML │ File Server ├────→ UniBox ────→ 업무용 CSV Database │ → Template File 반영 Outlook │ → DB Backup │ → 주소록 CSV │ → Search DB │ 기존 업무 Tool
각 기능은 서로 다른 Data Source를 사용하지만, 사용자는 UniBox에서 해당 업무 Tab을 선택하고 필요한 파일이나 Folder만 지정하면 되도록 구성했다.
특히 내가 직접 사용할 때는 실행 단계를 최대한 줄이고, Backup 담당자가 사용할 때는 내부 경로나 Script 구조를 모두 몰라도 동일한 결과를 만들 수 있도록 하는 것을 중요하게 생각했다.
초기 Version에서는 몇 가지 Utility 기능을 한 화면에 모으는 수준으로 시작했지만, 실제 업무에서 사용하는 기능이 계속 추가되면서 좌측 Tab Navigation + 우측 작업 영역 + 하단 Status Bar 구조로 정리했다.




기능이 늘어나도 사용 방법은 크게 바뀌지 않도록 화면의 기본 구조를 유지했다.
① 업무 Tab 선택
↓
② File Drag & Drop
또는 Folder 선택
↓
③ 실행
↓
④ 하단 Status Bar에서 결과 확인현재는 업무 성격에 따라 여러 Tab으로 기능을 분리하고 있으며, 새로운 기능을 추가할 때도 같은 Layout과 Interaction을 유지하도록 구성했다.
UniBox는 여러 기능을 하나의 Application에 모으지만, UI와 실제 업무 Logic이 강하게 결합되지 않도록 역할을 나눠 구성했다.
UniBox main.py └─ Application Entry UI ├─ Layout ├─ Tab Navigation ├─ Drag & Drop └─ Status Message Feature Modules ├─ Excel / CSV 변환 ├─ Template File 반영 ├─ DB Backup ├─ Outlook Data 추출 └─ HTML Search DB 생성 Common ├─ Config ├─ File 처리 ├─ Message / Log └─ 공통 Utility External ├─ Excel ├─ File Server ├─ MariaDB ├─ Outlook └─ HTML Manual
기능별 Module은 실제 작업 Logic을 담당하고, UI는 Callback을 통해 필요한 기능을 실행하는 방식으로 구성했다.
서버 경로, 파일 Mapping, 변환 규칙, UI Color, Version과 같이 여러 기능에서 공통으로 사용하는 값은 가능한 한 설정 영역에서 관리해 업무 규칙이 변경될 때 실제 기능 Code를 여러 곳 수정하지 않도록 했다.
업무에서 사용하는 원본 Excel은 여러 Template과 구분별 Sheet로 나뉘어 있고, 별도의 언어 정보도 함께 관리되고 있었다.
다른 검사 프로그램에서 사용하려면 여러 Sheet의 데이터를 규칙에 맞게 합치고 일부 값을 보정해 하나의 CSV로 다시 생성해야 했다.
원본 Excel
├─ Template별 Sheet
├─ 구분별 Sheet
└─ Language 정보
↓
UniBox
├─ 필요한 Sheet 자동 탐색
├─ Data 병합
├─ 업무 규칙에 따른 값 보정
├─ 제외 조건 처리
└─ 정해진 순서로 Data 구성
↓
업무 / 검사 Tool용 CSV기존에는 Excel의 여러 Sheet를 직접 확인하고 합쳐야 했지만, 현재는 UniBox에서 버튼을 실행하면 필요한 변환 규칙을 적용해 결과 File을 생성하도록 했다.
변환 결과는 다른 Tool이 File만 읽어 사용할 수 있도록 구성해, UniBox와 다른 프로그램이 서로의 Code에 직접 의존하지 않도록 했다.
CSS나 JavaScript의 공통 내용을 수정하면 여러 Template Folder에 동일한 파일을 반영해야 하는 업무가 있다.
기존에는 사람이 대상 Folder를 하나씩 찾아 복사했기 때문에 일부 Folder를 빠뜨리거나 잘못된 위치에 파일을 넣을 가능성이 있었다.
UniBox에서는 File 자체에 포함된 주석 정보를 읽어 프로그램이 반영 대상을 판단하도록 했다.
CSS / JS Drag & Drop
↓
File 상단 Comment 확인
↓
배포 Group / 대상 / 방향 판단
↓
Matching Folder 탐색
↓
기존 File 존재 여부 확인
↓
Backup
↓
신규 File 반영
↓
Copy / Skip / Error 결과 표시사용자가 직접 여러 Folder를 선택하는 대신 File이 자신의 배포 정보를 가지고 있고 Application이 이를 해석하는 방식으로 구성해 실수 가능성을 줄였다.
파일을 자동으로 덮어쓰는 기능이기 때문에 편리성보다 먼저 복구 가능성을 고려했다.
#Bak 영역에 Timestamp를 붙여 Backup자동화 과정에서 문제가 발생하더라도 이전 File을 확인하거나 되돌릴 수 있도록 해 실제 업무에서 사용할 수 있는 수준의 안전장치를 함께 두었다.
직접 운영하거나 관리하는 여러 업무 시스템의 Database Backup도 UniBox에서 처리하도록 추가했다.
기존에는 Database별로 Terminal에서 Command를 실행해야 했지만, 현재는 저장 Folder를 지정하고 실행하면 필요한 Database를 순차적으로 Backup하도록 구성했다.
Backup Folder 선택
↓
DB Backup 시작
↓
Database A
↓
Database B
↓
Database C
↓
...
↓
각 처리 상태 표시
↓
SQL Backup File 저장특정 Database에서 문제가 발생하더라도 전체 작업을 바로 중단하는 대신 실패한 항목을 별도로 표시하고 이후 작업을 계속할 수 있도록 했다.
Terminal Window가 별도로 나타나 사용자 흐름을 방해하지 않도록 Desktop Application 안에서 Backup Process를 실행하도록 구성했다.
사내 업무 프로그램에서 사용자와 담당자를 선택하기 위해 조직 구성원 정보를 사용하는 경우가 많다.
기존에는 Outlook의 주소록 정보를 별도로 확인하거나 Data를 다시 정리해야 했기 때문에, UniBox에서 Outlook Data를 읽어 업무용 CSV로 추출하는 기능을 추가했다.
Outlook Address Book
↓
Contact Data 읽기
↓
Name / Email / Phone
Department / Position 등 정리
↓
필요한 값 정규화
↓
CSV 생성
↓
다른 업무 System에서 사용Windows Outlook과 연동하기 위해 pywin32를 사용했으며, 결과 File은 Excel에서도 바로 확인할 수 있는 형태로 저장했다.
주기적으로 갱신해야 하지만 작업 과정이 번거로워 미루기 쉬웠던 Data를 버튼 한 번으로 생성할 수 있게 만든 기능이다.
HTML 매뉴얼의 검색 기능에서 사용할 Database를 생성하는 기능도 UniBox에 통합했다.
하나의 매뉴얼은 수백 개의 HTML로 구성될 수 있기 때문에 검색용 Data를 사람이 직접 만드는 것은 현실적으로 어렵다.
HTML Manual Folder
↓
목차 정보 분석
↓
HTML File 순서 확인
↓
각 문서 Parsing
↓
Title / Sub Title / Body 추출
↓
Text 정규화
↓
검색용 Data 생성
↓
search_db.js 저장BeautifulSoup과 lxml을 이용해 HTML을 분석하고, 목차 구조에 따라 각 문서의 제목과 본문 정보를 추출해 검색용 Data를 자동 생성한다.
단순히 HTML의 Text만 가져오면 Inline Tag 경계에서 단어가 붙거나 문장부호 앞에 불필요한 공백이 생길 수 있어, 검색 결과에 사용할 수 있도록 Text를 정규화하는 처리도 함께 적용했다.
기존에는 특정 프로젝트에서 검색 DB가 정상적으로 생성되지 않는 문제를 해결하기 위해 별도 Script를 다시 수정해야 했지만, 현재는 UniBox에서 대상 Folder만 지정하면 생성하도록 통합했다.
UniBox는 여러 종류의 작업을 처리하기 때문에 작업 결과를 사용자가 빠르게 구분할 수 있도록 공통 Status 영역을 두었다.
OK └─ 정상 완료 INFO └─ 현재 진행 상황 WARNING └─ 확인이 필요한 결과 ERROR └─ 작업 실패 READY └─ 대기 상태
각 기능이 화면에 직접 Message를 작성하도록 하지 않고 공통 Message 처리 기능을 통해 동일한 방식으로 표시하도록 구성했다.
사용자에게는 필요한 결과만 간단하게 보여주고, 개발 중 문제를 확인할 때는 별도의 Log를 통해 보다 자세한 원인을 확인할 수 있도록 역할을 분리했다.
현재 실제 업무에서 자주 사용하는 Tool이다 보니 기능을 빠르게 추가하는 것보다 이후에도 안전하게 수정할 수 있도록 몇 가지 기준을 두고 관리하고 있다.
여러 외부 Data와 Windows Application을 함께 처리하기 때문에 기본 UI는 가벼운 CustomTkinter를 사용하고, 기능에 필요한 Library만 추가하는 방식으로 구성했다.
# Virtual Environment D:\Python\python311\python.exe -m venv vUniBox # UI pip install customtkinter pip install tkinterdnd2 pip install pillow # Excel / Data pip install openpyxl pip install pandas # HTML / XML pip install beautifulsoup4 pip install lxml # Windows / Outlook pip install pywin32 # Distribution pip install pyinstaller
표준 Library로 처리할 수 있는 File I/O나 Process 실행 등은 별도의 Package를 추가하지 않고 Python 기본 기능을 우선 사용했다.
실제 업무 PC에서 Python이나 개발 환경을 별도로 실행하지 않고 사용할 수 있도록 PyInstaller 기반 Windows Application으로 배포한다.
pyinstaller UniBox.spec
Image, Module, Utility File 등 실행에 필요한 Resource를 함께 Packaging하고, Application Version은 공통 설정에서 관리하도록 구성했다.
UniBox는 처음부터 모든 기능을 계획해 만든 프로그램이 아니라, 실제 업무를 하면서 반복적으로 불편했던 작업을 하나씩 통합하면서 성장한 Tool이다.
초기에는 단순한 Data 변환 Utility에 가까웠지만, 이후 File 배포, Backup, 주소록 추출, Database Backup, HTML Search Data 생성 등의 기능이 추가되면서 현재는 내 업무에서 반복적으로 필요한 작업을 한 곳에서 처리하는 개인 업무지원 Hub 역할을 하고 있다.
반복 작업 발견
↓
Script 작성
↓
UniBox 기능으로 통합
↓
실제 업무 사용
↓
불편한 부분 수정
↓
새로운 반복 업무 추가
↓
Version Update
↓
현재 v7.0기능별 Script를 매번 찾아 실행하는 대신 하나의 Application에서 동일한 방식으로 작업할 수 있게 되었고, 업무 규칙을 Program 안에 남기면서 내가 직접 작업하지 못하는 상황에서도 Backup 담당자가 같은 결과를 만들 수 있도록 했다.
특히 File Update처럼 잘못 처리했을 때 영향이 큰 작업은 자동 Backup과 대상 검증을 함께 적용해, 단순히 작업을 빠르게 만드는 것보다 반복 가능한 결과와 복구 가능한 Workflow를 만드는 데 중점을 두었다.
UniBox를 개발하면서 가장 크게 느낀 점은 업무 자동화가 반드시 큰 시스템이어야 할 필요는 없다는 것이었다.
몇 분짜리 작업이라도 일주일, 한 달, 몇 년 동안 반복되면 상당한 시간이 되고, 담당자가 기억하고 있는 규칙에 의존할수록 업무 실수와 인수인계 비용도 함께 증가한다.
따라서 UniBox에서는 사람이 기억하던 절차를 가능한 한 Code와 설정으로 이동시키고, 사용자는 무엇을 실행해야 하는지만 알면 되도록 만드는 방향으로 기능을 계속 개선했다.
또한 실제로 매일 사용하는 Tool을 직접 유지보수하면서, 기능을 추가할 때 현재 작업만 해결하는 것이 아니라 기존 기능에 어떤 영향을 주는지, Backup과 오류 처리는 충분한지, 다음에 다시 수정하기 쉬운 구조인지까지 함께 고려하게 되었다.
반복 업무 분석
↓
사람이 기억하던 Rule 확인
↓
자동화 가능한 기준으로 변환
↓
UI / Feature Module 구현
↓
Backup / Error Handling
↓
실제 업무 사용
↓
Feedback 및 지속 개선Project UniBox는 여러 업무에서 반복되던 작은 작업들을 하나의 Workflow로 통합하고, 실제 업무에서 지속적으로 사용하면서 개선해 온 개인 업무 자동화 Application이라는 점에서 의미가 있다.
현재는 실제로 자주 사용하는 기능을 고객사·업무 성격별 Tab으로 나누어 관리하고 있다.
향후에는 Total 영역을 업무 Hub 형태로 확장해 자주 사용하는 프로그램과 Folder, 경로, 업무 관련 메모를 한 곳에서 관리할 수 있도록 확장하는 것을 검토하고 있다.
또한 Code에 포함되어 있는 환경별 설정과 접속 정보는 기능과 더욱 분리해, Application Logic과 운영 환경의 결합도를 낮추는 방향으로 계속 정리할 예정이다.
CustomTkinter : https://customtkinter.tomschimansky.com/
다른 프로젝트 보기 : Project 전체 보기