프로젝트별로 일을 한다는 말은 처음에는 탭과 자료를 묶는 뜻처럼 보일 수 있다. 하지만 한쪽에서 예약을 기다리며 다른 쪽에서 주피터를 실행하려면 이름만 나눈 폴더로는 부족하다. 나는 북극성의 프로젝트를 실제 실행의 경계로 다시 정리했다.

한 화면에 보인다고 같은 작업은 아니었다

브라우저 창은 하나여도 여러 프로젝트가 자기 탭에서 일을 계속할 수 있어야 했다. 지금 선택한 프로젝트를 전역 변수처럼 모든 실행이 사용하면 화면을 바꾼 순간 예약의 대상도 바뀔 수 있다. 사용자에게는 단순한 화면 전환이 프로그램에는 다른 작업의 환경 변경이 되는 것이다.

그래서 작업이 시작할 때 묶인 프로젝트·프로필·탭을 실행의 기준으로 유지하도록 했다. 현재 보이는 화면과 실행 cursor를 나눈 이유다. 사용자가 참고 자료를 보거나 다른 프로젝트로 이동해도 백그라운드 작업은 기록한 대상으로 이어진다. 실행 대상이 사라졌다면 다른 탭을 대신 쓰기보다 상태를 알려야 한다.

projectHost는 실제 호스트를 새로 만들지 않는다

projectHost는 하나의 BrowserHost를 감싸 실행 쪽에서 보는 workspaceId·profileId·activeTabId를 cursor에서 읽게 한다. 보이는 탭 목록도 해당 프로젝트로 좁힌다. 탭 생성이나 선택, 중지처럼 대상과 연결된 동작은 같은 범위를 검사한다. 프로젝트를 나누기 위해 브라우저 세션을 전부 복제하는 방식이 아니다.

현재 코드에는 상호작용 실행의 화면 선택과 백그라운드 선택을 구분하는 조건도 있다. 사용자가 보고 있는 프로젝트와 같은 경우의 상호작용만 실제 선택 화면을 바꿀 수 있다. 이 세부 조건 때문에 과거 설명을 그대로 현재 동작이라고 쓰지 않고 최신 파일을 다시 읽었다. cursor 분리의 원칙과 실제 표시 동작을 함께 대조했다.

코드와 환경도 프로젝트에 묶었다

탭만 나누고 Python이 같은 쓰기 환경을 쓰면 한쪽의 패키지 변경이나 커널 변수가 다른 업무에 영향을 줄 수 있다. 프로젝트에는 자기 venv와 로컬 패키지, Jupyter 커널과 노트북 자료를 둔다. 공통 설치 패키지를 읽어 쓸 수 있다는 것과 쓰기 가능한 환경·살아 있는 프로세스를 공유한다는 것은 다르다.

플러그인과 스킬도 등록 목록은 공통으로 찾되 프로젝트별 설정과 수정본을 유지한다. ProjectProgramLibrary는 처음 필요한 정의를 프로젝트 폴더로 가져오고 manifest가 이미 있으면 다른 프로젝트의 공통 수정으로 덮지 않는다. 프로그램을 재사용하는 것과 모든 프로젝트를 같은 수정 상태로 고정하는 것을 구분했다.

같은 프로젝트의 실행 순서와 다른 프로젝트의 동시성

예약에는 프로젝트별 차선을 두고 한 프로젝트의 준비와 실행이 겹치지 않게 한다. 반면 서로 다른 프로젝트는 각자 실행할 수 있다. 예약 ID별 메타데이터 갱신을 직렬화하는 잠금과 실제 프로그램 실행의 수명을 나눈 것도 중요했다. 모든 일을 하나의 큰 잠금 안에 넣으면 프로젝트를 나눠도 동시에 진행할 수 없다.

ProjectLanes는 소유자를 symbol로 기억하고 자기 소유권일 때만 해제한다. 실행 오류나 저장 실패가 나도 finally에서 해제할 수 있도록 호출부와 연결한다. 이 구조를 파일을 나눈 것만으로 구현됐다고 설명할 수는 없다. 대상·상태·자원·잠금의 실제 연결을 같이 읽어야 한다.

어떤 시험을 했는지도 실행 경계에 맞췄다

과거 프로젝트 분리 검증에서는 소유한 시험 환경의 두 프로젝트를 같은 시각에 실행하고 각 탭의 입력과 결과를 확인했다. 같은 이름 변수와 다른 Python prefix, 한쪽 커널을 멈춘 뒤 다른 작업이 계속되는지도 대조했다. 실제 사이트의 두 공개 게시 예약을 새로 성공시킨 시험과는 다르다.

이번 집필은 해당 보고서와 현재 코드를 다시 읽는 작업이다. 운영 계정이나 기존 커널을 일부러 중지하지 않았다. 과거 시험의 항목 수를 오늘 다시 실행한 수치로 쓰지 않는다. 실행 경계가 중요하다는 설명에는 왜 그 검사가 필요한지와 실제로 확인한 환경이 함께 있어야 한다.

회사 업무에 맞춘 작업실을 만들 때

여러 현장이나 브랜드, 담당 업무를 자동화한다면 먼저 무엇을 함께 쓰고 무엇을 분리할지 적어 볼 수 있다. 공통 기능을 매번 복제하지 않으면서도 입력과 결과, 수정한 프로그램과 실행 일정은 섞이지 않게 하는 것이다. 프로젝트라는 이름보다 실제 영향을 주고받는 자원의 연결이 기준이다.

계정 세션을 공유한다면 로그아웃과 외부 서비스 한도는 다른 프로젝트에도 영향을 줄 수 있다. 이 실행 분리를 컴퓨터 전체의 격리나 인증 시스템으로 소개하지 않는다. 다음 글에서는 바로 그 공유 경계를 더 좁혀 설명한다. 내가 만든 작업실의 목적은 서로 다른 일을 동시에 이어가면서도 어느 일이 어디에 속하는지 잃지 않는 것이었다.