디지털 가든
한 성에 두 관인: 한 책상 위의 두 옥인, 딥링크 수령의 엇갈린 배달 사건, 그리고 동시라는 말에 이르는 유일한 협문
한 성에 살아 있는 부처 두 분을 모신다. 한 대의 PC에서 ZCode 인스턴스 둘을 돌리고, 각자 다른 계정으로, 각자의 할당량으로. 이 소박한 소망의 실현 가능성 심사는 이날 소스 입증에서 실주행의 넘어짐까지 전 과정을 걸어 마쳤다.
하나, 메커니즘 입증: 자격 증명은 서류장을 따른다
로컬 Electron 앱의 asar에서 파낸 증거 사슬은 완전하고도 격식이 있었다. 로그인 자격 증명은 데이터 디렉터리 안의 v2\credentials.json에 잠들어 있고, 한 파일은 현재 활성화된 단 하나의 계정만 기록한다. 데이터 루트 디렉터리는 환경 변수 ZCODE_DATA_BASE_DIR이 결정한다. 두 번째 인스턴스에게 다른 디렉터리를 가리켜 주면 그것은 백지 한 장이 되어 다른 계정을 맞이한다. 싱글 인스턴스 락은 Electron의 userData 디렉터리와 묶여 있으므로, ZCODE_DESKTOP_USER_DATA_DIR을 고치면 각자의 자물쇠가 각자의 문을 지킨다. 프로그램 전역을 뒤져도 하드코딩된 리스닝 포트는 하나도 없다. 두 인스턴스에게 다툴 항구가 존재하지 않는다. 메인 프로세스는 계산한 데이터 디렉터리를 일꾼 서브프로세스에게 능동적으로 넘긴다. 이 길은 공식 자신도 쓰는 대로이지 뒷길이 아니다.
둘, 엇갈린 배달 사건: 수령증이 잘못된 집으로
유일한 함정은 로그인의 마지막 한 걸음에 숨어 있었다. OAuth 흐름은 시스템 브라우저를 빌린다. 승인이 끝나면 브라우저는 zcode://oauth/callback으로 쫓겨나고, 레지스트리에는 ZCode.exe — “%1”이라 적혀 있다. 환경 변수 하나 없이. 그리하여 수령증이 새로 일으키는 프로세스는 기본 데이터 디렉터리, 곧 A의 집에 귀속된다. 실측은 이를 배신하지 않았다. 14:08에 B 인스턴스가 제 자격 증명을 다 써 놓았고, 14:10에 수령증이 A의 현행 로그인을 B로 밀어냈다. A의 화면에는 plan 자격이 떨어져 나간 것처럼 보였다. 그러나 실검 결과 자격 증명 본체는 한 항목도 잃지 않았다(두 개의 coding-plan 기록과 토큰 모두 재위). 떨어진 것은 지금 어느 카드를 쓰는가의 스위치뿐이다. 설정에서 돌려놓거나 다시 로그인하면 모두 회복된다. 브라우저를 바꾸는 것은 소용없다. 배달부는 바꿀 수 있어도 수취 주소는 관리 대장에 적혀 있다. 두 갈래 후로가 준비되었다. B에게 API 키를 직접 붙여넣게 한다(브라우저를 거치지 않음). 또는 서류 이사법으로 로그인 상태를 먼저 복사해 옮긴다. 가훈은 이렇게 정해졌다. A는 편하게 로그인하되, B는 함부로 로그인하지 마라.
셋, 전수 조사: 세 갈래 길에 동시로 통하는 것은 하나
공식 문서와 커뮤니티 도구를 찾아본 결과는 명쾌했다. 공식 네이티브 다중 계정은 설정 안에서 전환만 가능하며, 동시에 일하는 것은 언제나 한 계정이다. 커뮤니티 계정 스위처 역시 앱을 끄고 파일을 갈아끼우고 재시작해야 하니 본질은 교대 근무의 다른 이름이다. 동시라는 두 글자에 대해 공식에도 커뮤니티에도 현성품은 없었다. 이중 인스턴스만이 유일한 협문이며, 그 가장 어려운 고개인 B의 첫 브라우저 로그인은 이미 넘어졌다. 데이터의 물리적 분리는 철저하다. 두 벌의 디렉터리, 두 벌의 작업 공간, 두 벌의 작업고, 서로 상대의 존재를 모른다. 유일한 계율은 같은 프로젝트 폴더를 두 인스턴스가 동시에 고치지 않는 것.
넷, 협문의 경제학
이번 공사의 진짜 가치는 컴퓨터 한 대를 아낀 것이 아니라 한 가지 통치 형태를 확인한 데 있다. 분리는 디렉터리로 하지 프로토콜로 하지 않는다. 독립은 환경 변수로 하지 재시작으로 하지 않는다. 자격 증명이 파일에 살고 신분이 디렉터리에 사는 모든 시스템은 같은 방략으로 이 한 성 이불(一城二佛)의 격국을 복제할 수 있다. 그리고 그 메커니즘은 공식의 대로 그 자체이므로 업데이트로 쉽게 무효화되지 않는다.
댓글