Introduction & Requirements
친구가 여행 사진을 올렸습니다. 사용자는 친구의 프로필 주변에 새 스토리 표시가 생긴 것을 보고 화면을 누릅니다. 사진이 나타나고, 다음 영상이 재생됩니다. 잠시 뒤 앱을 닫았다가 다시 열면 아직 보지 않은 게시물부터 이어서 보고 싶습니다.
게시자는 다른 기대를 갖습니다. 업로드를 재시도해도 같은 사진이 두 번 올라가지 않아야 합니다. 친구에게만 공개한 영상이 다른 사람에게 전달되어서는 안 됩니다. 공개 시간이 끝났거나 직접 삭제했다면 새로운 시청 요청을 계속 허용해서도 안 됩니다.
Snapchat 공식 도움말은 My Story를 작성한 순서대로 재생되는 Snap의 모음으로 설명합니다. 일반적으로 친구는 24시간 동안 반복해서 볼 수 있으며, Snapchat+에서는 공개 시간이 더 짧거나 길 수 있습니다. 따라서 모든 Story가 예외 없이 24시간 뒤 사라진다고 일반화하면 실제 제품 동작을 충분히 설명하지 못합니다.
공개 범위에도 주의해야 합니다. 공식 안내에 따르면 게시 당시의 공개 범위 설정은 해당 Snap에 유지됩니다. 나중에 기본 설정을 바꾸는 것과 이미 게시한 Snap을 삭제하는 것은 다른 동작입니다. 친구 대상 My Story와 공개 My Story도 구분됩니다. Snapchat의 공개 범위 안내
이 글에서는 친구 스토리와 사용자가 구독한 공개 계정의 스토리를 다룹니다. 기본 공개 시간은 게시물마다 24시간으로 가정합니다. 구독하지 않은 계정을 추천하는 기능과 ML 기반 정렬은 제외합니다. 피드에서는 아직 보지 않은 작성자를 우선하고, 같은 그룹에서는 최근 게시 시각으로 정렬하는 규칙을 사용합니다. 이 정렬은 설명을 위한 설계이며 Snapchat의 현재 내부 정렬 알고리즘이라는 뜻은 아닙니다.
이하의 DB, 이벤트 구조, 캐시 정책, API와 수치는 공개된 제품 동작을 참고해 구성한 설계 가정입니다. Snapchat의 실제 Stories 내부 구현 전체를 재현한 문서가 아닙니다.
가장 단순한 구현은 친구 목록과 게시물 테이블을 조인하는 것입니다. 조회 시 삭제되지 않았고 만료되지 않은 게시물만 가져오면 됩니다. 미디어 파일은 Object Storage에 저장하고 앱에는 다운로드 주소를 전달합니다.
친구와 게시물이 적을 때는 이 방식으로 충분합니다. 사용자가 늘면 친구별 조회가 반복되고, 인기 계정의 미디어 요청이 집중되며, 삭제된 항목이 피드 캐시에 잠시 남는 문제가 생깁니다. 여러 기기에서 동시에 시청하면 읽음 상태도 맞춰야 합니다.
여기에서 특히 어려운 것은 서로 다른 속도로 갱신되는 상태를 관리하는 일입니다. 피드 목록은 조금 늦게 갱신되어도 되지만, 접근 허용 여부를 오래된 목록만 보고 결정해서는 안 됩니다. 파일 삭제 작업이 밀리더라도 만료된 게시물을 새로 내려주지 않아야 합니다.


