AIXLOGIS 로고AIXLOGIS
개발 일지

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

#Python#아키텍처#리팩토링#DRY

개요

사내에서 쓰던 "로컬 → 네트워크 저장소" 백업 툴에, 반대 방향인 "네트워크 저장소 → 로컬"로 파일을 내려받는 복원 기능을 추가해달라는 요청이 들어왔습니다. 단순히 기능 하나를 더 붙이는 작업처럼 보였지만, 실제로는 기존 설계를 다시 들여다보는 계기가 되었습니다.

고민한 지점

새 기능을 붙이는 방법은 크게 두 가지였습니다.

  1. 다운로드 전용 복사 로직을 새로 작성한다 (백업 로직과 완전히 분리)
  2. 기존 복사 로직을 그대로 재사용하고, 인자로 들어오는 원본/대상 경로만 바꿔서 방향을 뒤집는다

첫 번째 방식은 당장 구현은 빠르지만, 이후 복사 로직에 버그 수정이나 개선이 필요할 때 두 곳을 매번 동일하게 고쳐야 하는 유지보수 부담이 생깁니다.

결정과 이유

다행히 기존 파일/폴더 복사 함수는 "원본 경로, 대상 경로" 두 값만 받아서 동작하도록 작성되어 있었고, 백업이냐 복원이냐라는 의미는 함수 내부에 전혀 포함되어 있지 않았습니다. 즉 함수 자체가 이미 "방향 무관(direction-agnostic)"하게 설계되어 있었던 것입니다.

공통_복사(원본, 대상, 충돌_정책):
    원본이 폴더면:
        하위 항목을 순회하며 재귀적으로 공통_복사 호출
    원본이 파일이면:
        충돌_정책에 따라 최종 대상 경로 결정 후 청크 단위로 복사

백업_실행():
    공통_복사(로컬_경로, 네트워크_경로, 정책)

다운로드_실행():
    공통_복사(네트워크_경로, 로컬_경로, 정책)

그래서 별도의 다운로드 전용 복사 함수를 새로 만들지 않고, 인자 순서만 바꿔 호출하는 방식으로 결정했습니다. 대신 아래 두 가지는 백업/다운로드를 구분해서 처리하도록 분리했습니다.

  • 진행 상태 메시지 타입: 완료/오류 이벤트를 백업 완료/백업 오류, 다운로드 완료/다운로드 오류로 구분해서, 사용자에게 보여지는 팝업 문구가 상황에 맞게 나가도록 했습니다.
  • 작업 중 플래그: 백업과 다운로드가 동시에 실행되지 않도록 하나의 "작업 진행 중" 플래그를 공유해서 막았습니다.

스레드와 UI 간 통신 방식(작업 큐를 통해 메인 스레드가 주기적으로 폴링하는 패턴) 역시 기존 백업 기능에서 쓰던 것을 그대로 재사용했습니다.

회고

  • 함수를 처음 설계할 때 "이 기능의 반대 방향 버전이 나중에 필요해질 수 있을까?"를 한 번쯤 생각해두면, 나중에 기능을 추가할 때 비용이 크게 줄어든다는 걸 체감했습니다.
  • 다만 이런 일반화는 미리 과도하게 준비하기보다는, 실제로 기존 로직이 "우연히" 방향 무관하게 짜여 있었기 때문에 자연스럽게 재사용할 수 있었던 케이스였습니다. 필요 이상으로 추상화를 미리 만들어두는 것과는 구분해서 접근하려 합니다.
#Python#아키텍처#리팩토링#DRY

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

DEV
개발 일지

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

DEV
개발 일지

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

DEV
개발 일지

(Python_backup tool) 자동 동기화 기능에 사용자 제어권 추가하기