Comet5 블로그
개발·운영

반복 작업 자동화: dry-run·재실행·실패 기록 설계

Comet5 · 최초 발행 · 수정 · 약 3분

파일 정리 예제로 대상 확인, 변경 계획, 충돌 방지와 재실행 조건을 정합니다.

이 글의 목차

반복 작업을 자동화할 때 가장 먼저 만들 기능은 실행 버튼보다 변경 계획입니다. 파일 이름을 바꾸는 작은 스크립트도 대상이 잘못되면 많은 파일을 한꺼번에 바꿀 수 있습니다. 먼저 읽기 전용으로 무엇이 바뀔지 출력하는 흐름을 만듭니다.

계획과 실행 분리하기

다음 코드는 현재 폴더 아래 demo-files의 일반 파일을 찾아 계획만 출력합니다. 실제로 이름을 변경하지 않습니다. Python 3.11 이상을 기준으로 작성했습니다.

from pathlib import Path

root = Path("demo-files").resolve()
if not root.is_dir():
    raise SystemExit("demo-files 폴더를 먼저 준비하세요")

for source in sorted(root.glob("*.txt")):
    if not source.is_file() or source.is_symlink():
        continue
    target = source.with_name(source.stem.lower() + source.suffix)
    if source == target:
        continue
    print(f"계획: {source.name} -> {target.name}")

계획을 검토한 뒤에만 별도의 실행 단계를 만듭니다. 파일 시스템의 대소문자 구분 방식에 따라 동작이 달라질 수 있으므로 이 예제를 곧바로 운영용 이름 변경기로 사용하지 않습니다.

충돌과 재실행 조건

Report.txt와 report.txt처럼 변환 후 이름이 같아지는 입력을 고려합니다. 대상 이름이 이미 존재하면 덮어쓰기보다 중단하고 사용자에게 알려야 합니다. 실행 중 일부만 성공했을 때 다시 시작하면 어떤 파일을 건너뛰고 어떤 파일을 재처리할지도 정합니다.

실행 기록에는 원본, 대상, 처리 결과, 시각을 남기되 파일 내용이나 비밀 정보까지 로그에 복사하지 않습니다. 단순히 ‘완료’ 한 줄을 출력하면 어느 항목에서 실패했는지 알기 어렵습니다.

실패를 숨기지 않기

권한 오류, 경로 없음, 사용 중인 파일을 각각 재현해 봅니다. 모든 예외를 잡아 성공 코드로 끝내면 스케줄러는 실패를 알아채지 못합니다. 복구할 수 없는 오류에서는 실패 상태를 반환하고 처리된 범위를 보고합니다.

네트워크 자동화는 중복 전송과 속도 제한도 고려해야 합니다. 같은 요청을 반복해도 부작용이 중복되지 않는지 웹훅과 멱등성 설계를 참고할 수 있습니다.

자동화할 가치 판단하기

실행 빈도뿐 아니라 실패 영향과 유지 비용을 함께 봅니다. 한 번 할 작업에 큰 프레임워크를 도입하기보다 작은 계획 출력부터 시작할 수 있습니다. 자동화 후에는 사람이 하던 확인 단계 중 어떤 것이 코드로 옮겨졌고 무엇이 여전히 사람의 판단인지 적어 둡니다.

참고 자료