← 뉴스레터

2026-08-01

배포 성공이라고 찍혔는데, 아무 데도 안 올라가 있었다

배포 명령이 성공으로 끝났다. 배포 후 라이브 검사도 통과했다. 그리고 실제 사이트는 한 글자도 안 바뀌어 있었다.

200이 증거가 아닌 사이트

검색에 걸릴 페이지 다섯 장을 새로 올리는 일이었다. 코드는 합쳐졌고, 남은 건 배포뿐이었다.

배포 전에 현재 상태를 봤다. 다섯 주소가 전부 200 이었다. 이미 올라가 있는 것처럼 보였다.

그런데 이 사이트는 앱으로 만들어져 있다. 앱은 주소를 못 찾으면 첫 화면을 대신 보여준다. 그래서 없는 주소도 200을 준다.

확인용으로 아무렇게나 지어낸 주소를 쳐봤다. /zzz-must-not-exist-9x7. 이것도 200이었다.

즉 이 사이트에서 상태 코드는 존재 증거가 아니다. 다섯 번씩 두드려서 스물다섯 번 다 200을 받아도 아무것도 증명되지 않는다. 오히려 여러 번 재서 다 통과하면 확신만 커진다.

판정을 내용으로 바꿨다. 각 페이지가 자기 자신을 가리키는 주소를 달고 있는지 본다. 실제로 배포된 페이지(/privacy)는 자기 주소를 달고 있었고, 새 다섯 장은 전부 첫 화면 주소를 달고 있었다. 안 올라가 있었던 것이다.

배포는 성공했다. 다른 자리에.

배포를 돌렸다. 빌드 통과, 업로드 완료, 배포 완료. 그리고 다시 재보니 여전히 첫 화면이 나왔다.

미리보기 주소로 열어봤다. 다섯 장이 전부 정상이었다. 사이트맵도 갱신돼 있었다.

빌드도 배포도 처음부터 옳았다. 착지한 자리가 틀렸을 뿐이다.

원인은 내 선택이었다. 로컬 폴더에 정체 모를 변경분이 있어서, 그걸 빌드에 섞지 않으려고 원본을 별도 폴더로 새로 받아 배포했다. 그 폴더는 브랜치에 붙어 있지 않은 상태였고, 배포 도구는 브랜치 이름을 읽지 못해 HEAD 라고 적었다. 운영 브랜치 이름이 아니니까 미리보기로 처리한 것이다.

배포 서비스 API로 직접 조회해서 확정했다. 최신 배포는 preview 환경, 운영 배포는 옛날 것 그대로.

그리고 검사기가 통과 도장을 찍었다

여기가 진짜 문제다.

배포 스크립트에는 배포 후 라이브를 검사하는 관문이 붙어 있다. 결제 페이지를 실제로 받아와서 이상이 없는지 본다. 이번에도 두 도메인 세 번씩 전부 통과했다.

그 페이지는 어제 배포분이 이미 정상이었기 때문이다.

검사기는 “이번 배포가 반영됐나”를 묻지 않는다. “도메인이 지금 멀쩡한가”를 묻는다. 두 질문은 다르다. 그래서 배포가 운영에 하나도 안 올라갔는데도 초록불이 나온다.

“배포 성공 + 검사 통과”만 보고 완료 보고를 했으면 그건 거짓 완료였다. 상태 코드가 아니라 내용을 봤기 때문에만 걸렸다.

수리는 운영 브랜치를 명시해서 다시 올리는 것이었다. 그 뒤에 다섯 주소를 다섯 번씩, 없는 주소를 대조군으로, 사이트맵 항목 수까지 세 조건을 동시에 확인하고서야 통과로 적었다.

배운 것

“검사가 통과했다”와 “내가 의도한 변경이 반영됐다”는 다른 문장이다. 검사기가 무엇을 묻고 있는지 모르면, 통과는 안심이 아니라 소음이다.

대조군 없는 초록은 초록이 아니다. 없는 주소가 어떻게 반응하는지를 같이 재지 않으면, 그 검사는 아무것도 구별하지 못하면서 통과만 시킨다.

그리고 재발 방지는 문장이 아니라 코드여야 한다. “다음부터 조심하자”는 아무것도 안 막는다. 배포 도구가 브랜치를 못 읽는 상태를 스스로 거절하게 만들거나, 배포 결과 번호를 운영 배포와 대조하게 만드는 쪽이 수리다.


성공이라고 찍힌 초록불 세 개가, 아무 데도 안 올라간 배포를 가리키고 있었다.

— 강대종 / @ssamssae