RoboDine 운영자 대시보드 개발 - React 기반 실시간 관제 시스템
서론
RoboDine 프로젝트에서 저는 운영자 대시보드의 프론트엔드 개발을 담당했습니다. React와 Tailwind CSS를 활용하여 로봇 레스토랑의 전체 운영을 관제할 수 있는 실시간 모니터링 시스템을 구축했습니다. 이 글에서는 실제 레스토랑 환경에서 사용될 운영자 인터페이스를 개발하면서 구현한 기능들과 기술적 도전을 정리해보겠습니다.
운영자 대시보드 개요
완성된 대시보드 화면
위 이미지는 실제 구현된 RoboDine 운영자 대시보드의 메인 화면입니다. 좌측에 네비게이션 메뉴, 중앙에 매장 맵과 로봇 상태, 우측에 로봇 상태 패널이 배치된 구조로 되어 있습니다.
실제 구현된 프론트엔드 구조
RoboDine 운영자 대시보드는 다음과 같은 실제 구조로 구현되었습니다:
operator/
├── src/
│ ├── components/ # 재사용 가능한 컴포넌트
│ │ └── FloatingChat/ # 플로팅 AI 챗봇
│ ├── pages/ # 주요 페이지 컴포넌트 (10개)
│ │ ├── DashboardPage.jsx # 메인 대시보드 (426 lines)
│ │ ├── RobotAdminPage.jsx # 로봇 관리 (1,279 lines)
│ │ ├── OrdersPage.jsx # 주문 관리 (746 lines)
│ │ ├── CustomerPage.jsx # 고객/테이블 관리 (680 lines)
│ │ ├── InventoryPage.jsx # 재고 관리 (1,193 lines)
│ │ ├── MenuPage.jsx # 메뉴 관리 (903 lines)
│ │ ├── VideoStreamPage.jsx # 비디오 스트리밍 (995 lines)
│ │ ├── StatsPage.jsx # 통계 페이지 (283 lines)
│ │ ├── SettingsPage.jsx # 설정 관리 (379 lines)
│ │ └── LoginPage.jsx # 로그인 (153 lines)
│ ├── contexts/ # React Context 상태 관리
│ │ ├── AuthContext.js # 사용자 인증
│ │ ├── WebSocketContext.js # WebSocket 연결
│ │ ├── HealthCheckContext.js # 시스템 상태 체크
│ │ └── NotificationsContext.js # 알림 관리
│ └── services/ # API 및 WebSocket 서비스
├── package.json # React 의존성 (49개 패키지)
└── README.md # 상세 기능 문서 (328 lines)
주요 기능별 실제 구현
1. 실시간 모니터링 시스템
Context API 기반 상태 관리:
// AuthContext, WebSocketContext, HealthCheckContext, NotificationsContext
// 4개의 Context Provider로 전역 상태 관리
<AuthProvider>
<WebSocketProvider>
<HealthCheckProvider>
<NotificationsProvider>
{/* 애플리케이션 컴포넌트들 */}
</NotificationsProvider>
</HealthCheckProvider>
</WebSocketProvider>
</AuthProvider>
WebSocket 기반 실시간 업데이트:
- 로봇 상태, 주문, 이벤트, 고객 정보 실시간 구독
- 자동 재연결 기능으로 안정적인 연결 유지
- 토픽별 독립적인 데이터 스트림 관리
2. 플로팅 AI 챗봇 시스템
드래그 가능한 채팅 인터페이스:
- 드래그 앤 드롭으로 채팅창 위치 이동
- 채팅창 크기 조절 기능
- 로컬 스토리지를 통한 설정 저장
- 다크/라이트 테마 지원
- 메시지 검색 및 하이라이트 기능
- 이미지 첨부 및 모달 뷰어
3. 보호된 라우팅 시스템
JWT 기반 인증 관리:
const ProtectedRoute = ({ children }) => {
const { isAuthenticated, isLoading } = useAuth();
if (isLoading) {
return <div className="loading-spinner">로딩 중...</div>;
}
if (!isAuthenticated) {
return <Navigate to="/login" />;
}
return children;
};
실제 구현된 라우트 구조:
-
/
- DashboardPage (메인 대시보드) -
/robots
- RobotAdminPage (로봇 관리) -
/orders
- OrdersPage (주문 관리) -
/customers
- CustomerPage (고객/테이블 관리) -
/inventory
- InventoryPage (재고 관리) -
/menu
- MenuPage (메뉴 관리) -
/video-stream
- VideoStreamPage (비디오 모니터링) -
/stats
- StatsPage (통계 분석) -
/settings
- SettingsPage (설정 관리) -
/login
- LoginPage (로그인)
페이지별 주요 기능
1. 메인 대시보드 (DashboardPage.jsx - 426 lines)
실시간 종합 상황판:
- 로봇 상태 실시간 모니터링
- 매장 맵과 테이블 상태 시각화
- 최근 주문 및 이벤트 타임라인
- 시스템 상태 요약 정보
2. 로봇 관리 (RobotAdminPage.jsx - 1,279 lines)
로봇 제어 및 모니터링:
- 모든 로봇의 상세 정보 및 상태 표시
- 원격 명령 전송 기능
- 로봇별 작업 이력 추적
- 배터리 상태 및 위치 정보 관리
3. 주문 관리 (OrdersPage.jsx - 746 lines)
주문 처리 시스템:
- 실시간 주문 상태 모니터링
- 주문 상태 변경 및 업데이트
- 주문 이력 조회 및 검색
- 테이블별/고객별 주문 필터링
4. 재고 관리 (InventoryPage.jsx - 1,193 lines)
실시간 재고 모니터링:
- 재고 현황 실시간 업데이트
- 부족 재고 알림 시스템
- 재고 수정 및 관리 기능
- 재고 사용량 추적
5. 비디오 스트리밍 (VideoStreamPage.jsx - 995 lines)
영상 모니터링 시스템:
- 로봇 카메라 실시간 스트리밍
- 녹화 영상 재생 및 관리
- 다중 카메라 동시 모니터링
- 영상 검색 및 이벤트 연동
기술적 구현 세부사항
1. Context API 기반 상태 관리
실제 구현된 Context 구조:
// 4개의 주요 Context Provider
- AuthProvider: 사용자 인증 및 권한 관리
- WebSocketProvider: 실시간 통신 관리
- HealthCheckProvider: 시스템 상태 모니터링
- NotificationsProvider: 알림 시스템 관리
2. React Router v6 기반 라우팅
보호된 라우트 구현:
- 로그인 페이지를 제외한 모든 페이지는 인증 필요
- JWT 토큰 기반 자동 로그인 및 세션 관리
- 권한별 접근 제어 시스템
3. Tailwind CSS 반응형 디자인
실제 적용된 기술 스택:
{
"react": "^18.x",
"react-router-dom": "^6.x",
"tailwindcss": "^3.x",
"react-map-gl": "^7.x",
"axios": "^1.x"
}
개발 과정에서의 도전과 해결
1. 실시간 데이터 동기화
도전: 다양한 소스에서 오는 실시간 데이터의 일관성 유지
해결책:
- WebSocket Context를 통한 중앙화된 데이터 관리
- 토픽별 독립적인 상태 업데이트
- 에러 발생 시 자동 재연결 메커니즘
2. 대용량 페이지 성능 최적화
도전: 1,000+ 라인의 복잡한 페이지 성능 최적화
해결책:
- React.memo를 활용한 컴포넌트 최적화
- 가상화를 통한 대량 데이터 렌더링
- 지연 로딩을 통한 초기 로딩 시간 단축
3. 복잡한 사용자 인터페이스 설계
도전: 다양한 기능을 직관적으로 배치하는 UI 설계
해결책:
- 기능별 페이지 분리로 복잡성 감소
- 일관된 디자인 시스템 적용
- 사용자 피드백을 반영한 지속적인 개선
4. 실시간 비디오 스트리밍 구현
도전: 로봇 카메라의 실시간 영상을 웹 브라우저에서 안정적으로 스트리밍
해결책:
// WebRTC 기반 비디오 스트리밍 파이프라인
1. 카메라에서 UDP로 프레임 수신
2. aiortc로 WebSocket 기반 offer/ICE 교환 (Signaling)
3. MediaRelay를 통해 SRTP로 클라이언트에 멀티캐스트
4. UDP 프레임 없으면 검은 화면 자동 전송
핵심 기술 스택:
- aiortc: 파이썬에서 WebRTC를 사용할 수 있게 해주는 비동기 라이브러리
- WebRTC: 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API
- WebSocket: 클라이언트와 서버 간 지속적인 양방향 통신 채널을 제공하는 프로토콜
- MediaRelay: 하나의 미디어 스트림을 여러 클라이언트에 공유할 수 있는 aiortc 내장 유틸리티
- SRTP: WebRTC에서 실제 데이터를 전송하는 암호화된 전송 프로토콜
구현 결과:
- 다중 클라이언트 동시 스트리밍 지원
- 네트워크 단절 시 자동 복구 메커니즘
- 저지연 실시간 영상 전송 (< 100ms)
실제 구현 성과
페이지별 구현 규모
페이지 | 라인 수 | 주요 기능 |
---|---|---|
RobotAdminPage | 1,279 | 로봇 제어 및 모니터링 |
InventoryPage | 1,193 | 재고 관리 시스템 |
VideoStreamPage | 995 | 영상 모니터링 |
MenuPage | 903 | 메뉴 관리 |
OrdersPage | 746 | 주문 처리 |
CustomerPage | 680 | 고객/테이블 관리 |
DashboardPage | 426 | 종합 대시보드 |
SettingsPage | 379 | 설정 관리 |
StatsPage | 283 | 통계 분석 |
LoginPage | 153 | 사용자 인증 |
기술적 성과
코드 품질:
- 총 10개 페이지, 7,000+ 라인의 React 코드
- 4개 Context Provider로 체계적인 상태 관리
- 49개 npm 패키지로 구성된 모듈화된 구조
사용자 경험:
- 실시간 WebSocket 통신으로 즉각적인 데이터 업데이트
- 직관적인 네비게이션과 일관된 UI/UX
- 반응형 디자인으로 다양한 화면 크기 지원
배운 교훈과 개선 방향
1. 대규모 React 애플리케이션 설계
복잡한 로봇 관제 시스템을 위해서는 체계적인 상태 관리와 컴포넌트 설계가 핵심이었습니다. Context API를 통한 전역 상태 관리가 효과적이었습니다.
2. 실시간 시스템의 성능 최적화
WebSocket을 통한 실시간 데이터 처리에서 메모리 누수 방지와 연결 안정성이 중요했습니다. 자동 재연결과 에러 처리가 필수적이었습니다.
3. 사용자 중심 인터페이스 설계
운영자가 효율적으로 작업할 수 있도록 하는 인터페이스 설계의 중요성을 깨달았습니다. 기능별 페이지 분리와 직관적인 네비게이션이 핵심이었습니다.
결론
RoboDine 운영자 대시보드 개발은 복잡한 로봇 시스템을 효율적으로 관제할 수 있는 실시간 인터페이스를 구축하는 도전이었습니다. React와 Context API를 활용한 체계적인 상태 관리, WebSocket을 통한 실시간 통신, 그리고 사용자 친화적인 인터페이스 설계를 통해 실제 운영 환경에서 사용 가능한 수준의 관제 시스템을 완성했습니다.
특히 10개의 주요 페이지와 7,000+ 라인의 코드로 구성된 대규모 프론트엔드 애플리케이션을 성공적으로 구현하면서, 실시간 시스템 개발의 기술적 노하우와 사용자 경험 설계의 중요성을 체득할 수 있었습니다.
운영자 대시보드 개발에 대한 더 자세한 내용이나 구체적인 구현 방법이 궁금하시면 언제든 댓글로 질문해주세요. 함께 더 나은 사용자 경험을 만들어가는 논의를 나눠보면 좋겠습니다.
Enjoy Reading This Article?
Here are some more articles you might like to read next: