
들어가며 · 이번 회차의 문제

코드를 서버에 올리기 전에 자동으로 한 번 확인해 주는 작은 검사 도구가 있습니다. 이 글에서는 그 도구가 엉뚱한 폴더를 검사 대상으로 착각하던 문제를 어떻게 찾아 고쳤는지 실제 수정 기록을 정리합니다.
결론부터 말하면, 명령어 안에 폴더를 옮기는 부분(cd)이 들어 있으면 도구가 그걸 따라가지 못해 처음 열려 있던 폴더를 기준으로 검사하고 있었습니다. 그래서 막아야 할 걸 통과시키고, 통과시켜도 될 걸 막는 일이 동시에 일어났습니다.
먼저, 이 검사 도구가 하는 일

용어를 하나만 풀어두겠습니다. 여기서 말하는 검사 도구는 코드를 원격 저장소에 올리는 순간 자동으로 실행되어 "이 올리기를 검토할지 말지"를 판단하는 프로그램입니다. 개발에서는 이런 자동 실행 프로그램을 흔히 훅(hook)이라고 부릅니다.
이 도구는 미리 정해둔 검토 대상 폴더 목록(화이트리스트)에 든 폴더에서 올리기가 일어날 때만 검토를 겁니다. 목록 밖의 폴더는 건드리지 않는 것이 원칙입니다. 문제는 "지금 올리려는 게 어느 폴더인가"를 판단하는 부분에서 시작됐습니다.
무엇을 확인했나 · 증상 두 가지
같은 원인에서 정반대 방향의 두 가지 증상이 나왔습니다.
- 막지 말아야 할 걸 막음(오탐): 관리 대상인 A 폴더가 열린 상태에서
cd 관리레포B && git push처럼 B 폴더로 옮겨 올리기를 했더니, 실제 대상은 B인데 도구가 A를 기준으로 검사해 차단했습니다. 실제로 control 세션에서 blog 올리기가 막힌 사례가 있었습니다. - 막아야 할 걸 통과시킴(누락): 반대로 관리 대상이 아닌 폴더가 열린 상태에서
cd 관리레포 && git push를 하면, 도구는 처음 열린 폴더가 비관리라고 보고 검토 없이 통과시켰습니다. 검토 규칙을 우회할 수 있는 구멍이었습니다.
원인 · '무엇을 볼지'는 맞았는데 '어디를 볼지'가 틀렸다
도구의 명령 해석기는 git -C <경로> 형태로 폴더를 직접 지정한 경우만 인식했습니다. 하지만 cd로 폴더를 옮긴 뒤 올리는 형태는 추적하지 못했습니다. 그 결과 판별 기준이 항상 처음 열려 있던 폴더로 고정됐습니다.
정리하면 이렇습니다.
| 명령 형태 | 도구가 본 폴더 | 실제 대상 폴더 | 결과 |
|---|---|---|---|
git -C 경로 push |
지정한 경로 | 지정한 경로 | 정상 |
A에서 cd B && git push |
A | B | 잘못 차단 |
비관리에서 cd 관리 && git push |
비관리 | 관리 | 검토 누락 |
검사할 규칙 자체는 맞았습니다. 다만 그 규칙을 어느 폴더에 적용할지를 정하는 입력이 틀려서, 오탐과 누락이 한꺼번에 생긴 것입니다.
어떻게 고쳤나 · 폴더 이동을 따라가게 만들기
핵심은 명령어를 조각(세그먼트) 단위로 읽으면서 cd와 pushd를 추적해, 올리기가 실제로 실행될 시점의 폴더를 다시 계산하는 것입니다. 처리 순서는 다음과 같습니다.
- 명령어를
&&같은 구분자로 조각냅니다. - 조각을 앞에서부터 읽으며
cd를 만나면 현재 폴더를 갱신합니다. 절대경로면 통째로 교체하고, 상대경로면 지금 폴더에 이어 붙입니다. cd와git -C가 함께 있으면,cd로 보정한 폴더 위에 다시-C경로를 적용합니다.- 이렇게 계산한 최종 폴더를 검토 대상 판별에 사용합니다.
가장 중요한 안전장치는 해석할 수 없는 이동은 억지로 추측하지 않는다는 규칙입니다. $VAR처럼 변수로 된 경로, ~(홈 폴더 기호), -(직전 폴더로 돌아가기), 경로 인자가 아예 없는 cd 등은 값을 비워두고 기존 동작(처음 열린 폴더 기준)으로 되돌립니다.
이 폴백 규칙에는 이유가 있습니다. 이 도구의 계약은 "검토 대상 목록 밖의 폴더는 절대 막지 않는다"입니다. 판단이 애매하다고 해서 '일단 더 넓게 막자'로 가면 이 계약이 깨집니다. 그래서 애매할 때는 막는 쪽이 아니라 원래 동작을 유지하는 쪽으로 폴백합니다.
전후 비교
| A에서 B로 이동 후 올리기 | A 기준으로 검사해 잘못 차단 | B를 대상으로 정확히 검토 |
| 비관리에서 관리로 이동 후 올리기 | 검토 없이 통과(우회 구멍) | 관리 폴더로 인식해 검토 |
| 변수·기호 등 해석 불가한 이동 | 처음 열린 폴더 기준 | 처음 열린 폴더 기준(그대로 유지) |
| 목록 밖 폴더 | 막지 않음 | 여전히 막지 않음(계약 유지) |
검증은 총 14가지 경우로 진행했습니다. 오탐 1건, 누락 4건, 기존 동작이 그대로인지 보는 회귀 6건, 폴백 2건, 목록 밖 폴더를 건드리지 않는지 확인하는 보호 1건입니다.
배운 점
이번 일에서 얻은 교훈은 한 문장으로 요약됩니다. 검사 도구가 '무엇을 검사할지' 규칙이 맞더라도, '어디를 보고 있는지'가 틀리면 오탐과 우회가 동시에 생긴다는 것입니다.
실행을 막는 종류의 도구는 명령어가 실제로 실행될 폴더를 최대한 똑같이 재현해야 합니다. 그리고 재현이 불가능한 입력을 만났을 때의 기본값은 '더 넓게 막기'가 아니라 '원래 동작 유지'여야 안전 계약이 유지됩니다. 이 원칙에 따라 이번 수정에서도 해석할 수 없는 이동 명령은 기존 동작으로 폴백하도록 처리했습니다.
'EP 빌드로그' 카테고리의 다른 글
| EP.38 AI 유튜브 채널 첫 3편 조회수 66배 차이, 무엇이 갈랐나 (0) | 2026.08.18 |
|---|---|
| EP.36 쇼츠 자막이 '움직이는 글자'로 바뀐 이유 — 정지 배경의 함정 EP.리팩터 (0) | 2026.08.16 |
| EP.35 매수할 때와 팔 때 정보를 한 줄로 잇기: 자동매매 기록 개선기 P0-C (0) | 2026.08.15 |
| EP.34 달러 자산 원화 환산, 왜 수익률과 따로 봐야 할까 (EP.P0-A) (0) | 2026.08.14 |
| EP.33 자동화 자동으로 이어지는 작업 흐름 재개 경로 만들기: 사람이 고친 글을 중복 없이 다시 태우기 (EP.자동화) (0) | 2026.08.13 |