← 기술 백서 목록으로 돌아가기

초·중·고 컴퓨터실 40대 PC의 파이썬·주피터 환경 0초 배포: nLM의 경량 CPU 런타임 격리 및 학생 과제물 자동 백업 프로비저닝 아키텍처

"학교 컴퓨터실 40대 PC에서 인공지능과 파이썬 수업을 시작할 때마다 반복되는 고질적인 비극이 있습니다. 이전 수업 학생이나 타 프로그램이 설치한 파이썬으로 인한 PATH 환경 변수 꼬임, 윈도우 관리자 권한(UAC) 거부, 실수로 원본 교안 노트북을 덮어써 다른 반 학생의 실습 코드가 통째로 증발하는 사고입니다. nLM(Notebook Learning Machine)은 원터치 클릭 한 번으로 관리자 권한 없는 임베디드 Python+PyTorch(CPU)+JupyterLab 런타임을 사용자 로컬 영역에 완전 격리 배포하고, 학생 작업물 폴더(MyDocuments)는 절대 덮어쓰지 않으며 초기화 시 타임스탬프 기반 자동 백업을 수행하는 안전한 공교육 실습 인프라를 제공합니다."

1. 학교 컴퓨터실의 파이썬 실습 재앙: 환경 충돌, 권한 부족, 과제물 유실

AI 디지털교과서(AIDT) 도입과 정보 교과의 확대로 초·중·고교 및 국방 교육 현장에서 파이썬(Python)과 주피터 노트북(Jupyter Notebook/Lab)을 활용한 데이터 과학 실습은 필수 교과가 되었습니다. 그러나 40명 단위의 학생이 동시에 PC를 이용하는 학교 컴퓨터실 환경에서는 매 차시마다 다음과 같은 치명적인 인프라 병목이 발생합니다:

비교 항목 전통적 수동 설치 (Python/Anaconda) 클라우드 웹 노트북 (Colab 등) ZeliDesk nLM 온디바이스 프로비저너
배포 속도 PC당 20~40분 소요 (의존성 충돌) 즉시 접속 가능하나 로그인 필수 원클릭 0초 자동 배포 (패키지 검증 시 즉각 구동)
관리자 권한 (UAC) 시스템 전역 설치 시 관리자 권한 필수 불필요 Zero-UAC (사용자 로컬 AppData 격리로 권한 불필요)
보안 & 폐쇄망 오프라인 패키지 구성 복잡 인터넷 및 구글 계정 필수 (폐쇄망 불가) 100% 온디바이스 로컬 실행 (Air-Gap 완벽 지원)
학생 과제물 보호 기존 파일 덮어쓰기 위험 상존 개인 드라이브 저장 무파괴 원칙 & 타임스탬프 자동 백업 보장
프로세스 거버넌스 콘솔 창 방치 시 좀비 프로세스 잔류 서버 세션 관리 창 닫힘 시 Kill(entireProcessTree)로 0초 박멸

2. 핵심 아키텍처 1: 런타임(Runtime)과 작업공간(Workspace)의 엄격한 2단계 계층 분리

nLM의 핵심 설계 원칙은 "엔진(Python 런타임)과 데이터(학생 노트북)를 물리적으로 완전히 다른 디렉터리로 격리한다"는 것입니다. EduLabProvisioner.cs는 Model Hub에서 2종의 독립된 패키지를 내려받아 철저히 분리된 생명주기로 관리합니다.

C# — EduLabProvisioner.cs: 2단계 격리 경로 및 상태 진단
public static class EduLabProvisioner
{
    public const string ModelId = "edu-runtime";
    public const string EnvZipName = "python_env_edu.zip";
    public const string NotebooksZipName = "edu_notebooks.zip";

    // ① 실습 파이썬 환경 루트 (%LOCALAPPDATA%\ZeliDesk\edu\python_env)
    // 관리자 권한(UAC) 없이 학생 로컬 계정에서 자유롭게 읽기/쓰기 가능
    public static readonly string EnvDir = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
        "ZeliDesk", "edu", "python_env");

    // ② 학생 노트북 작업공간 (내 문서\ZeliDesk\edu\notebooks)
    // 학생이 코드를 작성하고 과제물을 영구 영속화하는 안전한 영역
    public static readonly string NotebooksDir = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
        "ZeliDesk", "edu", "notebooks");

    public static string PythonExe => Path.Combine(EnvDir, "python.exe");
    public static bool IsEnvInstalled => File.Exists(PythonExe);
    public static bool AreNotebooksInstalled =>
        Directory.Exists(NotebooksDir) &&
        Directory.GetFiles(NotebooksDir, "*.ipynb").Length > 0;
}

이와 같은 계층 분리를 통해, 설령 파이썬 런타임이 손상되어 재설치하더라도 MyDocuments에 보관된 학생의 실습 노트북은 단 1바이트도 영향을 받지 않습니다.

🛡️ PATH 하이재킹 방어: 프로세스 단위 환경 변수 우선 주입

학교 PC에 이미 설치되어 있던 이전 버전의 파이썬이나 Anaconda가 시스템 PATH에 등록되어 있을 경우, 주피터 커널이 엉뚱한 파이썬 인터프리터를 호출하여 충돌이 발생합니다.
nLM은 JupyterLab을 실행할 때 ProcessStartInfo.EnvironmentVariables["PATH"]의 최상단에 EnvDir\Scripts와 EnvDir을 강제 결합 주입함으로써, 시스템 환경 변수를 오염시키지 않으면서도 nLM 전용 독립 환경에서 완벽히 실행되도록 격리합니다.

3. 핵심 아키텍처 2: 학생 과제물 영구 보존 원칙 (Non-Destructive Workspace) & 자동 백업

수업 현장에서 가장 빈번한 참사는 교사가 실습 환경을 재정비하거나 다음 반 수업을 준비하기 위해 초기화를 누를 때 이전 반 학생들의 작업물이 덮어씌워져 날아가는 것입니다. nLM은 '무파괴 작업공간 거버넌스(Non-Destructive Workspace Governance)'를 통해 이를 원천 차단합니다.

C# — EduLabProvisioner.cs: 타임스탬프 원자적 백업 및 무파괴 전개
public static async Task EnsureNotebooksAsync(bool resetWithBackup,
                                              Action<string> status, CancellationToken ct)
{
    // 이미 노트북이 존재하면 일반 준비 단계에서는 절대 덮어쓰지 않고 즉시 반환
    if (AreNotebooksInstalled)
    {
        if (!resetWithBackup) return; // 기존 학생 작업물 완벽 보존

        // 초기화(Reset) 요청 시: 기존 폴더를 타임스탬프 백업 폴더로 원자적 이동
        string backup = NotebooksDir + "_backup_" + DateTime.Now.ToString("yyyyMMdd_HHmmss");
        Directory.Move(NotebooksDir, backup);
        status?.Invoke($"기존 노트북을 백업했습니다: {backup}");
    }

    // 초기 상태이거나 백업 완료 후에만 원본 101~105 교안 노트북 새로 전개
    Directory.CreateDirectory(Path.GetDirectoryName(NotebooksDir));
    await DownloadAndExtractAsync(NotebooksZipName, NotebooksDir, status, ct);
}

교사가 [실습 교안 초기화] 버튼을 누르더라도 기존 파일은 삭제되지 않고 notebooks_backup_20260909_214500과 같은 고유한 타임스탬프 폴더로 안전하게 이동(Rename)됩니다. 학생이 실수로 조작하더라도 과제물 데이터가 영구 유실될 가능성을 0%로 통제합니다.

4. 핵심 아키텍처 3: 90초 스톨 가드 & 원자적 압축 승격 파이프라인

40대 PC가 학교 무선 AP에 동시에 물려 대용량 zip 파일을 내려받을 때, 일부 PC에서 반쯤 열린 TCP 연결(Half-Open)이 발생해 프로그레스 바가 99%에서 멈춘 채 무한 대기에 빠지는 현상이 잦습니다. nLM은 sLMdown과 동일한 6대 다운로드 방어 표준을 적용했습니다:

C# — EduLabProvisioner.cs: 90초 무응답 슬라이딩 워치독 & 원자적 승격
// 90초 동안 1바이트도 들어오지 않으면 네트워크 단절로 판정하고 안전 중단
private static async Task<int> ReadWithStallGuardAsync(
    Stream stream, byte[] buffer, CancellationTokenSource idleCts, CancellationToken userToken)
{
    idleCts.CancelAfter(StallTimeoutMs); // 90초 슬라이딩 타이머
    try
    {
        int n = await stream.ReadAsync(buffer, 0, buffer.Length, idleCts.Token);
        idleCts.CancelAfter(Timeout.Infinite); // 수신 성공 시 타이머 리셋
        return n;
    }
    catch (OperationCanceledException) when (!userToken.IsCancellationRequested)
    {
        throw new IOException($"다운로드 정지 감지: 90초간 데이터가 없어 안전 중단합니다.");
    }
}

// .downloading 임시 파일 쓰기 ➔ Content-Length 엄격 대조 ➔ ZipFile 압축 해제 ➔ 임시 파일 파기

패킷 유실로 파일이 잘려 나간 채 다운로드가 중단되면, got < total.Value 조건에 의해 즉각 IOException을 발생시키고 .downloading 임시 파일을 삭제합니다. 불완전한 파이썬 환경이 시스템에 고착되어 실행 시 원인 불명의 오류를 일으키는 오염(Corrupted Poisoning)을 원천 차단합니다.

5. 핵심 아키텍처 4: JupyterLab 무창 백그라운드 오케스트레이션 & 좀비 차단

일반적인 파이썬 환경에서는 Jupyter를 실행하면 시커먼 도스창(cmd.exe)이 화면에 떠 있어 학생들이 실수로 창을 닫아버려 커널 연결이 끊기거나, 반대로 수업이 끝난 후에도 창이 닫히지 않아 백그라운드에서 CPU와 메모리를 지속적으로 낭비합니다.

C# — nLMWindow.xaml.cs: 무창 백그라운드 실행 및 프로세스 트리 완전 파기
var psi = new ProcessStartInfo
{
    FileName = EduLabProvisioner.PythonExe,
    Arguments = "-m jupyterlab --notebook-dir=\"" + EduLabProvisioner.NotebooksDir + "\"",
    WorkingDirectory = EduLabProvisioner.NotebooksDir,
    UseShellExecute = false,
    CreateNoWindow = true, // 시커먼 콘솔 창 완전 은폐
    RedirectStandardOutput = true,
    RedirectStandardError = true,
};

_jupyter = Process.Start(psi);

// 창 종료(Closed) 시 좀비 프로세스 트리 완전 박멸 (6대 패턴 준수)
private void KillJupyter()
{
    if (_jupyter != null)
    {
        try { if (!_jupyter.HasExited) _jupyter.Kill(entireProcessTree: true); } catch { }
        try { _jupyter.Dispose(); } catch { }
        _jupyter = null;
    }
}

nLM 창을 닫는 순간 Kill(entireProcessTree: true)이 호출되어 JupyterLab 부모 프로세스는 물론 자식으로 생성된 Python 커널 프로세스까지 단 1밀리초의 지연 없이 일괄 정리됩니다. 다음 수업 시간의 포트 충돌(Port 8888 Conflict)과 컴퓨터실 PC 느려짐 현상을 100% 방지합니다.

6. 결론: "수업 준비 30분을 0초로 단축하는 공교육 실습실의 혁신"

인공지능 교육의 성공은 화려한 이론보다 '모든 학생이 막힘없이 실습을 시작할 수 있는 안정된 인프라'에 달려 있습니다.

ZeliDesk의 nLM(Notebook Learning Machine)은 관리자 권한 스트레스, 환경 변수 충돌, 과제물 유실이라는 학교 현장의 3대 난제를 소프트웨어 공학적으로 완벽히 극복했습니다. 원클릭 0초 환경 준비, 무파괴 작업공간 보존, 그리고 오프라인 폐쇄망 구동을 통해 대한민국 AI 교육 현장의 교사와 학생 모두에게 가장 신뢰받는 실습 파트너가 될 것입니다.

← 이전 기술 백서 #910 공교육 자율 탐구와 에이전틱 사고력 확장: yLM의 상주 llama-cli 세션 기반 질문 분해 및 온디바이스 다단계 종합 추론 파이프라인 아키텍처 다음 기술 백서 → #908 공교육 시험지 문항과 군사 기밀 번역의 클라우드 유출 0초 차단: ZeliTranslate의 온디바이스 NMT/LLM 하이브리드 번역 및 8대 국문 다국어 파이프라인 아키텍처
⚡ ZeliDesk nLM 원터치 AI 실습실 체험하기

관리자 권한 없는 초경량 Python+JupyterLab 런타임 격리 배포와 학생 과제물 자동 백업 거버넌스를 직접 확인하세요.

ZeliDesk Suite 무료 다운로드