첫 화면 20개를 보여준 뒤 사용자가 아래로 내립니다. 다음 20개를 무엇으로 가져올지가 이 절입니다. 시간순 목록이라면 이미 풀린 문제인데, 점수순에서는 그렇지 않습니다.
커서가 안전하다는 말의 조건
건너뛰기 방식은 목록이 변하면 항목이 밀려서 중복과 누락이 생깁니다. 그래서 보통 커서를 씁니다. 마지막으로 본 값을 들고 가서 그 이후를 읽는 방식입니다.
그런데 커서가 안전한 것은 정렬키가 변하지 않을 때입니다. 작성 시각으로 정렬하면 그 값은 절대 바뀌지 않습니다.
점수는 바뀝니다. 반응이 붙고 시간이 지나면 값이 달라집니다.
| 커서가 4.5 인 상태에서 | 결과 |
|---|---|
| 4.9 였던 글이 4.2 로 내려감 | 두 번째 장에 또 나온다 |
| 4.3 이던 글이 4.7 로 올라감 | 어느 장에도 안 나온다 |
중복과 누락이 동시에 생깁니다. 커서를 썼는데도 건너뛰기 방식의 문제가 그대로 돌아옵니다.
첫 조회의 순서를 붙들어 둔다
해결은 정렬키를 고치는 것이 아니라 목록을 고정하는 것입니다.
첫 조회에서 후보 수백 건의 순서를 정한다
그 순서를 저장하고, 다음 장은 그 목록에서 잘라 준다
이렇게 하면 사용자가 아래로 내리는 동안 순서가 흔들리지 않습니다. 커서는 그 저장된 목록 안의 위치를 가리키므로 안전합니다.
이 방식은 이미 앞 절에서 만든 것을 재사용합니다. 미리 만들어 둔 후보 목록이 곧 붙들어 둘 목록입니다.
붙들어 둔 목록은 짧게만 산다
목록을 오래 두면 낡은 피드를 계속 보게 됩니다. 사용자가 한 시간 뒤에 다시 내리면 한 시간 전 순서가 이어집니다.
| 목록 수명 | 결과 |
|---|---|
| 너무 짧다 | 스크롤 중에 목록이 사라져 순서가 흔들린다 |
| 너무 길다 | 새 글이 안 보인다 |
한 번의 세션 동안 유지될 만큼만 둡니다. 그리고 사용자가 처음으로 다시 올려 새로 고치면 목록을 버리고 다시 만듭니다. 그것이 사용자가 새 순서를 원한다는 신호입니다.
목록이 끝나면 어떻게 하나
붙들어 둔 후보가 수백 건이므로 사용자가 계속 내리면 끝에 닿습니다.
끝에 닿으면 그 시점 기준으로 다음 후보 묶음을 만든다
이때 이미 보여준 것을 제외해야 하는데, 그것이 다음 절의 문제입니다. 목록을 이어 붙일 때마다 이미 본 것과 겹칠 수 있고, 그것은 순서 문제가 아니라 기억의 문제입니다.