정리했다고 생각한 순간
2026년 8월 1일, 흩어져 있던 프로젝트 폴더를 정리했습니다. 규칙은 단순했습니다. 웹앱은 ~/Documents/webApps 아래에, 인스타그램 게시 봇은 ~/Documents/publishBots/instagram 아래에 둡니다. 운세 웹앱도 ~/Documents/webApps/unse로 옮겼습니다.
폴더 이동은 코드를 고치는 작업처럼 느껴지지 않습니다. 파일 내용은 한 글자도 안 바뀌고, 에디터에서 열어 봐도 전부 그대로입니다. 그래서 정리가 끝났다고 여기기 쉽습니다.
그런데 게시 봇은 운세 웹앱과 떨어져 있는 프로그램이 아니었습니다. 봇 스크립트 세 개가 운세 웹앱 폴더를 경로로 직접 참조하고 있었습니다.
당신의 자동화 스크립트 중에서, 다른 프로젝트의 폴더 위치를 문자열로 박아 두고 있는 것은 몇 개입니까?
경로를 들고 있던 곳
커밋에 남은 변경은 이렇습니다.
generate.py의FORTUNE경로를~/Documents/webApps/unse로 수정insta_crosspost.py의UNSE_PUBLIC경로를 같은 위치로 수정post_daily.py의UNSE_PUBLIC경로를 같은 위치로 수정
diff로 보면 generate.py 2줄, insta_crosspost.py 4줄, post_daily.py 4줄이 바뀌었고 삭제된 줄은 모두 합쳐 5줄입니다. 같은 커밋에 assets/card_unse.html(45줄)과 assets/reel_unse.html(43줄) 템플릿도 새로 들어갔습니다.
변수 이름을 보면 의존 관계가 드러납니다. FORTUNE은 콘텐츠를 만드는 쪽이 운세 데이터를 가져오는 경로이고, UNSE_PUBLIC은 게시하는 쪽이 웹앱의 공개 폴더를 참조하는 경로입니다. 봇이 따로 설치된 앱처럼 보여도, 실제로는 다른 프로젝트의 디렉터리 구조에 기대고 있었습니다.
왜 이게 함정인가
이런 경로는 import 문과 달리 import 에러를 내지 않습니다. 문자열일 뿐이라서, 폴더를 옮기는 순간에는 아무 일도 일어나지 않습니다. 스크립트를 실제로 돌려서 그 경로를 읽는 순간에야 문제가 드러납니다.
정기 실행되는 봇이라면 그 순간은 폴더를 옮긴 순간이 아니라 다음 스케줄입니다. 정리 작업과 깨지는 시점이 떨어져 있으니, 원인을 이어 붙이기 어렵습니다.
당신이라면?
폴더를 옮긴 직후라면 한 번 멈춰서 생각해 볼 만합니다. 옮긴 폴더 이름으로 다른 프로젝트 전체를 검색하겠습니까, 아니면 다음 실행이 알려 줄 때까지 기다리겠습니까?
이번에 한 일
경로 참조를 새 위치로 바꾸는 것으로 끝냈습니다. 경로를 설정 파일이나 환경변수로 빼는 식의 구조 변경은 이 커밋에 없습니다. 바뀐 건 세 파일의 경로 문자열이 전부입니다.
값싼 수정은 맞습니다. 다만 진짜 비용은 수정이 아니라 '어디를 고쳐야 하는지 아는 것'에 있었습니다. 폴더를 옮긴 쪽(웹앱)과 고쳐야 하는 쪽(봇)이 서로 다른 프로젝트였기 때문입니다.
자가진단 체크리스트
- 폴더를 옮기기 전에, 그 폴더 이름으로 다른 프로젝트 전체를 검색해 보았습니까?
- 자동화 스크립트 안에
~/Documents/...같은 절대 경로 상수가 몇 개 있는지 알고 있습니까? - 경로를 참조하는 스크립트를 폴더 이동 직후에 한 번 직접 실행해 확인합니까?
솔직한 부분
이 커밋에는 경로를 고치기 전에 실제로 무엇이 깨졌는지가 적혀 있지 않습니다. 봇이 실패했는지, 실행되기 전에 제가 먼저 발견했는지 기록만으로는 알 수 없습니다. 이전 경로가 정확히 어디였는지도 커밋 메시지에는 없습니다. 같은 커밋에 들어간 HTML 템플릿 두 개가 경로 수정과 어떤 관계인지도 기록이 설명하지 않습니다. 그리고 경로는 여전히 코드 안에 직접 적혀 있어서, 다음에 폴더를 옮기면 같은 작업을 다시 해야 합니다.