
Python


Project Handy는 업무 과정에서 반복적으로 발생하던 Excel 입력과 파일 관리 작업을 자동화하기 위해 개발한 Python 기반 Desktop Application이다.
기존 업무에서는 여러 Excel 파일과 실제 작업 폴더를 직접 확인하면서 데이터를 입력하고, 파일을 교체하고, 다시 결과를 확인하는 과정이 반복적으로 발생했다.
각 작업 자체는 복잡하지 않았지만 처리 대상이 많아질수록 누락이나 잘못된 입력이 발생할 가능성이 높았기 때문에, 반복적인 수작업을 하나의 프로그램으로 통합해 업무 오류를 줄이고 작업 절차를 표준화하는 것을 목표로 개발했다.
실제 배포 이후에는 업무 자동화뿐 아니라 작업 절차가 프로그램 안에 정리되어 있어 담당자가 변경될 때 인수인계가 쉬워졌다는 사용자 피드백도 받을 수 있었다.
| Project | Excel · File System 기반 업무 자동화 Desktop Application |
| Role | 업무 분석 · 기능 기획 · UI 설계 · Python 개발 · 배포 |
| Language | Python 3.11 |
| UI | CustomTkinter · TkinterDnD2 |
| Data | Excel · openpyxl · Pandas · xlwings · File System |
| Distribution | PyInstaller 기반 Windows 실행 파일 배포 |
| Result | 반복 입력 자동화 · 파일 백업 · 작업 History · 업무 절차 표준화 |
Project Handy를 개발하면서 가장 중요하게 생각한 것은 단순히 작업 속도를 높이는 것이 아니라, 사람이 반복적으로 판단하고 입력해야 하는 지점을 가능한 한 줄이는 것이었다.
기존에는 하나의 작업을 처리하기 위해 여러 Excel 파일과 실제 작업 폴더를 차례대로 확인해야 했다.
기존 업무
Excel 파일 확인
↓
필요한 데이터 검색
↓
실제 작업 폴더 이동
↓
파일 확인 및 교체
↓
여러 Excel 파일에 정보 입력
↓
작업 결과 확인
↓
변경 내역 수동 관리이 과정을 하나의 Application 안에서 처리하도록 통합했다.
Handy
사용자 입력
↓
Excel 데이터 검색
↓
실제 작업 경로 확인
↓
파일 처리
↓
관련 Excel 데이터 동시 수정
↓
원본 자동 백업
↓
작업 결과 및 History 기록사용자는 필요한 값과 파일만 선택하면 되고, 실제 데이터 검색과 파일 처리, Excel 수정, 백업 및 작업 이력 기록은 프로그램에서 연속적으로 처리하도록 구성했다.
D:\Python\python311\python -m venv vHandy python.exe -m pip install --upgrade pip pip install packaging pip install openpyxl pip install pandas pip install python-tkdnd pip install xlwings
Excel 데이터의 검색과 수정에는 openpyxl, Pandas, xlwings 등을 사용했고, 실제 작업 파일을 프로그램으로 Drag & Drop 할 수 있도록 TkinterDnD 관련 라이브러리를 함께 구성했다.
이전 Python 응용프로그램 테스트와 유지보수 작업에서는 주로 PyQt5를 사용했다.
PyQt Designer를 통해 UI를 구성할 수 있다는 장점이 있었지만, 작은 레이아웃을 조정할 때도 여러 속성을 반복적으로 수정해야 했고 원하는 화면을 빠르게 구성하기에는 다소 불편함을 느꼈다.
새 프로그램에서는 UI Framework를 다시 검토했고, Tkinter 기반이면서 다양한 Widget과 Dark Mode를 제공하는 CustomTkinter를 선택했다.
기존 Web UI 작업에서 Grid 기반 레이아웃을 많이 다뤄왔기 때문에 CustomTkinter의 grid 구조도 비교적 빠르게 적용할 수 있었다.
CustomTkinter : https://customtkinter.tomschimansky.com/

pip install customtkinter pip install CTkMessagebox pip install tkinterDnD2 pip install pillow
CTkMessagebox는 작업 성공 및 오류 등의 상태 메시지를 표시하는 데 사용했고, TkinterDnD2는 Drag & Drop 방식의 파일 입력 기능을 구현하는 데 사용했다.
프로그램의 시작점과 UI를 분리하고, 주요 업무 기능도 역할별 Manager로 나눠 관리할 수 있도록 구성했다.
main.py ↓ GUI ├─ TemplateManager ├─ UploadManager ├─ ModelManager └─ 기능별 Manager
main.py는 프로그램의 Entry Point 역할을 담당하며, CustomTkinter Window와 TkinterDnD 기능을 결합한 뒤 GUI 객체를 실행하도록 구성했다.
import customtkinter
from tkinterdnd2 import TkinterDnD
from gui import GUI
class Tk(customtkinter.CTk, TkinterDnD.DnDWrapper):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.TkdndVersion = TkinterDnD._require(self)
def main():
root = Tk()
app = GUI(root)
app.run()
if __name__ == "__main__":
main()gui.py에서는 기본 Window와 Tab Layout을 구성하고, 각 기능을 담당하는 Manager 객체를 연결했다.
class GUI:
def __init__(self, root):
customtkinter.set_appearance_mode("dark")
self.root = root
self.root.title("Handy - Template Management")
self.root.geometry("800x600")
self.root.iconbitmap(os.path.join(IMG_FOLDER, "icon.ico"))
self.root.grid_columnconfigure(1, weight=1)
self.root.grid_rowconfigure(0, weight=1)
self.setup_layout_frame()
select_tab(self.contents, self.tab_buttons, 0)
self.template_manager = TemplateManager()
self.setup_tab1()
self.upload_manager = UploadManager()
self.setup_tab2()
self.model_manager = ModelManager()
self.setup_tab3()
self.setup_tab4()하나의 파일에 모든 기능을 넣기보다는 UI와 기능 로직을 나누고, 각 Tab이 담당하는 업무도 Manager 단위로 분리해 이후 기능 수정과 유지보수를 쉽게 할 수 있도록 했다.
Excel 파일에서 필요한 데이터를 검색한 뒤 해당 데이터와 연결된 실제 작업 경로와 파일을 찾아 사용할 수 있도록 구현했다.
사용자가 여러 Excel 파일과 폴더를 직접 열어 원하는 값을 찾는 대신, 프로그램에서 필요한 데이터를 검색하고 관련 작업 위치까지 연결하도록 구성했다.
이미지 파일을 프로그램으로 Drag & Drop하면 지정된 실제 업무 폴더로 반영할 수 있도록 구현했다.
동일한 파일명이 이미 존재할 경우 기존 파일을 바로 덮어쓰지 않고, 기존 파일명에 현재 시간을 추가한 이름으로 자동 백업한 뒤 신규 파일을 반영하도록 처리했다.
신규 이미지 Drag & Drop
↓
대상 경로 확인
↓
동일 파일 존재 여부 확인
├─ 없음 → 신규 파일 저장
│
└─ 있음
↓
기존 파일 자동 Backup
↓
신규 파일 저장지정된 Excel Sheet를 찾아 필요한 값을 추가하거나 변경할 수 있도록 구현했다.
데이터를 변경할 때는 별도의 History Excel에 작업 내용을 기록하고, 프로그램 화면에서도 최근 수정 이력을 확인할 수 있도록 했다.
또한 원본 Excel 파일은 수정 전에 자동으로 백업해 잘못된 변경이 발생하더라도 이전 데이터를 확인하거나 복구할 수 있도록 했다.
하나의 업무를 처리하면서 여러 Excel 파일을 각각 수정해야 하는 반복 작업을 줄이기 위해, 한 번의 작업으로 최대 3개의 관련 Excel 파일에 필요한 값을 동시에 추가할 수 있도록 구성했다.
각 처리 단계는 Check 상태로 표시하고 완료된 작업은 History를 통해 확인할 수 있도록 했다. 또한 관련 Excel 파일을 프로그램에서 바로 열어 실제 수정 결과를 확인할 수 있도록 구성했다.
사용자 작업 실행
↓
Excel A 수정 ── 완료 Check
Excel B 수정 ── 완료 Check
Excel C 수정 ── 완료 Check
↓
History 기록
↓
각 원본 파일 직접 확인 가능실제 업무 파일을 자동으로 수정하는 프로그램이기 때문에 단순히 작업을 빠르게 처리하는 것보다 잘못된 작업이 발생했을 때 이전 상태를 확인할 수 있도록 만드는 것도 중요하게 생각했다.
이를 위해 파일과 Excel을 수정하기 전에 원본을 백업하고, 변경된 내용은 History로 기록하며, 처리 후에는 사용자가 실제 대상 파일을 직접 열어 결과를 확인할 수 있도록 했다.
자동화 + Backup + History + 결과 확인 → 실제 업무에서 사용할 수 있는 자동화 도구
개발 환경에서만 실행하는 Python 프로그램이 아니라 실제 사용자의 Windows PC에서 바로 실행할 수 있도록 PyInstaller를 이용해 실행 파일 형태로 패키징했다.
CustomTkinter와 TkinterDnD처럼 별도의 리소스가 필요한 라이브러리를 실행 파일에 포함하기 위해 PyInstaller .spec 파일을 별도로 구성했다.
# -*- mode: python ; coding: utf-8 -*-
VERSION = '0.0.1'
a = Analysis(
['app\\main.py'],
pathex=['D:\\Develop\\D_handy'],
binaries=[
(
r'D:\Develop\D_handy\vHandy\Lib\site-packages\tkdnd',
'tkdnd'
),
(
r'D:\Develop\D_handy\vHandy\Lib\site-packages\tkinterdnd2',
'tkinterdnd2'
)
],
datas=[
(
r'D:\Develop\D_handy\vHandy\Lib\site-packages\customtkinter',
'customtkinter/'
),
(r'img\*', 'img')
],
hiddenimports=['CTkMessagebox'],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.datas,
[],
name='Handy',
debug=False,
strip=False,
upx=True,
icon='img\\icon.ico',
console=False,
)



Project Handy는 CustomTkinter를 이용해 처음부터 직접 제작한 첫 실무용 Desktop Application이었다.
이전까지 Python은 주로 Web Application, 데이터 처리, Crawling, AI 관련 프로젝트 등에 활용했고 Desktop Application은 기존 프로그램의 유지보수 경험이 중심이었다.
Handy를 통해 실제 업무에서 사용할 프로그램을 직접 설계하고, UI 구성부터 Excel 및 File System 연동, 파일 처리, 데이터 수정, Backup, History 관리, Drag & Drop, 실행 파일 패키징까지 전체 과정을 구현할 수 있었다.
특히 반복적인 수작업을 자동화하는 것에 그치지 않고, 업무 처리 절차를 하나의 프로그램으로 통합하면서 작업 누락 가능성을 줄이고 업무 인수인계도 쉽게 만들 수 있다는 점을 실제 사용자 피드백을 통해 확인할 수 있었다.
Handy를 개발하면서 업무 자동화 프로그램에서 중요한 것은 기능의 개수보다 실제 사용자가 어떤 순서로 업무를 처리하고, 어느 과정에서 실수가 발생할 수 있는지를 먼저 이해하는 것이라는 점을 경험했다.
특히 Excel과 실제 File System을 함께 다루는 프로그램에서는 데이터를 자동으로 수정하는 기능만큼이나 Backup, History, 상태 표시, 결과 확인과 같은 안전장치가 중요했다.
또한 개발자가 이해하고 있는 업무 절차를 프로그램의 UI와 처리 흐름으로 옮기는 과정 자체가 업무 표준화가 될 수 있다는 점도 확인할 수 있었다.
Project Handy는 업무 분석 → 기능 기획 → UI 설계 → Desktop Application 개발 → 실제 업무 데이터 연동 → 배포 → 사용자 피드백까지 전체 과정을 직접 수행한 프로젝트라는 점에서 의미가 있다.
관련 프로젝트 : Project Luna — 매뉴얼 기반 AI 질의응답 시스템