Foundry
URL 단축기 설계
심화
핵심

만료와 삭제, 그리고 하지 않은 것

쓴 키는 영구히 쓴 것으로 남긴다

마지막으로 링크의 끝을 정합니다. 만료와 삭제, 그리고 만료된 키를 다시 쓸 수 있는지입니다.

만료된 키를 재사용하면 안 된다

만료된 키를 재사용하면 예전에 공유된 링크가 새 목적지로 이동한다 키 abc1234 의 일생 A 사이트로 만료됨 B 사이트로 재발급 그런데 옛 링크는 게시글과 메시지에 그대로 남아 있다 A 를 기대한 사람이 B 로 간다 공간이 1퍼센트도 안 찼으므로 재사용할 이유가 없다 만료는 대응을 지우는 것이고 키를 비우는 것이 아니다 쓴 키는 영구히 쓴 것으로 남긴다 공간의 여유가 이 판단을 값싸게 만든다

키의 대응이 만료됐다고 그 키를 다시 발급하면, 예전에 공유된 링크가 새 목적지로 갑니다. 게시글과 메시지에 남아 있는 옛 링크를 우리가 회수할 방법이 없습니다.

A를 기대한 사람이 B로 가는 것은 단축 서비스에서 가장 나쁜 사고입니다. 남용 목적으로 일부러 만료된 인기 키를 노릴 수도 있습니다.

공간이 1퍼센트도 차지 않았으므로 재사용할 이유가 없습니다. 키 공간의 여유가 이 판단을 값싸게 만듭니다.

만료는 대응을 지우는 것이고 키를 비우는 것이 아니다
쓴 키는 영구히 쓴 것으로 남긴다

만료된 키에 무엇으로 답하나

대응이 없으므로 보낼 곳이 없습니다. 없는 키와 만료된 키를 구분할지를 정해야 합니다.

선택성질
둘 다 없다고 답한다단순하다. 사용자는 이유를 모른다
만료를 따로 알린다사용자에게 친절하다. 그 키가 있었다는 사실이 드러난다

만료 안내를 보여주려면 만료 기록을 남겨 둬야 하고, 그 기록도 저장 공간을 씁니다. 이 요구사항에서는 대부분의 링크가 만료 없이 영구이므로 만료 기록의 양이 적습니다. 그래서 구분해 알려도 됩니다.

영구 보관의 비용

기본이 영구 보관이므로 데이터가 계속 늘어납니다. 10년 에 누적 300억 개 이고, 그 뒤에도 멈추지 않습니다.

관점판단
지울 수 있나사용자가 삭제하지 않으면 지울 근거가 없다
조회되지 않는 것을 지울까언제 다시 열릴지 알 수 없다
어떻게 다루나오래되고 조회 없는 것은 값싼 저장소로 옮긴다

옮기는 것은 되지만 지우는 것은 안 됩니다. 링크가 죽으면 그것을 공유한 사람의 글이 깨집니다. 오래 살아 있는 것이 이 서비스의 신뢰입니다.

이 설계가 하지 않기로 한 것

후보결정과 근거
같은 주소에 같은 키 재사용하지 않는다. 쓰기마다 조회가 붙는다
6자 키하지 않는다. 사용률 절반이면 충돌이 잦아진다
해시 앞자리 방식하지 않는다. 재사용을 포기해 장점이 없다
영구 이동 응답하지 않는다. 조회 수와 만료가 동작하지 않는다
만료된 키 재사용하지 않는다. 옛 링크가 새 목적지로 간다
오래된 링크 삭제하지 않는다. 공유한 글이 깨진다

여섯 개 중 넷이 "하지 않는다" 입니다. 이 아키타입은 기능을 더하는 설계가 아니라 무엇을 하지 않을지 고르는 설계입니다. 그리고 각 결정의 근거가 앞에서 계산한 숫자에 있습니다.

면접에서 이렇게 나옵니다

Q.만료된 키를 다시 발급해도 되나요

안 됩니다. 예전에 공유된 링크가 새 목적지로 갑니다.

게시글과 메시지에 남아 있는 옛 링크를 우리가 회수할 방법이 없습니다. A를 기대한 사람이 B로 가는 것은 이 서비스에서 가장 나쁜 사고이고, 일부러 만료된 인기 키를 노리는 남용도 가능합니다.

만료는 대응을 지우는 것이고 키를 비우는 것이 아니다
쓴 키는 영구히 쓴 것으로 남긴다

키 공간이 1퍼센트도 차지 않았으므로 재사용할 이유가 없습니다. 공간의 여유가 이 판단을 값싸게 만듭니다.

흔한 실수: 공간을 아끼려고 재사용하는 것. 앞에서 계산한 사용률을 기억하면 아낄 필요가 없다는 것이 바로 나옵니다. 계산해 둔 값이 뒤의 판단을 쉽게 만드는 예입니다.

Q.만료된 키에 무엇으로 답하시겠습니까

만료를 따로 알립니다. 이 요구사항에서는 그 비용이 작습니다.

선택성질
둘 다 없다고 답한다단순하다. 사용자는 이유를 모른다
만료를 따로 알린다친절하다. 그 키가 있었다는 사실이 드러난다

만료 안내를 보여주려면 만료 기록을 남겨야 하고 그 기록도 공간을 씁니다. 그런데 대부분의 링크가 영구이므로 만료 기록의 양이 적습니다.

흔한 실수: 없는 키와 만료된 키를 구분하지 않고 넘어가는 것. 사용자 입장에서 두 상황은 다릅니다. "잘못된 주소" 와 "기간이 끝난 링크" 는 다음 행동이 다릅니다.

Q.오래되고 조회되지 않는 링크를 지워도 되나요

옮기는 것은 되지만 지우는 것은 안 됩니다.

관점판단
지울 근거가 있나사용자가 삭제하지 않으면 없다
조회가 없으니 괜찮나언제 다시 열릴지 알 수 없다
어떻게 다루나값싼 저장소로 옮긴다

링크가 죽으면 그것을 공유한 사람의 글이 깨집니다. 오래 살아 있는 것이 이 서비스의 신뢰입니다.

조회되지 않는 것을 값싼 저장소로 옮기면 비용은 줄이고 약속은 지킵니다.

흔한 실수: 조회 없음을 삭제 근거로 삼는 것. 몇 년 전 글에 있는 링크는 조회가 없다가 그 글이 다시 발견되면 열립니다. 조회가 없는 것과 필요 없는 것은 다릅니다.

Q.이 설계에서 하지 않기로 한 것들을 말해 주세요

여섯 개 중 넷이 "하지 않는다" 입니다.

후보근거
같은 주소에 같은 키 재사용쓰기마다 조회가 붙는다
6자 키사용률 절반이면 충돌이 잦다
해시 앞자리 방식재사용을 포기해 장점이 없다
영구 이동 응답조회 수와 만료가 동작하지 않는다
만료된 키 재사용옛 링크가 새 목적지로 간다
오래된 링크 삭제공유한 글이 깨진다

이 아키타입은 기능을 더하는 설계가 아니라 무엇을 하지 않을지 고르는 설계입니다. 그리고 각 근거가 앞에서 계산한 숫자에 있습니다.

흔한 실수: 단축기를 간단한 문제로 보는 것. 기능은 둘뿐이지만 판단은 여섯 개 이상이고, 각각이 다른 기능을 망칠 수 있습니다. 기능 수가 적은 것과 설계가 쉬운 것은 다릅니다.

먼저 스스로 답해보고 아래 답변과 견줘보세요. 막히는 부분은 문제로 확인할 수 있어요.

읽었으면 문제로 확인해보세요

URL 단축기 설계 문제를 풀면 틀린 문제가 자동으로 노트에 쌓입니다. 가입 없이 5문제를 먼저 풀어볼 수도 있어요.