마지막 셀에서 오류가 나면 전체 작업이 아무것도 하지 않은 것처럼 보일 수 있다. 하지만 앞선 셀은 자료를 만들거나 외부에 요청을 보냈을 수 있다. 나는 오류 문장만 남기기보다 그 앞의 출력과 셀 정보를 함께 보관하게 했다. 남아 있는 결과를 읽어야 어디까지 다시 해도 되는지 판단할 수 있기 때문이다.
성공 뒤에만 저장하는 흐름을 피한다
보관함의 run_notebook.py는 NotebookClient 실행을 try로 감싸고 finally에서 실행 문서를 저장한다. 성공했을 때만 끝에서 write하는 구조가 아니다. 실행 도중 예외가 나도 앞선 출력과 오류 셀이 남을 기회를 만든다. 성공 안내 문구도 이 저장 경로를 지난 뒤에 나온다.
다만 finally가 있다고 저장 자체의 성공이 보장되지는 않는다. 디스크 오류나 잘못된 목적지 때문에 쓰기가 실패할 수 있다. 파일이 실제로 남았는지 확인하는 일은 별도다. 나는 예외를 처리했다는 설명과 실행 기록이 보관됐다는 설명을 다른 결과로 남겨야 한다고 봤다.
작업실은 셀 단위로 출력의 소속을 맞춘다
내부 커널은 실행 요청의 메시지 ID와 같은 응답만 읽고 호스트는 현재 실행 셀 ID와 같은 출력을 받는다. 현재 셀을 시작할 때 그 셀의 출력만 비운다. 앞선 셀의 출력 전체를 새 실행과 함께 지우는 방식은 아니다. 오류가 나면 이후 셀을 계속 밀어 넣지 않고 해당 상태를 저장한다.
실행 중이 아닌 오래된 셀 응답을 지금 셀의 결과처럼 붙이지 않는 것도 중요하다. 출력이 있느냐보다 어느 실행 셀의 것인지가 먼저다. 나는 셀이라는 시각적 구분이 실제 실행 메시지와 연결돼야 작업자가 오류 위치를 믿을 수 있다고 생각했다. 번호만 예쁘게 나눈 화면으로는 부족했다.
오류와 조용한 실행을 같은 것으로 처리하지 않는다
커널의 execute는 출력이 잠시 없으면 살아 있는 프로세스인지 확인하고 기다린다. 조용히 계산하는 작업을 출력 부재만으로 완료나 실패로 바꾸지 않는다. 반대로 커널이 죽었으면 예외로 끝내 호스트가 영원히 바쁘게 남지 않도록 한다. done은 해당 실행의 idle 메시지에서 보낸다.
기존 단위 시험은 실제 execute 함수만 꺼내 메시지와 프로세스 생존 대역으로 이 조건을 확인한다. 이것은 전체 IPython 환경을 새로 띄운 시험과 다르다. 나는 작은 함수 시험이 확인한 기다림과 종료 판단을 설명하되 모든 장시간 계산의 실현장 검수로 넓히지 않는다.
남겨 둔 출력도 전체 원본 로그는 아니다
내부 표시 경로는 텍스트 길이와 이미지 크기, 셀의 출력 개수와 전체 저장 크기를 제한한다. 큰 출력이 끝까지 모두 남는다고 보장하지 않는다. 가져온 노트북의 HTML을 실행하는 대신 지원하는 텍스트와 PNG 자료로 읽는 경계도 있다. 출력 문서를 코드 실행 권한처럼 다루지 않는다.
이 선택은 화면과 파일을 감당할 수 있는 크기로 유지하지만 진단 자료가 일부일 수 있다는 비용이 있다. 마지막 숫자가 잘렸거나 원본 파일이 따로 있다면 그 자료를 더 읽어야 한다. 나는 저장됐다는 이유만으로 완전한 포렌식 로그가 마련됐다고 말하지 않는다. 화면 출력과 실제 산출물 확인은 다른 근거다.
원장과 출력은 서로를 대신하지 않는다
노트북에 성공 문장이 남아 있어도 항목 원장이 어떤 상태인지 따로 읽어야 한다. 반대로 원장에 runId가 남아 있어도 오류 셀의 맥락과 산출물을 읽는 일이 필요하다. 출력은 작업자가 계산과 예외를 이해하는 자료이고 원장은 항목의 실행 수명을 관리하는 자료다.
아래 파일 원장 모듈은 이 중 작은 상태 기록만 독립적으로 구현한다.24개 시험과 추출본 검사를 수행했지만 노트북 출력의 수집기는 아니다. 이번 글도 원래 앱의 셀을 새로 실행하지 않았다. 코드와 기존 근거를 대조하며 서로 다른 자료의 확인 범위를 분리해 남겼다.
오류 뒤에는 실행보다 읽을 통로가 먼저다
모든 셀을 다시 돌려야 결과를 볼 수 있다면 진단을 위해 업무를 재전송할 수 있다. 나는 오류 뒤에도 결과 셀이나 저장 문서를 따로 읽을 수 있어야 한다고 본다. 앞선 성공과 마지막 실패를 함께 봐야 다시 실행할 범위를 좁힐 수 있다.
회사 프로그램의 배치 처리도 마찬가지다. 한 항목이 실패했다고 이미 생성한 문서와 전송한 자료가 없어지지는 않는다. 오류 기록은 보기 싫은 부산물보다 다음 작업의 재료다. 앞선 출력을 보존하는 일은 실패를 숨기는 대신 남아 있는 사실에서 안전하게 이어가는 방법이었다.