여러 프로젝트를 동시에 돌리면 시작보다 중지가 더 위험할 수 있다. 화면에서 보고 있는 곳과 뒤에서 실행 중인 곳이 다르기 때문이다. 기존 글에서 예약 대상을 고정하는 방법을 다뤘다면, 이번에는 하나를 멈추는 요청이 다른 업무의 탭과 커널까지 건드리지 않도록 자원의 소유 관계를 따라간다.

선택된 창 대신 프로젝트 커서를 따라간다

projectHost의 커서는 workspaceId·profileId·tabId를 갖는다. 같은 실제 BrowserHost를 쓰더라도 activeTab과 visibleTabs, memory는 그 커서를 기준으로 읽는다. 프로젝트 밖의 탭을 선택하거나 workspaceId를 바꾸려 하면 거절한다. 백그라운드 선택이 사용자가 보는 탭과 포커스를 빼앗지 않는 조건도 따로 있다.

이 경계는 로그인 자체를 모두 별도 프로세스로 격리했다는 뜻은 아니다. 같은 계정을 명시적으로 선택한 프로젝트는 로그인 세션을 공유할 수 있다. 업무 커서의 독립성과 계정 세션의 공유는 다른 설계 선택이다. 중지를 설명하면서 둘을 완전한 보안 샌드박스라는 말로 뭉뚱그리지 않았다.

페이지 중지도 소유 조건을 통과해야 한다

projectHost의 stopPages는 해당 workspace의 탭이면서 owner가 human이 아니고 contents가 살아 있는 경우에만 stop을 호출한다. 사용자가 직접 다루는 탭과 다른 프로젝트의 로딩까지 한꺼번에 멈추지 않는다. 현재 눈에 보이는 창 전체를 대상으로 브라우저 중지를 호출하는 방식과 차이가 있다.

여기서 contents.stop은 해당 페이지의 로딩을 멈추는 경로다. 다른 서버에서 이미 처리한 요청을 취소하거나 모든 종류의 Python 코드를 끝내는 함수가 아니다. 같은 중지 버튼 아래에서도 페이지·프로그램·커널은 서로 다른 자원이다. 하나의 함수가 전부 정리해 준다고 설명하는 대신 실제 연결을 확인했다.

프로그램 실행 번호와 노트북도 해당 runtime에 묶는다

현재 bootstrap은 프로젝트별 runtime에 controller·programRunner·notebook 등을 두고 비동기 문맥에서 current를 찾는다. 동적 접근기가 매번 눈앞의 전역 객체를 읽는 것과 다르게 해당 문맥의 실행기로 연결되는 구조다. 프로그램 중지 콜백도 현재 task ID가 그 프로그램에서 시작한 번호인지 확인한다.

화면 taskControl 경로는 workspaceTask와 프로필·프로젝트를 맞춘 뒤 controller를 멈추고 해당 notebook이 busy이면 interrupt한다. 이 검사를 빼면 화면 전환 직후 잘못된 커널을 끊을 수 있다. 모든 프로그램이 즉시 협력 중단한다는 보장보다 먼저 누구에게 중지 요청을 전달하는지 정확하게 만드는 선택이었다.

계속 돌아야 하는 쪽을 시험의 주인공으로 둔다

기존 project-isolation 시험은 두 프로젝트의 실제 Python 커널에 서로 다른 변수를 남긴다. A는 오래 기다리게 하고 B는 기다린 뒤 기존 변수와 함께 출력하게 한다. 두 실행을 시작한 다음 A에 stop을 보내고 B의 결과에 B continues=B가 남는지 확인한다.

중지한 A의 화면만 확인하는 시험보다 범위가 넓다. 건드리지 않아야 할 B가 이전 문맥을 유지한 채 끝났는지를 보기 때문이다. 이 시험은 소유한 Electron 프로필과 가짜 웹 응답을 쓰는 통합 시험이다. 실제 고객 계정이나 외부 서비스 작업 전체의 무간섭을 증명한 것은 아니다. 이번 집필에서 새 커널을 실행하거나 원래 작업을 멈추지는 않았다.

업무를 분리하려면 실패의 영향도 분리해야 한다

여러 프로젝트를 보여 주는 탭만 만들어서는 독립 실행이 완성되지 않는다. 실행기를 고르는 문맥, 탭을 멈추는 필터, 프로그램 번호와 커널 연결이 함께 맞아야 한다. 중지가 잘못 연결되면 평소에는 드러나지 않다가 가장 급한 순간에 다른 업무를 끊는다.

공유 차선 모듈은 실행 자리의 소유권과 오래된 완료의 거절을 살펴보는 독립 예제다. 커널이나 Electron을 다루지는 않는다. 실제 앱에 적용하려면 그 예제의 소유권을 각 자원까지 전달하고, 중지한 쪽과 계속할 쪽을 함께 검증해야 한다. 시작의 병렬성만큼 실패와 중지의 영향 범위도 제작자가 설명해야 할 기능으로 남겼다.