Python

[python/development] project UniBox

2025.10.24
cate-weblab

Project UniBox — 반복 업무를 통합한 개인 업무 자동화 Desktop Tool

Project UniBox 로고

Project UniBox는 여러 업무 프로그램에서 반복적으로 필요했던 데이터 변환, 파일 배포, Database Backup, 주소록 추출, 검색용 데이터 생성 등의 작업을 한 곳에서 실행할 수 있도록 만든 Python 기반 개인 업무 자동화 Desktop Tool이다.

기존에는 기능마다 별도의 Python 환경이나 Script를 실행하고, Folder를 직접 찾거나 명령어를 입력해야 했다. UniBox에서는 이런 작업을 하나의 Application으로 통합해 버튼 클릭 또는 Drag & Drop만으로 처리하도록 구성했다.

현재는 주로 내가 실제 업무에 사용하고 있으며, 내가 업무를 수행하기 어려운 경우를 대비해 업무 Backup 담당자까지 총 2명이 동일한 Workflow로 사용할 수 있도록 구성했다.

프로젝트 개발 : 2025.10.23 ~ 2025.10.24 / 이후 실제 업무에 맞춰 지속 개선

Project Summary

Project개인 업무 자동화 및 운영 지원 통합 Desktop Tool
User실제 업무 담당자 + Backup 담당자 / 2인 사용
Role업무 분석 · 기획 · UI/UX · Architecture · Python 개발 · 배포 · 운영
ApplicationPython 3.11 · CustomTkinter · TkinterDnD2
DataPandas · openpyxl · BeautifulSoup · lxml
IntegrationExcel · HTML · File System · MariaDB · Outlook
DistributionPyInstaller 기반 Windows Application
Currentv7.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의 역할

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 구조를 모두 몰라도 동일한 결과를 만들 수 있도록 하는 것을 중요하게 생각했다.


현재 UI — v7.0

초기 Version에서는 몇 가지 Utility 기능을 한 화면에 모으는 수준으로 시작했지만, 실제 업무에서 사용하는 기능이 계속 추가되면서 좌측 Tab Navigation + 우측 작업 영역 + 하단 Status Bar 구조로 정리했다.

기능이 늘어나도 사용 방법은 크게 바뀌지 않도록 화면의 기본 구조를 유지했다.

① 업무 Tab 선택
        ↓
② File Drag & Drop
   또는 Folder 선택
        ↓
③ 실행
        ↓
④ 하단 Status Bar에서 결과 확인

현재는 업무 성격에 따라 여러 Tab으로 기능을 분리하고 있으며, 새로운 기능을 추가할 때도 같은 Layout과 Interaction을 유지하도록 구성했다.


Application Architecture

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를 여러 곳 수정하지 않도록 했다.


주요 기능 1 — Excel → 업무용 CSV 자동 변환

업무에서 사용하는 원본 Excel은 여러 Template과 구분별 Sheet로 나뉘어 있고, 별도의 언어 정보도 함께 관리되고 있었다.

다른 검사 프로그램에서 사용하려면 여러 Sheet의 데이터를 규칙에 맞게 합치고 일부 값을 보정해 하나의 CSV로 다시 생성해야 했다.

원본 Excel
 ├─ Template별 Sheet
 ├─ 구분별 Sheet
 └─ Language 정보

        ↓

UniBox
 ├─ 필요한 Sheet 자동 탐색
 ├─ Data 병합
 ├─ 업무 규칙에 따른 값 보정
 ├─ 제외 조건 처리
 └─ 정해진 순서로 Data 구성

        ↓

업무 / 검사 Tool용 CSV

기존에는 Excel의 여러 Sheet를 직접 확인하고 합쳐야 했지만, 현재는 UniBox에서 버튼을 실행하면 필요한 변환 규칙을 적용해 결과 File을 생성하도록 했다.

변환 결과는 다른 Tool이 File만 읽어 사용할 수 있도록 구성해, UniBox와 다른 프로그램이 서로의 Code에 직접 의존하지 않도록 했다.


주요 기능 2 — Drag & Drop 기반 Template File 배포

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이 이를 해석하는 방식으로 구성해 실수 가능성을 줄였다.

안전한 File Update

파일을 자동으로 덮어쓰는 기능이기 때문에 편리성보다 먼저 복구 가능성을 고려했다.

  • 기존 파일을 덮기 전에 #Bak 영역에 Timestamp를 붙여 Backup
  • 대상 Folder에 동일한 File이 이미 존재할 때만 교체
  • 잘못된 위치에 새로운 File을 자동 생성하지 않음
  • 처리 후 Copy / Skip / Error 상태 확인

자동화 과정에서 문제가 발생하더라도 이전 File을 확인하거나 되돌릴 수 있도록 해 실제 업무에서 사용할 수 있는 수준의 안전장치를 함께 두었다.


주요 기능 3 — Database Backup

직접 운영하거나 관리하는 여러 업무 시스템의 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를 실행하도록 구성했다.


주요 기능 4 — Outlook 주소록 Data 추출

사내 업무 프로그램에서 사용자와 담당자를 선택하기 위해 조직 구성원 정보를 사용하는 경우가 많다.

기존에는 Outlook의 주소록 정보를 별도로 확인하거나 Data를 다시 정리해야 했기 때문에, UniBox에서 Outlook Data를 읽어 업무용 CSV로 추출하는 기능을 추가했다.

Outlook Address Book
       ↓
Contact Data 읽기
       ↓
Name / Email / Phone
Department / Position 등 정리
       ↓
필요한 값 정규화
       ↓
CSV 생성
       ↓
다른 업무 System에서 사용

Windows Outlook과 연동하기 위해 pywin32를 사용했으며, 결과 File은 Excel에서도 바로 확인할 수 있는 형태로 저장했다.

주기적으로 갱신해야 하지만 작업 과정이 번거로워 미루기 쉬웠던 Data를 버튼 한 번으로 생성할 수 있게 만든 기능이다.


주요 기능 5 — HTML Manual → Search DB 생성

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를 통해 보다 자세한 원인을 확인할 수 있도록 역할을 분리했다.


UniBox에서 유지하는 개발 원칙

현재 실제 업무에서 자주 사용하는 Tool이다 보니 기능을 빠르게 추가하는 것보다 이후에도 안전하게 수정할 수 있도록 몇 가지 기준을 두고 관리하고 있다.

  1. 업무 규칙을 한 곳에서 관리
    서버 경로, Data Mapping, 변환 규칙, UI 설정처럼 여러 기능에서 사용하는 값은 가능한 한 공통 설정으로 관리한다.
  2. 파괴적인 작업은 먼저 Backup
    File을 덮어쓰는 기능은 기존 File을 먼저 보관한 뒤 작업한다.
  3. 없는 대상은 임의로 만들지 않기
    자동 배포 과정에서 예상하지 못한 경로에 새로운 File이 만들어지는 것을 막기 위해 기존 대상이 확인된 경우에만 반영한다.
  4. 작업 결과는 상태와 숫자로 확인
    성공 여부뿐 아니라 Copy, Skip, Error 등의 결과를 구분해 사용자가 처리 내용을 확인할 수 있도록 한다.
  5. UI와 업무 Logic 분리
    화면은 실제 Server Path나 Data 변환 규칙을 직접 알지 않도록 하고, 기능 Module이 이를 담당하도록 한다.

개발 환경

여러 외부 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 기본 기능을 우선 사용했다.


Windows Application 배포

실제 업무 PC에서 Python이나 개발 환경을 별도로 실행하지 않고 사용할 수 있도록 PyInstaller 기반 Windows Application으로 배포한다.

pyinstaller UniBox.spec

Image, Module, Utility File 등 실행에 필요한 Resource를 함께 Packaging하고, Application Version은 공통 설정에서 관리하도록 구성했다.


Project UniBox 결과

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이라는 점에서 의미가 있다.


Next

현재는 실제로 자주 사용하는 기능을 고객사·업무 성격별 Tab으로 나누어 관리하고 있다.

향후에는 Total 영역을 업무 Hub 형태로 확장해 자주 사용하는 프로그램과 Folder, 경로, 업무 관련 메모를 한 곳에서 관리할 수 있도록 확장하는 것을 검토하고 있다.

또한 Code에 포함되어 있는 환경별 설정과 접속 정보는 기능과 더욱 분리해, Application Logic과 운영 환경의 결합도를 낮추는 방향으로 계속 정리할 예정이다.


CustomTkinter : https://customtkinter.tomschimansky.com/

다른 프로젝트 보기 : Project 전체 보기

Python All