AIXLOGIS 로고AIXLOGIS
개발 일지

(Python_backup tool) 사내 백업 툴, AI 초안 코드에서 실사용 프로그램으로 첫걸음을 떼기까지

#Python#tkinter#초기설계#백업자동화

개요

사내에서 반복적으로 수행하던 "로컬 폴더를 네트워크 저장소로 백업"하는 작업을 자동화하기 위해 데스크톱 프로그램을 처음부터 만들기 시작했습니다. 요구사항을 정리한 문서와 함께, 생성형 AI 도구로 뽑아본 초안 코드가 출발점이었습니다.

기술 선택 이유

  • 별도 설치 절차나 서버 인프라 없이 사내 PC에서 바로 실행할 수 있도록, 파이썬 표준 GUI 라이브러리인 tkinter 기반의 단일 실행 파일로 방향을 잡았습니다.
  • AI가 생성한 초안 코드는 기본적인 파일 복사 동작만 담당하는 수준이어서, 실제 업무에 투입하려면 여러 안전장치와 사용성 보완이 반드시 필요하다고 판단했습니다.

초안 대비 보완한 지점

| 항목 | 초안 코드 | 이번 구현 | |------|-----------|-----------| | 설정 저장 | 없음 (매번 재입력) | 접속 정보를 파일로 자동 저장·불러오기 (평문 저장 방지용 최소 난독화 적용) | | 네트워크 탐색 | 없음 (경로 직접 타이핑) | 트리 구조 탐색기 UI로 폴더를 찾아 선택 | | 진행률 | 파일 개수 기준 (부정확) | 바이트 단위로 쪼개 복사하며 실시간 퍼센트 갱신 | | 스레드 안전성 | 백그라운드 스레드에서 UI 직접 조작 (위험) | 큐를 통해 메인 스레드가 주기적으로 상태를 읽어가는 방식 | | 연결 관리 | 연결만 가능 | 연결·해제·재연결 + 타임아웃 처리 | | 디스크 여유 공간 | 확인 없음 | 복사 시작 전 대상 저장소 여유 공간 사전 확인 | | 오류 처리 | 단일 예외 처리 | 권한 오류·경로 오류 등 상황별 세분화 | | 로깅 | 없음 | 작업 로그를 파일과 화면에 동시 기록 | | 종료 처리 | 없음 | 작업 중 종료 시도 시 확인 팝업 + 안전한 연결 해제 |

핵심 아키텍처 결정

1. 단일 파일 구조

배포와 실행 편의성을 위해 여러 모듈로 쪼개지 않고 하나의 실행 파일로 구성하되, 내부적으로는 역할별 클래스(설정 관리, 연결 관리, 탐색 UI, 메인 앱)로 논리적으로 분리했습니다.

2. 큐 기반 UI 업데이트

tkinter는 UI를 단일 스레드에서만 안전하게 다룰 수 있는 구조라서, 백그라운드에서 파일을 복사하는 스레드가 UI 위젯을 직접 건드리면 예기치 않은 오류로 이어질 위험이 있습니다.

백그라운드_작업_스레드:
    복사 진행 → 진행_큐에 상태 메시지 push

메인_스레드 (일정 주기로 반복):
    진행_큐에서 메시지 꺼내기 → 있으면 진행바·라벨 갱신

이 패턴 덕분에 화면이 멈추지 않으면서도 진행 상황을 안전하게 반영할 수 있었습니다.

3. 청크 단위 복사

파일 전체를 한 번에 복사하는 대신 일정 크기 단위로 나누어 복사하면서, 지금까지 복사한 바이트 수를 기준으로 정확한 진행률을 계산할 수 있도록 했습니다.

4. 접속 정보 저장 방식

완전한 암호화 라이브러리를 도입하는 대신, 추가 의존성 없이 평문 저장만은 피하는 수준의 가벼운 난독화 방식을 채택했습니다. 보안 강도보다 "설치 없이 바로 쓸 수 있는 가벼움"을 우선한 결정이었습니다.

회고

  • AI가 생성한 초안은 좋은 출발점이 되어주지만, 실사용 앞에서는 예외 처리·스레드 안전성·사용성 같은 "제품화" 관련 요소를 별도로 채워 넣어야 한다는 걸 다시 확인했습니다.
  • 어떤 부분을 이번 버전에서 의도적으로 미완성으로 남겨둘지(취소 기능, 로그 패널 등)를 처음부터 기록해두니, 이후 버전에서 무엇을 우선 개선할지 판단하기가 훨씬 수월했습니다.
#Python#tkinter#초기설계#백업자동화

이슈와 관련된 다른 인사이트

DEV
개발 일지

(Python_backup tool) 종료 버튼을 눌렀는데 앱이 멈춘 것처럼 보이는 문제 해결하기

DEV
개발 일지

(Python_backup tool) 백업 툴에 '다운로드' 기능을 추가하며 배운 방향 독립적 설계

DEV
개발 일지

(Python_backup tool) 레거시 스크립트 기능을 메인 앱에 통합하기 — 해시 비교로 불필요한 덮어쓰기 막기