☁️

선생님·기사님·원장 데이터를
실시간으로 공유하려면?

현재 시스템의 데이터 저장 방식과
여러 기기에서 실시간 공유하는 방법을 설명합니다.

왜 지금은 공유가 안 될까요?

💻
현재 방식 (localStorage)

각 기기 브라우저에만 저장
다른 컴퓨터와 공유 ❌

☁️
목표 방식 (Cloud DB)

인터넷 클라우드 서버에 저장
모든 기기 실시간 공유 ✅

현재 상황: 선생님 A가 선생님 컴퓨터에서 출결을 입력해도, 원장 컴퓨터나 기사님 태블릿에는 전혀 반영되지 않습니다. 각 기기가 완전히 분리된 데이터를 가지고 있습니다.

실시간 공유 방법 비교

🌟 방법 1: Firebase (추천)

무료 시작 가능
  • 구글 제공 클라우드 DB
  • 실시간 데이터 동기화 ✅
  • 월 10만 건 읽기 무료
  • 설정 난이도: ⭐⭐
  • 별도 서버 불필요
  • 소규모 학원에 최적
💰 비용: 무료 플랜으로 시작
(학생 100명 규모 충분)

☁️ 방법 2: Supabase

무료 시작 가능
  • PostgreSQL 기반 DB
  • 실시간 동기화 ✅
  • 월 50만 건 무료
  • 설정 난이도: ⭐⭐⭐
  • 더 강력한 쿼리
💰 비용: 무료 플랜 가능

🖥️ 방법 3: 전용 서버 구축

유료
  • Node.js + MySQL/MongoDB
  • 완전한 맞춤 개발
  • 설정 난이도: ⭐⭐⭐⭐⭐
  • 서버 비용 월 3~10만원
  • 전문 개발자 필요
💰 비용: 월 3~15만원 + 개발비

📊 방법 4: 구글 스프레드시트

무료
  • 구글 Apps Script 활용
  • 실시간 공유 가능 ✅
  • 설정 난이도: ⭐⭐⭐
  • 인터페이스 제한적
  • 현재 시스템과 연동 복잡
💰 비용: 무료 (구글 계정만)
비교 항목localStorage (현재)Firebase (추천)전용 서버
여러 기기 공유❌ 불가✅ 실시간✅ 실시간
인터넷 필요❌ 오프라인 가능⚠️ 인터넷 필요⚠️ 인터넷 필요
설정 난이도없음⭐⭐ 중간⭐⭐⭐⭐⭐ 어려움
월 비용무료무료~소액3~15만원
데이터 보안기기 분실 시 소실구글 서버 보관자체 관리
백업수동 필요자동설정에 따라

Firebase 설정 방법 (단계별 안내)

Firebase는 구글 계정만 있으면 무료로 시작할 수 있습니다.
학원 규모(학생 100명 이하)에서는 무료 플랜으로 충분합니다.

📋 STEP 1. Firebase 프로젝트 만들기

1
Firebase 콘솔 접속

console.firebase.google.com 에 접속하여 구글 계정으로 로그인합니다.

2
새 프로젝트 생성

「프로젝트 추가」 클릭 → 프로젝트 이름: sangsang-factory → Google Analytics 비활성화 → 「프로젝트 만들기」

3
Realtime Database 활성화

왼쪽 메뉴 「빌드 → Realtime Database」 → 「데이터베이스 만들기」 → 아시아 리전 (asia-southeast1) 선택 → 「테스트 모드로 시작」

⚠️ 테스트 모드는 30일간 모든 읽기/쓰기 허용됩니다. 30일 후에는 보안 규칙을 설정해야 합니다.
4
웹 앱 등록 및 설정값 복사

프로젝트 홈 → 「</> 웹」 아이콘 클릭 → 앱 닉네임: 상상팩토리-admin → 등록 완료 후 아래와 같은 설정 코드가 나타납니다:

const firebaseConfig = { apiKey: "AIzaSy...", authDomain: "sangsang-factory.firebaseapp.com", databaseURL: "https://sangsang-factory-default-rtdb.asia-southeast1.firebasedatabase.app", projectId: "sangsang-factory", storageBucket: "sangsang-factory.appspot.com", messagingSenderId: "123456789", appId: "1:123456789:web:abcdef..." };

이 설정값을 메모장에 복사해두세요!

🔒 STEP 2. 보안 규칙 설정 (중요!)

5
Realtime Database → 규칙 탭

아래 규칙으로 교체합니다. 학원 전용 비밀 토큰으로 접근을 제한합니다:

{ "rules": { ".read": "auth != null || root.child('config/accessToken').val() === query.orderBy", ".write": "auth != null || root.child('config/accessToken').val() === query.orderBy", "sangsang_factory": { ".read": true, ".write": true } } }
주의: 테스트 중에는 위처럼 오픈 상태로 두되, 실제 운영 시에는 Firebase Authentication을 추가하거나 IP 제한을 걸어야 합니다.

💻 STEP 3. 현재 시스템에 Firebase 연동 코드 적용

6
index.html 상단 <head> 에 Firebase SDK 추가
<!-- Firebase SDK --> <script type="module"> import { initializeApp } from 'https://www.gstatic.com/firebasejs/10.7.0/firebase-app.js'; import { getDatabase, ref, set, get, onValue, push, remove, update } from 'https://www.gstatic.com/firebasejs/10.7.0/firebase-database.js'; // ★ 여기에 복사한 설정값을 붙여넣으세요 ★ const firebaseConfig = { apiKey: "여기에_API_KEY", authDomain: "프로젝트.firebaseapp.com", databaseURL: "https://프로젝트-default-rtdb.asia-southeast1.firebasedatabase.app", projectId: "프로젝트ID", storageBucket: "프로젝트.appspot.com", messagingSenderId: "숫자", appId: "앱ID" }; const app = initializeApp(firebaseConfig); const db = getDatabase(app); // 전역 노출 window.firebaseDB = db; window.fbRef = ref; window.fbSet = set; window.fbGet = get; window.fbOnValue = onValue; window.fbPush = push; window.fbRemove = remove; window.fbUpdate = update; window.FB_ROOT = 'sangsang_factory'; // 데이터 저장 경로 console.log('Firebase 연결 완료 ✅'); </script>
7
데이터 저장 함수를 Firebase 방식으로 교체

현재 localStorage.setItem()을 Firebase set()으로 교체합니다:

// ─── 기존 방식 (localStorage) ─── function setStuData(data) { localStorage.setItem('stu_data_v1', JSON.stringify(data)); } // ─── Firebase 방식으로 교체 ─── async function setStuData(data) { // localStorage에도 캐시 저장 (오프라인 대비) localStorage.setItem('stu_data_v1', JSON.stringify(data)); // Firebase에도 저장 if (window.firebaseDB) { const path = window.FB_ROOT + '/students'; await window.fbSet(window.fbRef(window.firebaseDB, path), data); } }
// ─── 실시간 데이터 수신 (다른 기기 변경 즉시 반영) ─── function startRealtimeSync() { if (!window.firebaseDB) return; // 학생 데이터 실시간 감시 window.fbOnValue( window.fbRef(window.firebaseDB, window.FB_ROOT + '/students'), (snapshot) => { const data = snapshot.val(); if (data) { localStorage.setItem('stu_data_v1', JSON.stringify(data)); renderStudents(); // 화면 자동 갱신 console.log('학생 데이터 동기화 완료'); } } ); // 출결 데이터 실시간 감시 window.fbOnValue( window.fbRef(window.firebaseDB, window.FB_ROOT + '/attendance'), (snapshot) => { const data = snapshot.val(); if (data) localStorage.setItem('attendance_v1', JSON.stringify(data)); } ); // 차량 노선 데이터 실시간 감시 window.fbOnValue( window.fbRef(window.firebaseDB, window.FB_ROOT + '/route'), (snapshot) => { const data = snapshot.val(); if (data) { localStorage.setItem('route_data_v1', JSON.stringify(data)); renderRoute && renderRoute(); // 차량 화면 갱신 } } ); }
8
데이터 읽기도 Firebase에서 가져오기
// 앱 시작 시 Firebase에서 전체 데이터 로드 async function loadFromFirebase() { if (!window.firebaseDB) return; const keys = [ { fb: 'students', ls: 'stu_data_v1' }, { fb: 'attendance', ls: 'attendance_v1' }, { fb: 'tuition', ls: 'tuition_log_v1' }, { fb: 'finance', ls: 'fin_data_v1' }, { fb: 'route', ls: 'route_data_v1' }, { fb: 'cars', ls: 'cars_data_v1' }, { fb: 'classes', ls: 'class_data_v1' }, { fb: 'points', ls: 'points_v1' }, { fb: 'scholar', ls: 'scholar_v1' }, ]; for (const k of keys) { const snap = await window.fbGet( window.fbRef(window.firebaseDB, window.FB_ROOT + '/' + k.fb) ); if (snap.exists()) { localStorage.setItem(k.ls, JSON.stringify(snap.val())); } } console.log('Firebase 데이터 로드 완료 ✅'); }

역할별 데이터 접근 구조

Firebase에서 권한을 역할별로 분리하면 보안도 강화됩니다.

역할읽기 권한쓰기 권한실시간 수신
🏫 원장 전체 데이터 전체 데이터 학생, 원비, 출결, 차량, 포인트
👩‍🏫 선생님 담당 학생, 수업 출결, 포인트, 수업일지 출결, 학생 정보, 수업 일정
🚌 기사님 배정 차량 학생 탑승/하원 확인, 노선 시각 탑승 학생 목록, 시간 변경
👨‍👩‍👧 학부모 본인 자녀만 읽기 전용 자녀 출결, 포트폴리오

Firebase 설정 전까지 임시 방법

📤 방법 A: 수동 데이터 내보내기/가져오기

1
원장 PC에서 데이터 내보내기

상상팩토리 → 우측 상단 「⚙️ 설정」 → 「전체 데이터 백업(JSON)」 → 파일 저장

2
카카오톡/이메일로 파일 공유

저장된 JSON 파일을 카카오톡 단체방 또는 이메일로 전송

3
각 기기에서 데이터 가져오기

상상팩토리 → 설정 → 「데이터 복원(JSON 불러오기)」 → 파일 선택

⚠️ 이 방법은 실시간이 아닙니다. 아침 업무 시작 전, 저녁 업무 마감 후 등 하루 2~3회 동기화를 권장합니다.

💻 방법 B: 공용 PC 1대 사용

원장실에 공용 PC 또는 태블릿을 두고, 모든 인원이 같은 기기에서 접근하면 데이터가 하나로 유지됩니다. 단, 동시 접근 불가.

📱 방법 C: 크롬 프로파일 동기화 (같은 구글 계정)

모든 기기에서 같은 구글 계정으로 Chrome에 로그인 → Chrome 동기화 설정에서 「사이트 데이터」 활성화. 단, 이 방법은 완전히 신뢰할 수 없습니다.

자주 묻는 질문

Firebase 무료 플랜 한도가 얼마인가요?
Spark (무료) 플랜:
• 동시 접속: 100개
• 저장 용량: 1GB
• 다운로드: 월 10GB
• 학생 100명 학원 기준: 충분히 무료 사용 가능
인터넷이 끊기면 어떻게 되나요?
Firebase는 오프라인 지원 기능이 있습니다. 인터넷이 끊겨도 로컬에 캐시된 데이터로 계속 작업하고, 인터넷 연결 시 자동으로 동기화됩니다. 현재 시스템도 localStorage 백업을 병행하므로 오프라인에서도 동작합니다.
기사님 태블릿에서도 사용 가능한가요?
네. Firebase 연동 후에는 태블릿, 스마트폰, PC 어디서든 인터넷만 있으면 실시간으로 데이터를 공유할 수 있습니다. 기사님이 탑승 확인을 누르면 원장 화면에 즉시 반영됩니다.
개인정보(학생 정보)를 클라우드에 저장해도 괜찮나요?
Firebase는 구글의 보안 인프라를 사용하며 암호화됩니다. 단, 개인정보보호법상 개인정보 처리방침을 학원 홈페이지에 게시해야 합니다. 보안을 강화하려면 Firebase Authentication으로 로그인 인증을 추가하세요.
Firebase 설정이 너무 어려운데 도움받을 수 있나요?
이 가이드 페이지의 설정 코드를 개발자(프리랜서)에게 전달하면 1~2시간 내에 연동 작업이 가능합니다. 크몽, 탈잉 등의 플랫폼에서 "Firebase 연동" 으로 검색하면 저렴하게 도움받을 수 있습니다.

Firebase 저장 데이터 구조

Firebase Realtime Database에 다음과 같은 구조로 데이터가 저장됩니다:

sangsang_factory/ ├── students/ ← 학생 전체 정보 │ ├── S001/ │ │ ├── name: "김민준" │ │ ├── engname: "Kevin" │ │ ├── grade: "초3" │ │ ├── classId: "C01" │ │ ├── car: 1 │ │ ├── boardTime: "15:30" │ │ └── alightTime: "18:00" │ └── S002/ ... │ ├── attendance/ ← 출결 데이터 │ └── S001/ │ ├── 2025-04-13/ │ │ ├── status: "출석" │ │ └── by: "김선생님" │ └── ... │ ├── tuition/ ← 원비 납부 내역 ├── route/ ← 차량 노선 데이터 ├── cars/ ← 호차 정보 ├── classes/ ← 반 정보 ├── points/ ← 포인트 기록 ├── scholar/ ← 장학카드 내역 ├── finance/ ← 원비 미납 목록 └── accounts/ ← 계정 정보

도움이 필요하신가요?

위 가이드를 따라 Firebase를 설정하시거나,
프리랜서 개발자에게 Firebase 연동을 의뢰하시면
모든 기기에서 실시간 데이터 공유가 가능합니다.

상상팩토리 통합 관제 시스템 v3.0