Python

[python/development] project TemplateMate

2025.09.24
cate-weblab

Project TemplateMate — Template 파일 배포·백업·History 자동화 Desktop Application

Project TemplateMate 로고

Project TemplateMate는 Template에 사용되는 CSS와 JavaScript 파일의 수동 업데이트 과정에서 발생할 수 있는 실수를 줄이기 위해 개발한 Python 기반 배포 자동화 Desktop Application이다.

업로드할 파일 안에 미리 정의한 정보를 주석 형태로 기록해 두고, 사용자가 파일을 Drag & Drop하면 프로그램이 해당 값을 분석해 올바른 배포 경로를 자동으로 판단하고 파일을 업데이트하도록 구성했다.

파일을 교체하기 전 기존 Version은 자동으로 Backup하고, 변경 내용은 Excel History에 기록해 개발자가 아닌 사용자도 이후 변경 이력을 확인할 수 있도록 했다.

프로젝트 기간 : 2025.09.24 ~ 2025.09.26

Project Summary

ProjectTemplate 파일 배포 · Backup · History 자동화 Tool
Role업무 분석 · 기능 기획 · UI/UX · Python 개발 · 배포
LanguagePython 3.11
UICustomTkinter · TkinterDnD2
ProcessingFile Metadata 분석 · 배포 경로 자동 Mapping · File System 처리
Historyopenpyxl · Pandas 기반 Excel 변경 이력 관리
DistributionPyInstaller 기반 Windows Application
Result수동 배포 오류 감소 · 자동 Backup · 변경 이력 자동화 · 비개발자 사용성 개선

프로젝트 배경

기존에는 Template에서 사용하는 CSS와 JavaScript 파일을 수정한 뒤 담당자가 직접 대상 폴더를 확인하고, 올바른 위치에 파일을 복사해 업데이트해야 했다.

업데이트 대상이 여러 폴더로 나뉘어 있어 파일별 배포 위치를 정확히 알아야 했고, 기존 파일 Backup과 변경 내용 기록도 각각 수동으로 처리해야 했다.

기존 업무

수정 File 확인
      ↓
배포 대상 확인
      ↓
여러 Folder 중 올바른 위치 탐색
      ↓
기존 File 수동 Backup
      ↓
신규 File 복사
      ↓
변경 내용 별도 기록
      ↓
관련 사용자에게 History 전달

실제 작업자는 전체 구조를 알고 있기 때문에 처리할 수 있었지만, 업무를 대신 수행하는 사용자가 같은 작업을 하려면 각 파일의 배포 규칙과 Folder 구조까지 모두 알아야 했다.

따라서 단순히 파일 복사를 빠르게 만드는 것보다 사용자가 배포 규칙 자체를 알지 못해도 올바르게 처리할 수 있는 구조를 만드는 것을 목표로 했다.


개발 목표

TemplateMate에서는 사용자가 가능한 한 적은 정보를 입력하도록 하는 것을 중요한 설계 기준으로 잡았다.

기존처럼 Project, Folder, File 종류 등을 하나씩 선택하도록 만들 수도 있었지만, 선택 단계가 많아질수록 사용자가 배포 규칙을 알아야 하고 잘못된 값을 선택할 가능성도 증가한다.

목표

사용자가
"어디에 올려야 하는지"
알아야 하는 Tool
        ↓
        X

File 자체의 정보를 읽어
Program이 배포 위치를 판단
        ↓
        O

이를 위해 배포에 필요한 정보를 File 내부에 미리 정의하고, 프로그램이 해당 정보를 읽어 실제 처리 방법을 결정하도록 구성했다.


파일 자체를 이용한 자동 Routing

TemplateMate의 핵심은 업로드 대상 File에 포함된 주석 정보를 기준으로 배포 위치를 자동 결정하는 것이다.

업데이트가 필요한 파일에 배포 구분을 위한 값을 주석 형태로 미리 작성해 두고, 프로그램이 File을 읽은 뒤 해당 값과 일치하는 Folder를 찾아 자동으로 업데이트하도록 했다.

File Drag & Drop
       ↓
File 내부 Comment / Data 확인
       ↓
배포 Type 분석
       ↓
Matching Folder 탐색
       ↓
대상 경로 자동 결정
       ↓
기존 File Backup
       ↓
신규 File Update
       ↓
History 자동 기록

사용자가 대상 Folder를 하나씩 직접 선택하지 않아도 되기 때문에 작업 단계가 줄어들고, 잘못된 위치에 파일을 배포할 가능성도 함께 줄일 수 있었다.


사용성을 우선한 UI 설계

이전 업무 자동화 Tool을 제작하면서 화면에 많은 정보를 보여준다고 반드시 사용하기 편한 것은 아니라는 점을 경험했다.

TemplateMate에서는 실제 작업자가 아닌 사용자도 사용할 수 있다는 점을 고려해 필요한 선택과 입력을 최대한 제거하고 Drag & Drop 중심으로 Workflow를 단순화했다.

기존 방식

Project 선택
  +
Folder 선택
  +
File Type 선택
  +
대상 확인
  +
Upload
     ↓
선택 단계 증가


TemplateMate

File Drag & Drop
      ↓
Program이 자동 판단
      ↓
Backup + Update + History

사용자 선택 최소화

Automation의 목적을 단순히 작업 시간을 줄이는 것이 아니라, 사용자가 알아야 하는 업무 규칙 자체를 줄이는 것으로 잡았다.


개발 환경

실제 File System을 직접 처리해야 하기 때문에 Web Application이 아닌 Python 기반 Desktop Application으로 개발했다.

UI는 CustomTkinter, Drag & Drop에는 TkinterDnD2를 사용했으며, 변경 History를 Excel 형태로 관리하기 위해 openpyxl과 Pandas를 사용했다.

가상환경 및 Library

# Virtual Environment
D:\Python\python311\python.exe -m venv vTemplateMate

# UI
pip install customtkinter
pip install tk

# Distribution
pip install pyinstaller

# Image
pip install pillow

# Drag & Drop
pip install tkinterdnd2

# Excel History
pip install openpyxl
pip install pandas

자동 Backup

Template 파일을 자동으로 교체하는 만큼 잘못된 파일이 업로드되었을 때 이전 Version으로 되돌릴 수 있는 구조가 필요했다.

신규 파일을 반영하기 전에 기존 파일을 지정된 Backup Folder로 자동 이동하고, 파일명에는 실제 업로드 날짜와 시간을 추가하도록 했다.

신규 File Upload
      ↓
기존 File 존재 여부 확인
   ├─ 없음
   │    ↓
   │  신규 File Update
   │
   └─ 있음
        ↓
     #Bak Folder 생성 / 확인
        ↓
     기존 File Backup
        ↓
     파일명에 날짜 + 시간 추가
        ↓
     신규 File Update

같은 날 동일한 파일을 여러 번 수정·업로드할 수 있기 때문에 날짜뿐 아니라 초 단위까지 포함한 Timestamp를 사용해 Backup File의 이름이 중복되지 않도록 했다.

기존 파일명
template.css

Backup
template_20250924_143212.css
template_20250924_151045.css
template_20250924_151927.css

이를 통해 최신 파일만 유지하는 것이 아니라 변경 시점별 Version을 남겨 문제가 발생했을 때 이전 File을 확인할 수 있도록 했다.


변경 History 자동화

기존 업무에서는 파일을 수정한 뒤 변경 내용을 별도로 기록하고, 수정된 파일을 배포하는 과정이 각각 필요했다.

TemplateMate에서는 File Update가 발생하면 관련 내용을 지정된 Excel History에 자동 기록하도록 구성했다.

File Update
     ↓
History Data 생성
 ├─ Upload 시점
 ├─ 대상 File
 ├─ 배포 대상
 └─ 변경 관련 정보
     ↓
Excel History 자동 저장
     ↓
필요 시 다른 사용자와 공유

History 저장 형식은 별도의 Database나 개발자 전용 Log가 아니라 Excel을 선택했다.

이 기록을 확인하거나 전달받는 사용자가 개발자가 아닌 경우가 많았기 때문에 별도의 Tool 없이 열어볼 수 있고 필요한 경우 그대로 공유할 수 있는 형식이 실제 업무에는 더 적합하다고 판단했다.

이를 통해 파일을 수정한 뒤 변경 내용을 다시 수동으로 작성해야 했던 절차도 함께 줄일 수 있었다.


업무 Workflow의 변화

TemplateMate의 목적은 File Copy 자체를 자동화하는 것이 아니라, 기존 업데이트 업무에 포함되어 있던 여러 수동 단계를 하나의 Workflow로 통합하는 것이었다.

Before

수정 File 준비
     ↓
배포 Folder 확인
     ↓
기존 File Backup
     ↓
신규 File 복사
     ↓
변경 History 작성
     ↓
관련 사용자에게 전달


After

수정 File 준비
     ↓
TemplateMate에 Drag & Drop
     ↓
배포 위치 자동 판단
     ↓
기존 File 자동 Backup
     ↓
신규 File 자동 Update
     ↓
Excel History 자동 기록
     ↓
완료

실제 사용 이후에는 기존에 수정 내용 기록과 파일 배포를 따로 처리하던 과정이 줄어들어 편리해졌다는 Feedback을 받을 수 있었다.


개발 환경 확인

TemplateMate 개발 환경

Windows Application 배포

Python이나 Library 설치 없이 사용할 수 있도록 PyInstaller를 이용해 Windows Application 형태로 배포했다.

Spec File 생성

pyi-makespec --onefile --noconsole --icon=img/logo.ico main.py

Image와 Icon 같은 Resource가 실행 환경에서도 정상적으로 포함되도록 PyInstaller Spec File을 수정했다.

# -*- mode: python ; coding: utf-8 -*-
import os
import sys
def resource_path(relative_path):
    """PyInstaller / Development 환경의 Resource Path 반환"""
    if hasattr(sys, "_MEIPASS"):
        return os.path.join(
            sys._MEIPASS,
            relative_path
        )
    return os.path.join(
        os.path.abspath("."),
        relative_path
    )
a = Analysis(
    ['main.py'],
    pathex=[],
    binaries=[],
    datas=[
        ('img', 'img'),
    ],
    hiddenimports=[],
    hookspath=[],
    hooksconfig={},
    runtime_hooks=[],
    excludes=[],
    noarchive=False,
    optimize=0,
)
pyz = PYZ(a.pure)
exe = EXE(
    pyz,
    a.scripts,
    [],
    exclude_binaries=True,
    name='TemplateMate',
    debug=False,
    bootloader_ignore_signals=False,
    strip=False,
    upx=True,
    console=False,
    icon=['img\\logo.ico'],
)
coll = COLLECT(
    exe,
    a.binaries,
    a.datas,
    strip=False,
    upx=True,
    upx_exclude=[],
    name='TemplateMate',
)

Build

pyinstaller main.spec

PyInstaller로 Desktop Application을 배포할 때는 Python Code 자체뿐 아니라 Image, Icon 등의 Resource Path도 실행 환경에 맞게 처리해야 하기 때문에 Spec File을 통해 필요한 Resource를 함께 Packaging했다.


Project TemplateMate 결과

현재 Version에서는 한 종류의 Project에 대한 자동 업데이트 Workflow를 우선 구현했다.

사용자가 여러 항목을 직접 선택하지 않고 File을 Drag & Drop하면 프로그램이 File 내부의 정보를 기준으로 대상 Folder를 자동 판단하고, Backup → Update → History 기록까지 연속적으로 처리하도록 구성했다.

각 Upload 기록은 지정된 Excel File에 자동으로 저장해 이후 변경 이력을 확인할 수 있도록 했다.

기존 File은 지정된 #Bak 영역에 원래 경로 구조를 유지해 Backup하고, 업로드 날짜와 시간을 File Name에 추가해 동일한 날 여러 번 수정하더라도 각 Version을 구분할 수 있도록 했다.


후속 확장

초기 Version에서는 한 Project를 대상으로 Workflow를 먼저 검증했으며, 이후에는 Tab을 추가해 Project별로 서로 다른 배포 규칙을 적용할 수 있는 구조로 확장하는 것을 계획했다.

다만 첫 Version에서는 기능 범위를 넓히는 것보다 Drag & Drop → 자동 분류 → Backup → Update → History라는 핵심 Workflow를 안정적으로 만드는 것을 우선했다.


프로젝트를 통해 얻은 경험

TemplateMate에서 가장 중요한 개발 과제는 복잡한 기술 구현보다 사용자가 업무 규칙을 얼마나 적게 알아도 동일한 결과를 만들 수 있게 할 것인지를 설계하는 것이었다.

단순히 기존 수작업을 프로그램 화면으로 옮겼다면 사용자는 여전히 Project, Folder, File Type과 같은 여러 값을 직접 판단해야 했을 것이다.

대신 File 자체에 필요한 정보를 포함시키고 Application이 이를 해석하도록 하면서 사용자가 해야 할 판단을 시스템으로 이동시켰다.

수동 Update Process 분석
       ↓
사용자 실수 가능 지점 확인
       ↓
File Metadata 기반 Routing 설계
       ↓
Drag & Drop Workflow 구현
       ↓
대상 Folder 자동 결정
       ↓
기존 File 자동 Backup
       ↓
신규 File Update
       ↓
Excel History 자동 기록
       ↓
실제 사용자 배포 및 Feedback

또한 자동화에서는 작업 자체를 빠르게 만드는 것뿐 아니라 잘못된 작업에 대비한 Backup과 이후 확인을 위한 History를 함께 설계해야 실제 업무에서 안정적으로 사용할 수 있다는 점을 다시 확인할 수 있었다.

Project TemplateMate는 반복적인 파일 배포 업무를 분석하고, 사용자의 판단 단계까지 자동화하면서 Backup과 History를 함께 포함한 운영 Workflow로 전환한 프로젝트라는 점에서 의미가 있다.


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

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

Python All