메뉴는 디스플레이 둘이라면서 셋을 나열했다
모니터를 개별로 켜고 끄는 작은 macOS 메뉴바 유틸리티가 있다. 어느 날 아침 머리글에는 “활성 디스플레이: 2”라고 적혀 있는데, 그 아래 메뉴에는 디스플레이 1·2·3, 세 항목이 나열돼 있었다. 실제로 쓰는 모니터는 두 대뿐이었다.
시스템에 직접 물어보다
가장 먼저 한 일은 앱의 화면을 그만 읽고 디스플레이 시스템 자체에 직접 물어보는 것이었다. 온라인이면서 활성 상태인 디스플레이는 ID 1과 3, 둘뿐이었다. 머리글은 맞았다. 목록이 틀렸다. 둘은 서로 다른 자리에서 값을 가져오고 있었다.
지금 세는 것과 기억으로 나열하는 것
머리글의 개수는 지금 이 순간의 디스플레이 상태를 계산한 값이었다. 반면 메뉴 목록은 저장된 이력에서 만들어지고 있었다 — 앱이 그동안 관찰한 모든 디스플레이 ID를 사용자 기본값에 계속 쌓아두고, 그 이력을 지금의 디스플레이 목록과 병합하는 구조였다. 이 설계는 디스플레이 ID가 하나의 모니터를 영구히 가리킨다고 가정하고 있었는데, 실제로는 그렇지 않았다. 디스플레이 시스템이 나눠주는 ID는 연결 순서와 세션에 따라 재할당될 수 있다. 그래서 지난주에 봤던 ID가 지금은 다른 모니터를 가리키거나, 아무것도 가리키지 않을 수 있었다. 유령처럼 남은 “Display 2”는 사실 지금 다른 ID로 잡혀 있는, 바로 눈앞에 있는 모니터의 옛 이름이었다.
고친 방식은 덜 기억하는 것이었다
수정 방향은 유령을 더 정교하게 걸러내는 게 아니라, 애초에 모든 것을 기억하지 않는 것이었다. 그동안 쌓인 전체 관찰 이력을 초기화하고, 저장하는 대상 자체를 바꿨다. 이제는 사용자가 “끄기 — 유지”로 직접 끈 화면만 재연결 후보로 보관한다. 그 후보가 다시 나타나면 디스플레이 ID나 제조사·모델·시리얼 번호 같은 하드웨어 식별값으로 자동으로 걸러낸다. 사용자 쪽에서는 케이블을 재연결하는 과정에서 화면 출력이 잠깐 어긋난 일이 있었는데, 그 재인식 과정에서 ID가 재할당됐을 가능성이 있다 — 다만 재연결 전 상태를 남겨두지 않아서 그 인과관계까지 확정하지는 못했다. 확실한 건 과거의 모든 ID를 무기한 들고 있던 설계가 문제였다는 점이다.