C.W.K.
Stream
Lesson 03 of 04 · published

Owner 둘, 그리고 Projection 하나

~11 min · scopes, privacy, computed-state, data-model

Level 0Open Gate
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"두 사람이 진짜로 가져. 세 번째 view 는 계산이야 — 편집 못 하는 계산은 엉뚱하게 샐 수가 없어."

scope 는 셋, 진짜는 둘

Keep 는 Family scope 로 열리고, Dad·Mom·Family 를 어떤 기저 기록도 건드리지 않고 오갈 수 있어. 근데 이 셋은 동등하지 않아. Dad 랑 Mom 은 writable owner — 각자 진짜로 편집 가능한 보유, seed 금액, stored cash 잔고를 가져. Family 는 projection 이야: 읽을 때마다 두 owner 포트폴리오에서 계산되고, 세 번째 writable 계정이 절대 아냐. 'Family 포트폴리오를 편집' 할 수 없어, 편집할 게 거기 없으니까 — store 가 아니라 합이야.

왜 projection 이 보이는 것보다 중요한가

Family 를 저장된 세 번째 계정 대신 계산되는 read-only view 로 만들면 버그 한 부류가 통째로 사라져: drift. Family 가 sync 맞춰야 하는 진짜 계정이면, Dad 나 Mom 보유를 편집할 때마다 Family 에도 맞물린 업데이트가 필요하고, 하나라도 놓치는 순간 총합이 거짓말을 해. Family 를 읽을 때 계산하면, 가족 view 는 언제나 정확히 부분들의 합이야 — 독립적 존재가 없으니 부분들과 어긋날 수가 없어.

계산할 수 있는 건 계산하고, 저장은 꼭 필요한 것만. 항상 다른 값들의 함수와 같아야 하는 값은 읽을 때 평가되는 그 함수 여야 해 — sync 맞추겠다고 약속한 복사본이 아니라. 계산 가능한 값의 모든 저장 복사본은 놓친 업데이트를 기다리는 미래의 불일치야.

프라이버시 경계 — 이게 조심스러운 부분

Keep 는 서로 다른 두 사람의 진짜 재정을 지키니까, scope 는 UI 편의가 아니라 기밀 경계야. Dad scope 를 보고 있을 때, Mom 의 상세 보유가 지금 활성 context 로 조용히 접혀 들어가면 안 돼. 그 규칙은 나중에 만날 Pippa Sidekick 까지 닿아: 한 scope 에서 Pippa 한테 질문하면, Pippa 가 읽는 포트폴리오 진실은 선택된 scope 지 조용히 넓혀진 전부가 아냐. Mom 의 데이터는 기술적으로 가능했다는 이유만으로 다른 context 로 넓혀지는 일이 절대 없어.

'기술적으로 가능' 은 '나타나도 됨' 이 아냐. 두 사람 데이터가 한 DB 에 산다고 어느 한쪽 데이터가 다른 쪽 view 나 context 에 떠도 되는 게 아냐. 기본은 좁은 scope 여야 하고, 넓히는 건 명시적이고 owner 가 동의한 행위여야 해 — 쿼리를 어떻게 썼느냐의 우연이 절대 아니라.
stored cash 가 권위 있어. owner 마다 ground truth 인 stored cash 잔고가 있어 — seed 빼기 cost 로 조용히 재구성 안 해. Track 3 얘기지만, owner 가 진짜 writable 이고 Family 가 아닌 이유가 이거야: 현금과 포지션은 지켜지고, 총합은 계산돼.

Code

Family 는 테이블이 아니라 함수 (예시 — 합성 숫자)·python
# Dad 랑 Mom 은 진짜 저장 row 를 가진 writable owner.
# Family 는 절대 저장 안 됨 — 읽을 때마다 재계산.
def family_total(as_of_date):
    dad = owner_total("dad", as_of_date)   # Dad 의 저장 row 를 읽음
    mom = owner_total("mom", as_of_date)   # Mom 의 저장 row 를 읽음
    return dad + mom                        # 기록이 아니라 projection

# `save_family_total()` 은 일부러 없어.
# view 엔 못 써. 그게 핵심이야:
# 합이 부분들과 어긋날 수가 없어.

External links

Exercise

'총합' 이나 '요약' 숫자를 쓴 시스템에서 정해봐: 그 숫자가 STORED(업데이트하는 컬럼)야 COMPUTED(읽을 때 계산)야? 저장이라면, 잊어버리면 거짓말하게 만드는 업데이트 하나를 짚어. 따로: 시스템이 둘 이상의 사람 데이터를 지키면, B 의 데이터를 A 의 view 로 새게 만드는 쿼리 실수 하나 — 그리고 그걸 막는 기본값을 써봐.
Hint
누수는 거의 악의가 아냐 — 잊어버린 WHERE 절이야. 유저 하나인 dev 에선 'SELECT 전부' 가 무해해 보여; owner 둘이면 기밀 유출이야. scope 는 호출자의 규율이 아니라 기본값에 있어야 해.

Progress

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

댓글 0

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

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