
실리콘밸리에서 Staff Engineer 타이틀을 달고 일하며 가장 지겨운 것이 있다면, 그건 바로 '숫자 놀음'입니다. 경영진은 가용성(Availability) 99.999%라는 환상적인 숫자에 목을 매지만, 정작 엔지니어들은 그 숫자를 맞추기 위해 새벽 3시에 뜬 눈으로 PagerDuty 알람을 끄고 있죠. 그런데 재미있는 건, 시스템이 아무리 건강하게 돌아가고 있어도 사용자가 접근하려는 링크가 깨져 있다면 그 사용자에게 가용성은 정확히 '0%'라는 사실입니다. 오늘은 개발자들이 가장 사소하게 여기지만, 사용자 경험을 가장 비참하게 만드는 '링크 부패(Linkrot)'와 '404 페이지'에 대해 이야기해 보려 합니다.
개발자들의 성지라 불리는 GitHub조차 이 문제에서 자유롭지 않습니다. 냉정하게 말해, 링크 관리 측면에서 GitHub는 마이크로소프트와 함께 "웹 생태계 파괴자" 트로피를 두고 경쟁하는 수준입니다. 마이크로소프트가 취미 생활처럼 링크를 깨뜨린다면, GitHub는 자신들의 아키텍처적 특성, 즉 '사용자 콘텐츠의 잦은 변경'을 핑계로 링크 관리를 방치하고 있습니다.
여러분이 GitHub에서 코드를 보다가 404 Not Found 페이지를 마주친 적이 얼마나 많습니까? 그때 그 페이지가 여러분에게 어떤 도움을 주었나요? 대부분의 경우, 귀여운 마스코트가 등장하는 것 외에는 아무런 정보도 주지 않았을 겁니다. 이는 엔지니어링 관점에서 명백한 직무 유기입니다. 사용자가 "왜 이 페이지에 접근할 수 없는지", "내가 찾는 파일이 어디로 갔는지" 스스로 알아내기 위해 URL의 경로를 하나씩 지워가며 '탐정 놀이'를 하게 만드는 것은 시스템의 실패입니다.
제대로 된 엔지니어라면 404 페이지를 단순한 에러 화면이 아닌, 'RCA(Root Cause Analysis, 근본 원인 분석) 리포트'로 바라봐야 합니다. 사용자가 https://github.com/user/repo/blob/branch/path/file 형태의 URL에 접근했다가 실패했다고 가정해 봅시다. 시스템은 단순히 "없습니다"라고 말하고 끝낼 것이 아니라, 다음의 로직을 수행해야 합니다.
첫째, URL의 오타 여부입니다. blob을 splug로 잘못 썼다면, 이를 감지하고 수정 제안을 해야 합니다.
둘째, 파일의 이동 여부입니다. 파일이 현재 경로에는 없지만 과거에는 존재했습니까? Git 히스토리를 뒤져보면 알 수 있습니다. "이 파일은 3주 전 커밋에서 삭제되었습니다" 혹은 "다른 디렉터리로 이동되었습니다"라는 문구를 띄워주는 것이 기술적으로 불가능할까요? 아닙니다. 귀찮아서 안 하는 겁니다.
셋째, 리포지토리나 사용자의 이름 변경입니다. 리포지토리 이름이 바뀌었다면 301 Redirect를 태우거나, 최소한 "유사한 이름의 리포지토리 목록"이라도 보여줘야 합니다.
더 나아가, 404 페이지를 아예 띄우지 않는 것이 최선입니다. 파일이 src/libhttp/request.rs에서 src/libhttp/server/request.rs로 이동했다고 칩시다. 기존 링크로 접근한 사용자에게 404를 던지는 건 게으른 짓입니다. 시스템은 해당 파일이 이동했음을 인지하고, 303 See Other 등을 통해 새로운 위치로 사용자를 안내해야 합니다. 물론 이 과정에서 "파일이 이동되었습니다"라는 안내 메시지를 띄워주는 것은 필수적인 예의겠죠.
여기에는 Git이라는 도구의 철학적 한계도 존재합니다. Git은 본질적으로 영속성(Permanence)보다는 스냅샷과 현재 상태에 집중합니다. 브랜치(Branch)는 언제든 변할 수 있고, 링크는 그 가변적인 브랜치를 가리키는 경우가 많으니까요. 반면 Mercurial 같은 시스템은 내구성을 위해 설계되어, 한 번 생성된 변경 사항은 거의 영구적으로 남습니다. 하지만 우리가 Git을 쓰고 있는 이상, 도구 탓만 할 수는 없습니다. 데이터는 이미 우리 손에 있습니다. 문제는 그 데이터를 사용자에게 어떻게 보여주느냐는 '의지'의 차이입니다.
당신의 서비스에 있는 404 페이지를 점검해 보십시오. 단순히 "죄송합니다"라는 텍스트와 함께 메인 페이지로 가는 버튼만 덜렁 있다면, 당신은 사용자를 쫓아내고 있는 중입니다. "이전 페이지로 돌아가기" 같은 뻔한 버튼 대신, "당신이 찾는 정보가 여기로 이동했을 수 있습니다"라는 구체적인 제안을 내놓으세요.
제가 이렇게까지 링크 관리에 집착하는 이유는 간단합니다. 사용자가 스스로 문제를 해결할 수 있게 만들면, 그만큼 제가 새벽에 불려 나갈 일이 줄어들기 때문입니다. 친절한 404 페이지는 단순한 UX 개선이 아닙니다. 운영 비용을 줄이고, 여러분의 '삶의 가용성'을 지켜주는 가장 투박하지만 확실한 자동화 도구입니다. 죽도록 일하지 말고, 시스템이 여러분 대신 변명하게 만드세요. 그게 우리가 이 바닥에서 살아남는 법입니다.


