기대던 서비스가 사라지면
거기 기댄 코드가 전부 드러납니다.
로그인을 맡기고 있던 외부 서비스가 어느 날 없어졌습니다. 하루 만에 직접 만든 로그인으로 갈아탔고, 7일 뒤에 미처 안 옮겨진 자리 둘을 찾았습니다. 갈아타는 것보다 다 갈아탔는지 아는 것이 어려웠습니다 — 그 기록입니다.
바꾸는 데 걸린 시간은 하루였습니다
지운 줄이 더한 줄보다 많습니다. 외부 서비스에 맞추느라 있던 코드가 그만큼이었다는 뜻입니다. 남의 규칙에 맞추는 부분이 통째로 없어졌습니다 — 직접 하니 오히려 짧아졌습니다. 물론 이 정도 규모에서 그렇다는 뜻입니다.
실제로 필요한 것은 「지금 로그인한 사람이 누구인지」를 위조할 수 없게 기록해두는 것 하나와, 그것을 서버가 매번 확인하는 것 하나였습니다. 그리고 들어가기·나가기·지금 누구인지, 셋. 그게 전부였습니다 — 처음부터 이렇게 만들 수 있었느냐는 다른 질문입니다.
문을 먼저 잠그고 자물쇠를 바꿨습니다
같은 날 한 두 가지 작업의 순서가 중요합니다. 먼저 로그인 없이는 아무것도 쓰거나 지울 수 없게 막았고, 그다음에 로그인 방식을 바꿨습니다.
반대로 했으면 그 사이에 아무나 들어올 수 있는 시간이 생깁니다. 기대던 서비스가 이미 죽어 있으니 「예전 잠금이 아직 걸려 있겠지」는 성립하지 않습니다 — 죽은 자물쇠는 잠근 것이 아닙니다.
갈아타는 일에서 가장 위험한 순간은 「옛것을 떼고 새것을 붙이기 전」입니다. 그 틈을 없애려면 먼저 막고 나서 바꿉니다.
7일 뒤에 옮겨지지 않은 둘을 찾았습니다
로그인 확인을 한 곳으로 모아뒀는데, 그 자리를 안 거치고 직접 물어보던 페이지 둘이 남았습니다. 이미 없어진 서비스에 「지금 누가 로그인했나」를 묻고, 아무 답도 없으니 이름 자리가 빈 채로 화면이 떴습니다.
그 페이지로 가는 링크가 어디에도 없었습니다. 들어갈 길이 없으니 쓰는 사람도 없고, 깨졌다고 말해줄 사람도 없었습니다. 아무도 안 가리키는 페이지는 조용히 깨진 채로 남습니다.
왜 7일이나 걸렸나 — 찾아볼 이유가 없었기 때문입니다. 오류가 뜨는 것도 아니고, 들어가는 사람도 없고, 확인하는 장치도 없었습니다. 결국 다른 일을 하다가 우연히 눈에 걸렸습니다.
「고쳤다」가 어디까지인지 적습니다
로그인 안 한 사람이 들어오면 로그인 화면으로 보내도록 한 줄을 넣었습니다. 확인해보니 절반만 막혔습니다.
그 튕김은 화면이 이미 뜬 다음에 일어납니다. 서버는 여전히 같은 내용을 그대로 내보내고 있습니다. 사람은 막혔고 기계는 안 막혔습니다.
서버에서 아예 막으려면 들어오는 요청을 하나하나 걸러야 하고, 그건 따로 판단이 필요한 일입니다. 그래서 「여기까지 했다」고 적어둡니다 — 어디까지인지 없이 「고쳤다」고만 적으면, 다음 사람은 다 막힌 줄 압니다.
갈아타는 것보다 다 갈아탔는지 아는 것이 어렵습니다
바꾸는 것 자체는 하루였습니다. 남은 자리를 찾는 데 7일이 걸렸고, 그것도 우연이었습니다. 차이는 «찾아낼 방법이 있었는가» 하나입니다.
기대던 것을 걷어낼 때 세 가지를 같이 하면 이 7일이 줄어듭니다 — 먼저 막고 나서 바꾸고, 옛 자리가 남았는지 세어보는 방법을 만들고, 아무도 안 가리키는 페이지를 목록으로 뽑아둡니다. 마지막이 제일 자주 빠집니다. 들어갈 길이 없는 페이지는 있다는 사실 자체를 잊어버리기 때문입니다.