# Dev8.py 듀얼 타이머 시스템 마이그레이션 계획서 ## 🎯 프로젝트 개요 **목적**: 기존 Front 프로젝트를 dev8.py 백엔드의 듀얼 타이머 시스템에 맞춰 업그레이드 **주요 변경사항**: - 단일 타이머 → 듀얼 타이머 (물리치료 15분 + 레이저치료 5분) - 새로운 API 엔드포인트 및 Socket.IO 이벤트 구조 - 향상된 의료진 호출 시스템 - 파일 관리 및 디지털 사이니지 기능 --- ## 📊 백엔드 분석 요약 ### Dev8.py 핵심 특징 1. **듀얼 타이머 시스템** - 물리치료: 900초 (15분) - 레이저치료: 300초 (5분) - 동시 실행 가능, 독립적 제어 2. **실시간 통신** - Socket.IO 기반 100ms 정밀도 업데이트 - 8개 태블릿 + 관제센터 지원 - 역할 기반 권한 시스템 3. **의료진 호출 시스템** - 호출 생성, 확인, 취소 플로우 - 실시간 상태 동기화 4. **파일 관리 & 디지털 사이니지** - 이미지/비디오 업로드 지원 - 슬라이드 CRUD 관리 - 시퀀스 기반 재생 --- ## 🗂️ 마이그레이션 작업 계획 ### Phase 1: 인프라 구조 업데이트 #### 1.1 Socket 연결 모듈 업그레이드 (`src/utils/realtime-socket.ts`) **현재 (v7) → 목표 (v8)**: ```typescript // ❌ 기존: 단일 타이머 interface TimerState { tablet_id: string; countdown: number; status: TimerStatus; } // ✅ 새로운: 듀얼 타이머 interface TimerState { tablet_id: string; timer_type: TimerType; // 🆕 physical | laser countdown: number; status: TimerStatus; start_time?: number; pause_time?: number; completion_time?: number; // 🆕 완료 시간 } enum TimerType { // 🆕 타이머 유형 PHYSICAL = "physical", LASER = "laser" } ``` **새로운 Socket 이벤트 지원**: - `timer_tick`: 100ms 실시간 업데이트 - `timer_finished`: 타이머 완료 알림 - `treatment_completed`: 치료 완료 알림 - `reset_timer`: 완료된 타이머 리셋 #### 1.2 서버 URL 및 포트 변경 ```typescript // 변경: dev8.py 로컬 서버 const SERVER_URL = 'http://localhost:5005'; ``` ### Phase 2: UI 컴포넌트 업데이트 #### 2.1 SignageTabletScreen 듀얼 타이머 UI **현재 구조**: ``` [단일 타이머 표시] [시작/일시정지/정지 버튼] ``` **새로운 구조**: ``` [물리치료 타이머 (15분)] [레이저치료 타이머 (5분)] [독립적 제어 버튼들] [독립적 제어 버튼들] [동시 실행 상태 표시] ``` **구현 계획**: 1. 두 개의 독립적인 타이머 상태 관리 2. 타이머별 UI 컴포넌트 분리 3. 시각적 구분 (색상, 아이콘) 4. 완료 상태 및 리셋 기능 #### 2.2 NewControlScreen 관제센터 업그레이드 **새로운 기능**: - 8개 태블릿의 듀얼 타이머 모니터링 - 모든 타이머 일괄 제어 (`stop_all_timers`) - 의료진 호출 관리 (확인/취소) - 실시간 통계 및 상태 표시 #### 2.3 NewTabletScreen 개발자 도구 확장 **추가 기능**: - 듀얼 타이머 디버깅 정보 - Socket.IO 이벤트 실시간 로그 - API 테스트 도구 - 타이머 상태 상세 정보 ### Phase 3: 새로운 기능 구현 #### 3.1 파일 관리 시스템 **새로운 컴포넌트**: `FileManager.tsx` - 드래그앤드롭 업로드 - 이미지/비디오 미리보기 - UUID 기반 파일 관리 - 파일 타입 검증 #### 3.2 슬라이드 관리 강화 **SlideManager.tsx 업그레이드**: - 새로운 API 엔드포인트 연동 - 시퀀스 기반 정렬 - 미디어 타입별 처리 - 실시간 미리보기 ### Phase 4: 상태 관리 최적화 #### 4.1 듀얼 타이머 상태 관리 ```typescript // 타이머별 상태 분리 const [physicalTimer, setPhysicalTimer] = useState({ tablet_id: '', timer_type: TimerType.PHYSICAL, countdown: 0, status: TimerStatus.STOPPED }); const [laserTimer, setLaserTimer] = useState({ tablet_id: '', timer_type: TimerType.LASER, countdown: 0, status: TimerStatus.STOPPED }); ``` #### 4.2 실시간 이벤트 핸들러 ```typescript // 타이머별 이벤트 처리 const handleTimerTick = (data: TimerTickEvent) => { if (data.timer_type === TimerType.PHYSICAL) { setPhysicalTimer(prev => ({ ...prev, countdown: data.countdown })); } else { setLaserTimer(prev => ({ ...prev, countdown: data.countdown })); } }; const handleTimerFinished = (data: TimerFinishedEvent) => { // 완료 알림 및 UI 업데이트 showCompletionNotification(data.timer_type); }; ``` --- ## 🎨 UI/UX 설계 변경사항 ### 듀얼 타이머 시각적 설계 #### 색상 스키마 - **물리치료**: 파란색 계열 (#3B82F6) - **레이저치료**: 빨간색 계열 (#EF4444) - **완료 상태**: 녹색 계열 (#10B981) #### 레이아웃 구조 ``` ┌─────────────────────────────────────────┐ │ [헤더 - 연결상태, 설정버튼] │ ├─────────────────────────────────────────┤ │ │ │ [사이니지 백그라운드] │ │ │ │ ┌─────────────┐ ┌─────────────┐ │ │ │ 물리치료 │ │ 레이저치료 │ │ │ │ 15:00 │ │ 05:00 │ │ │ │ [⏯][⏹] │ │ [⏯][⏹] │ │ │ └─────────────┘ └─────────────┘ │ │ │ │ [의료진 호출 상태] │ └─────────────────────────────────────────┘ ``` #### 반응형 설계 - **태블릿 모드**: 듀얼 타이머 나란히 배치 - **모바일 모드**: 세로 스택 배치 - **터치 최적화**: 44px 이상 터치 영역 ### 상태 표시 시스템 #### 타이머 상태별 시각적 피드백 - **STOPPED**: 회색 테두리, 시작 버튼 활성화 - **RUNNING**: 진행 중 애니메이션, 일시정지/정지 버튼 - **PAUSED**: 주황색 표시, 재개/정지 버튼 - **FINISHED**: 녹색 배경, 리셋 버튼 #### 의료진 호출 상태 - **NONE**: 호출 버튼 표시 - **CALLING**: 애니메이션 효과, 취소 버튼 - **ACKNOWLEDGED**: 확인됨 표시, 완료 버튼 --- ## 🔧 기술적 구현 세부사항 ### API 통신 계층 #### HTTP Client 설정 ```typescript const API_BASE_URL = 'http://localhost:5005/api'; // 새로운 API 엔드포인트 const apiEndpoints = { health: '/health', status: '/status', timers: '/timers', calls: '/calls', slides: '/slides', files: '/files' }; ``` #### Socket.IO 클라이언트 설정 ```typescript const socket = io('http://localhost:5005', { transports: ['websocket', 'polling'], timeout: 5000, reconnection: true, reconnectionAttempts: 5, reconnectionDelay: 1000 }); ``` ### 에러 처리 및 복구 #### 연결 실패 처리 - 자동 재연결 시도 - 오프라인 모드 지원 - 사용자 알림 시스템 #### 데이터 검증 - TypeScript 타입 체크 - 런타임 데이터 유효성 검사 - 에러 바운더리 구현 --- ## 🧪 테스트 전략 ### 단위 테스트 - 타이머 로직 테스트 - Socket.IO 이벤트 핸들러 테스트 - UI 컴포넌트 렌더링 테스트 ### 통합 테스트 - 백엔드 API 연동 테스트 - 실시간 통신 테스트 - 듀얼 타이머 시나리오 테스트 ### 사용자 테스트 - 터치 인터페이스 테스트 - 의료진 호출 플로우 테스트 - 다중 태블릿 동시 사용 테스트 --- ## 📅 마이그레이션 일정 ### Week 1: 인프라 및 기본 구조 - [ ] Socket 연결 모듈 업그레이드 - [ ] 타이머 상태 인터페이스 정의 - [ ] 기본 UI 컴포넌트 수정 ### Week 2: 듀얼 타이머 구현 - [ ] SignageTabletScreen 듀얼 타이머 UI - [ ] 타이머 제어 로직 구현 - [ ] 실시간 업데이트 처리 ### Week 3: 관제센터 및 고급 기능 - [ ] NewControlScreen 업그레이드 - [ ] 의료진 호출 시스템 완성 - [ ] 파일 관리 기능 구현 ### Week 4: 최적화 및 테스트 - [ ] 성능 최적화 - [ ] 통합 테스트 - [ ] 사용자 테스트 및 피드백 반영 --- ## 🎯 성공 지표 ### 기능적 요구사항 - ✅ 듀얼 타이머 독립적 제어 - ✅ 실시간 100ms 정밀도 업데이트 - ✅ 8개 태블릿 동시 지원 - ✅ 의료진 호출 완전 플로우 - ✅ 디지털 사이니지 통합 ### 비기능적 요구사항 - ✅ 1초 이내 UI 반응성 - ✅ 99% 연결 안정성 - ✅ 터치 인터페이스 최적화 - ✅ 크로스 브라우저 호환성 ### 사용자 경험 - ✅ 직관적인 듀얼 타이머 인터페이스 - ✅ 명확한 상태 시각적 피드백 - ✅ 실수 방지 UX 패턴 - ✅ 접근성 표준 준수 --- ## 🚀 배포 계획 ### 개발 환경 - **포트**: 5071 (dev-front) - **백엔드**: localhost:5005 (dev8.py) - **데이터베이스**: SQLite (개발용) ### 스테이징 환경 - **도메인**: dev.ysl.0bin.in - **리버스 프록시**: Nginx - **SSL**: Let's Encrypt ### 프로덕션 환경 - **도메인**: ysl.0bin.in - **CDN**: 정적 자원 최적화 - **모니터링**: 실시간 상태 감시 --- ## 📋 위험 요소 및 대응 방안 ### 기술적 위험 1. **실시간 통신 안정성** - 대응: 연결 상태 모니터링, 자동 재연결 2. **듀얼 타이머 동기화** - 대응: 서버 시간 기준 동기화, 로컬 보정 3. **대용량 파일 업로드** - 대응: 청크 업로드, 진행률 표시 ### 사용자 경험 위험 1. **복잡성 증가** - 대응: 단계별 사용자 가이드, 직관적 UI 2. **터치 오작동** - 대응: 확인 다이얼로그, 실행 취소 기능 ### 운영 위험 1. **기존 시스템과의 호환성** - 대응: 점진적 마이그레이션, 롤백 계획 2. **사용자 교육** - 대응: 트레이닝 자료, 실시간 도움말 --- 이 계획서는 dev8.py 백엔드 시스템의 모든 기능을 완전히 활용하는 현대적이고 직관적인 프론트엔드를 구축하기 위한 종합적인 로드맵을 제공합니다.