본문 바로가기
C.W.K.
Stream
Lesson 04 of 04 · published

선반은 컨테이너가 아냐

~9 min · all-entries, projection, orthogonal-axes, no-tradeoff

Level 0식은 화로
0 XP0/35 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"All Entries 는 저널을 가로지르는 집계 projection 이야."

All Entries 는 가로질러 읽지, 소유하지 않아

조만간 어느 저널에 있든 전부를 한 번에 보고 싶어져. 그게 All Entries 고, 그게 뭔지 정확히 짚는 게 중요해. All Entries 는 저널을 가로지르는 집계 projection 이야. 모든 저널의 타임라인을 한 번에 훑어 읽는 단일 view 지. crumb 을 소유하는 슈퍼 저널이 아냐. crumb 은 여전히 각자의 저널에 속해. Daily, Quotes, Travel. All Entries 는 그냥 선반 전체를 훑어 병합된 스트림을 보여줘. 소유는 그대로, view 는 가로질러 뻗어.

이건 Log, Calendar, Map 에서 만난 '하나의 진실, 여러 view' 규칙을 저널 축에 쓴 거야. 각 저널은 crumb 창고의 한 칸이고, All Entries 는 칸을 무시하고 합집합을 읽는 projection 이야. 그게 crumb 을 소유하면, crumb 이 어느 저널에 사는지에 진실이 둘 생겨. crumb 자신의 journal_id 와 All Entries 의 주장. 그럼 어긋나. 순수 projection 으로 두면 '어느 저널이 이 crumb 을 소유해' 에 답이 딱 하나고, All Entries 는 절대 그걸 반박 안 해.

집계 view 는 소유자가 아니라 projection 이야. 칸으로 나뉜 데이터 위에 '전부 보기' view 를 더할 때, 그것들 위 컨테이너가 되기보다 칸을 가로질러 읽게 만들어. 소유하는 view 는 두 번째 진실이고, 비추는 view 는 그냥 렌즈야. crumb 은 각자 딱 하나의 집을 갖고, 모든 '가로지르는' view 는 보는 방식이지 물건이 사는 곳이 아냐.

짜임새와 열림은 맞바꿀 게 아냐

트랙 전체의 조용한 보상이 여기 있고, 선반을 더할 값어치가 있던 이유야. 대부분 시스템에선 더 짜임새 있게 되는 게 자유를 좀 포기하는 거야. 폴더가 많으면 울타리가 많고, 구조가 많으면 벽이 많지. Vesta 는 두 축이 서로 상관없어서 그 맞바꿈을 벗어나. 저널 축은 카테고리, 날짜 축은 시간. 서로 안 닿아. 그래서 한 축에서 최대로 짜임새 있게(저널을 원하는 만큼) 다른 축에서 최대로 열린 채(그 저널 하나하나가 양쪽으로 끝없이) 갈 수 있어. 카테고리 축의 구조가 시간 축에 아무 비용도 안 들어. 저널을 더하는 게 절대 타임라인에 끝을 안 놓으니까.

전체 모양을, 한 문장으로

트랙 전체를 합치면 이제 온전히 벌어낸 아빠의 표현이 나와. Vesta 는 무한 경계 journey 하나짜리 Waystone 이고, 선반은 그런 무한 타임라인 여럿이 나란한 것. 한 번에 하나씩, 또는 전부 한꺼번에 읽히는. 컨테이너는 시간 축에서 사라졌고 다신 안 밀수됐어. 컨테이너로 했을 짜임새는 대신 상관없는 카테고리 축에 살아. 그걸 가로지르는 projection 을 가진 칸들의 선반으로. 열려야 할 곳은 열리고, 도움 될 곳은 짜여 있고, 하나를 다른 것과 절대 안 맞바꿔.

Code

All Entries — 선반 위 projection, 아무것도 소유 안 함·typescript
// crumbs each have exactly ONE home (journal_id)
// All Entries reads ACROSS homes; it never owns

function allEntries(crumbs: Crumb[]): Crumb[] {
  return [...crumbs].sort(byTargetDateDesc); // union of every journal
}

function oneJournal(crumbs: Crumb[], jid: string): Crumb[] {
  return crumbs.filter(c => c.journal_id === jid); // a single partition
}

// two orthogonal axes, no tradeoff between them:
//   category axis: many journals   (as organized as you like)
//   time axis:     unbounded each  (as open as it ever was)
// adding a journal never puts an end on any timeline

External links

Exercise

짜임새를 얻는 게 열림을 치른 시스템을 찾아 봐. 폴더가 많아지니 경계가 뻣뻣해지고, 구조가 많아지니 벽이 많아진. 짜임새 축과 갇힌 축이 사실 같은 축이었는지, 아니면 서로 상관없게 만들 수 있었는지 물어봐. 한 축에서 짜임새 있고 다른 축에서 열린 채 남는 재설계를 스케치해 봐. 구조가 자유를 치르길 멈추게.
Hint
맞바꿈은 보통 같은 축에서 짜임새를 주고 가두는 데서 와. 카테고리이자 경계인 폴더. 그걸 쪼개. 짜임새를 카테고리 축에 놓고 다른 축(시간, 범위, 소속)을 열어 둬. 서로 상관없는 축이 둘 다 최대 강도로 갖게 해 줘.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.