← 포트폴리오 목록

학생별 컨테이너 실습 웹 IDE

브라우저에서 바로 실행되는 Python 학습용 웹 IDE를 구현합니다.

컨테이너 오케스트레이션 API 설계Dockerode로 학생별 컨테이너 생성·볼륨 마운트·네트워크 격리를 코드화, 강의실 입장 시 온디맨드 프로비저닝 로직 구현
WebSocket 재연결 상태 머신 구현Socket.io 재연결 이벤트와 지수 백오프 큐를 결합, 연결 끊김 시 컨테이너 상태를 클라이언트와 재동기화하는 로직 설계
Monaco 기반 파일 시스템 동기화 설계파일 트리 CRUD와 에디터 버퍼를 Debounce 저장 + 낙관적 UI로 연결, 볼륨 영속 API와 원자적으로 매핑
서비스 타입Web
업종AI 서비스
기술 스택
ReactTypeScriptMonaco EditorNode.jsExpressSocket.ioDockerode (Docker Engine API)PostgreSQLPrisma
주요 기능
  • 웹 IDE 파일 트리 & Python 에디터
  • 실시간 콘솔 & Streamlit 미리보기
  • 학생별 컨테이너 프로비저닝
  • 네트워크 재연결 & 장애 자동 복구
Overview

프로젝트 개요

범위: 개발, 디자인, 기획

브라우저에서 바로 실행되는 Python 학습용 웹 IDE를 구현합니다. 학생별로 격리된 Docker 컨테이너를 자동 프로비저닝하고, Monaco 에디터·실시간 콘솔·Streamlit 미리보기를 WebSocket으로 연결해 코드 작성부터 실행 결과 확인까지 하나의 화면에서 처리하는 구조를 React + TypeScript + Node.js 기반으로 설계합니다.

작업 범위

  • 웹 IDE 파일 트리 & Python 에디터: 학생이 좌측 파일 트리에서 파일을 생성·이름변경·삭제하고, 중앙 Monaco 에디터에서 Python 코드를 작성할 수 있는 실습 워크스페이스를 제공합니다
  • 실시간 콘솔 & Streamlit 미리보기: 실행 버튼을 누르면 print·오류 메시지가 콘솔에 실시간으로 표시되고, 학생이 만든 Streamlit 앱이 우측 패널 iframe에서 바로 동작합니다
  • 학생별 컨테이너 프로비저닝: 강의실 입장 시 학생별로 격리된 Docker 컨테이너가 자동 생성되고, 연결 상태와 볼륨 마운트 진행 상황을 화면에서 확인할 수 있습니다
  • 네트워크 재연결 & 장애 자동 복구: WebSocket 연결이 끊겨도 자동으로 재연결을 시도하고, 컨테이너가 비정상 종료되면 학생 모르게 자동으로 재생성해 실습이 끊기지 않도록 합니다

주요 업무

  • 웹 IDE 파일 트리 & Python 에디터 화면: Monaco Editor를 Python 하이라이트·자동 저장 모드로 구성하고, 파일 트리 CRUD 이벤트를 컨테이너 볼륨 API와 동기화합니다
  • 실시간 콘솔 & Streamlit 미리보기 화면: Socket.io로 컨테이너 stdout/stderr 스트림을 콘솔에 중계하고, Streamlit 서버를 프록시 경유 iframe으로 렌더링합니다
  • 학생별 컨테이너 프로비저닝 화면: Dockerode로 온디맨드 컨테이너를 생성하고, 이전 작업 볼륨을 재마운트해 재접속 시 작업 환경을 복원합니다
  • 네트워크 재연결 & 장애 자동 복구 화면: 지수 백오프 재연결 큐와 컨테이너 헬스체크를 결합해 장애 상황을 투명하게 처리합니다
학생별 컨테이너 실습 웹 IDE
요구사항 정의

프로젝트 핵심 과제

프로젝트 진행 시 해결한 핵심 기술 과제입니다.

다수 학생이 동시에 컨테이너를 사용하는 시간대에도 cgroup 리소스 제한으로 컨테이너 간 성능 간섭을 차단하는 설계

WebSocket 연결이 끊기는 순간의 미저장 코드 변경분을 유실 없이 복구하는 버퍼링 전략 설계

Streamlit 컨테이너 내부 프로세스를 프록시로만 노출하고 외부 인바운드 직접 접근을 차단하는 라우팅 정책 설계

재접속 시 이전 작업 볼륨을 빠르게 마운트하면서 컨테이너 기동 지연을 최소화하는 워밍업 전략

구현 내용

핵심 기능 상세

핵심 기능 1

웹 IDE 파일 트리 & Python 에디터

학생이 좌측 파일 트리에서 파일을 생성·이름변경·삭제하고, 중앙 Monaco 에디터에서 Python 코드를 작성할 수 있는 실습 워크스페이스를 제공합니다.

  • Monaco Editor를 Python 언어 서비스로 구성하고 Debounce 자동 저장(2초)을 적용합니다
  • 파일 트리 CRUD를 React Query 뮤테이션으로 처리하고 낙관적 UI 업데이트를 적용합니다
  • 단축키(Ctrl+S 저장, Ctrl+Enter 실행)를 커맨드 팔레트와 연결해 조작 흐름을 단축합니다

Monaco Editor의 언어 서비스와 파일 시스템 상태를 단일 소스로 통합해, 편집·저장·실행 흐름이 끊김 없이 이어지는 구조를 설계합니다

웹 IDE 파일 트리 & Python 에디터
웹 IDE 파일 트리 & Python 에디터 실제 화면
핵심 기능 2

실시간 콘솔 & Streamlit 미리보기

실행 버튼을 누르면 print·오류 메시지가 콘솔에 실시간으로 표시되고, 학생이 만든 Streamlit 앱이 우측 패널 iframe에서 바로 동작합니다.

  • Socket.io 네임스페이스를 학생별 컨테이너 ID로 분리해 콘솔 스트림 혼선을 방지합니다
  • stdout/stderr를 색상 구분된 로그 라인으로 렌더링하고 자동 스크롤을 적용합니다
  • Streamlit 내부 포트를 리버스 프록시로 매핑해 iframe src를 컨테이너별 고유 경로로 발급합니다

실행 로그와 Streamlit 미리보기를 하나의 WebSocket 세션에서 함께 관리해, 코드 수정 후 재실행까지의 흐름을 하나의 화면에서 처리하는 구조를 구현합니다

실시간 콘솔 & Streamlit 미리보기
실시간 콘솔 & Streamlit 미리보기 실제 화면
핵심 기능 3

학생별 컨테이너 프로비저닝

강의실 입장 시 학생별로 격리된 Docker 컨테이너가 자동 생성되고, 연결 상태와 볼륨 마운트 진행 상황을 화면에서 확인할 수 있습니다.

  • Dockerode API로 학생 ID 기반 컨테이너 네이밍과 볼륨 마운트를 자동화합니다
  • 미접속 학생은 컨테이너 생성을 건너뛰는 지연 프로비저닝(lazy provisioning) 전략을 적용합니다
  • 컨테이너 생성 진행 상태(대기·생성중·준비완료)를 상태 머신으로 관리하고 UI에 반영합니다

컨테이너 생성부터 볼륨 복원까지의 과정을 상태 머신으로 설계해, 학생이 재접속했을 때 이전 작업 환경을 그대로 이어갈 수 있는 구조를 구현합니다

학생별 컨테이너 프로비저닝
학생별 컨테이너 프로비저닝 실제 화면
핵심 기능 4

네트워크 재연결 & 장애 자동 복구

WebSocket 연결이 끊겨도 자동으로 재연결을 시도하고, 컨테이너가 비정상 종료되면 학생 모르게 자동으로 재생성해 실습이 끊기지 않도록 합니다.

  • Socket.io 재연결 옵션에 지수 백오프(1초~30초)를 적용하고 재연결 시도 상태를 UI에 표시합니다
  • 컨테이너 헬스체크를 주기적으로 수행하고 비정상 종료 감지 시 동일 볼륨으로 컨테이너를 재생성합니다
  • 재연결 성공 시 파일 저장 상태와 실행 세션을 재동기화하는 핸드셰이크 로직을 구현합니다

연결 끊김부터 컨테이너 재생성, 상태 재동기화까지의 전체 복구 흐름을 하나의 파이프라인으로 설계해 학생이 별도 조치 없이 실습을 이어갈 수 있도록 구현합니다

네트워크 재연결 & 장애 자동 복구
네트워크 재연결 & 장애 자동 복구 실제 화면
구현 과정

프로젝트 진행 단계

STEP 1

요구사항 분석 및 컨테이너 아키텍처 설계 · 2026.09

학생 실습 시나리오 분석, Docker 볼륨·네트워크 격리 구조 설계, PostgreSQL 스키마 테이블 정의

STEP 2

컨테이너 오케스트레이션 API 개발 · 2026.09

Dockerode 기반 프로비저닝·볼륨 마운트·회수 API 구현, cgroup 리소스 제한 정책 적용

STEP 3

웹 IDE 프론트엔드 개발 · 2026.09

Monaco 에디터·파일 트리·실행 제어 UI 구현, 재사용 React 컴포넌트 설계

STEP 4

WebSocket 실시간 통신 및 Streamlit 프록시 구현 · 2026.09

Socket.io 기반 콘솔 스트리밍, 재연결 상태 머신 구현, Streamlit iframe 프록시 라우팅 적용

STEP 5

통합 테스트 및 안정성 검증 · 2026.09

동시 접속 시뮬레이션, 장애 복구 시나리오 테스트, 크로스 브라우저 검증

프로젝트 성과

주요 성과

컨테이너 오케스트레이션 API 설계Dockerode로 학생별 컨테이너 생성·볼륨 마운트·네트워크 격리를 코드화, 강의실 입장 시 온디맨드 프로비저닝 로직 구현
WebSocket 재연결 상태 머신 구현Socket.io 재연결 이벤트와 지수 백오프 큐를 결합, 연결 끊김 시 컨테이너 상태를 클라이언트와 재동기화하는 로직 설계
Monaco 기반 파일 시스템 동기화 설계파일 트리 CRUD와 에디터 버퍼를 Debounce 저장 + 낙관적 UI로 연결, 볼륨 영속 API와 원자적으로 매핑
iframe 샌드박스 Streamlit 프록시 구현컨테이너 내부 Streamlit 서버를 리버스 프록시로 안전하게 노출, iframe 격리 정책 적용
Highlights

기술적 주안점

  • Monaco Editor의 언어 서비스와 파일 시스템 상태를 단일 소스로 통합해, 편집·저장·실행 흐름이 끊김 없이 이어지는 구조를 설계합니다
  • 실행 로그와 Streamlit 미리보기를 하나의 WebSocket 세션에서 함께 관리해, 코드 수정 후 재실행까지의 흐름을 하나의 화면에서 처리하는 구조를 구현합니다
  • 컨테이너 생성부터 볼륨 복원까지의 과정을 상태 머신으로 설계해, 학생이 재접속했을 때 이전 작업 환경을 그대로 이어갈 수 있는 구조를 구현합니다

유사한 프로젝트를 기획하고 계신가요?

FIRSTPIP이 개발 범위와 로드맵을 함께 정리해드립니다

무료 상담 시작하기