"관찰되는 속성을 구현해. duration, time, pause, tracks, chapters, cache, errors."
그림자 상태의 유혹
엔진을 감쌀 때 뻔한 수는 네 변수를 두는 거야. var isPlaying, var currentTime, var duration. 명령 보낼 때 뒤집고, UI 를 거기 바인딩하고, 끝. 되긴 돼. 엔진이랑 네 그림자가 어긋나기 전까진. 근데 사용자가 엔진이 직접 처리하는 미디어 키로 정지해버리고, 파일이 저 혼자 끝나고, seek 이 네가 짐작한 것보다 짧은 duration 에 clamp 돼. 이제 네 변수는 이 말을 하는데 영상은 저 짓을 하고 있어. 거짓말하는 UI 만큼 사람 미치게 하는 버그도 없거든.
대신 엔진을 구독해
libmpv 는 더 나은 계약을 줘. 관찰되는 속성이야. 네가 신경 쓰는 값을 알려줘. time-pos, pause, duration, 트랙 목록, 챕터, cache, 에러. 그럼 엔진의 값이 실제로 바뀔 때마다 변경 이벤트를 밀어줘. 네 UI 는 네가 뒤집는 변수 뭉치이길 그만두고 엔진이 보고하는 것의 거울이 되고.
구독은 짧고, 신뢰의 방향을 뒤집어. 네 추측을 밀던 걸 그만두고 엔진의 사실을 받기 시작하는 거야.
왜 이게 어려운 모든 것으로 확장되나
패턴이 자리 잡으면 어려운 경우들이 쉬워져. 미디어 키? 엔진이 pause 를 바꿨고, 네가 관찰했고, UI 가 업데이트됐어. 키를 네가 라우팅할 필요도 없었지. 파일 끝? time-pos 가 멈추고 end 이벤트가 발화했고. seek 이 짧게 떨어졌어? time-pos 가 네가 요청한 데가 아니라 실제로 도착한 데를 보고해. 넌 reconciliation 코드를 아예 안 짜. 애초에 맞출 사본이 둘이 아니었으니까. 그게 그림자 대신 관찰하는 것의 조용한 초능력이야. 드리프트 버그가 살 자리 자체가 없어.