🗄️ Supabase 설정 가이드

인 다이렉트 카보험 – 공용 DB 초기 설정 (약 5분 소요)

⚠️
522 오류 – Supabase 프로젝트가 일시 정지 상태입니다
Supabase 무료 플랜은 1주일 이상 미접속 시 프로젝트가 자동 정지됩니다.
아래 버튼을 클릭해 프로젝트를 다시 활성화하면 즉시 해결됩니다.
🔄 Supabase 대시보드에서 재활성화
📋 재활성화 방법 (30초 소요)
1 위 버튼 클릭 → Supabase 대시보드 열기 (로그인 필요)
2 화면 중앙에 "This project is paused" 또는 "프로젝트가 일시 정지됨" 배너가 보임
3 "Restore project" 버튼 클릭 → 1~2분 대기 (초록색 점이 켜지면 완료)
4 이 페이지로 돌아와서 "🔗 재활성화 후 연결 재시도" 클릭
💡 Supabase 무료 플랜 자동 정지 정책: 7일 이상 API 요청이 없으면 자동 정지됩니다.
→ 정지 방지: 주기적으로 로그인하거나, Pro 플랜($25/월)으로 업그레이드하면 자동 정지가 없습니다.
→ 2달 내 광고·고객 유입 계획이 있으시다면 Pro 플랜 전환을 권장합니다.
① 대시보드
접속
② SQL Editor
열기
③ SQL
붙여넣기
④ Run
실행
⑤ 연결
테스트
🎉
Supabase 설정 완료!

DB 테이블이 생성됐습니다. 이제 직원 전산에서 로그인하여 사용하세요.

🔐 직원 로그인 📊 대시보드
🔑 연결 정보 확인
Project URL https://xvyxjuccfvxvhvbxsraz.supabase.co
Anon Key eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6Inh2eXhqdWNjZnZ4dmh2YnhzcmF6Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzczNDY1OTcsImV4cCI6MjA5MjkyMjU5N30._MDRJij54f-sdiQP9FDN9VOV6-bGbaDjlpr6R0Gmcao
Region 🇯🇵 ap-northeast-1 (도쿄)
프로젝트명 xvyxjuccfvxvhvbxsraz
ℹ️ Anon Key는 브라우저에 공개되는 읽기 키입니다. 민감 데이터는 Row Level Security(RLS)로 보호됩니다.
🖥️ STEP 1 — Supabase 대시보드 접속
1

아래 버튼을 클릭해 대시보드를 여세요

🚀 Supabase 대시보드 열기
💡 로그인이 필요합니다. Supabase 계정이 없으면 supabase.com 에서 무료 가입하세요.
supabase.com/dashboard/project/xvyxjuccfvxvhvbxsraz
S
🏠
📋
⌨️
🔒
좌측 메뉴에서 찾아야 할 항목:
⌨️ SQL Editor ← 이것을 클릭!
📝 STEP 2 — SQL Editor 열기
1

좌측 메뉴에서 SQL Editor 클릭

대시보드 왼쪽 사이드바에서 ⌨️ SQL Editor 를 찾아 클릭하세요.

2

New Query 버튼 클릭

SQL Editor가 열리면 우측 상단 또는 좌측 패널에서 + New query 버튼을 클릭하세요.

supabase.com/dashboard/project/.../sql/new
SQL EDITOR
+ New query
또는 좌측 패널에서도 클릭 가능
-- 여기에 SQL을 붙여넣으면 됩니다
|
▶ Run
📋 STEP 3 — SQL 전체 복사 & 붙여넣기
1

아래 버튼으로 SQL 전체 복사

✅ 복사 후 SQL Editor 화면에 Ctrl + V (Mac: Cmd+V) 로 붙여넣으세요.
2

SQL 내용 (참고용)

-- ================================================================
-- 인 다이렉트 카보험 DB 초기화 SQL (한번만 실행하면 됩니다)
-- ================================================================

-- ① 직원 테이블
CREATE TABLE IF NOT EXISTS staff (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  staff_id TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL,
  name TEXT NOT NULL,
  role TEXT DEFAULT 'staff',
  dept TEXT, title TEXT, phone TEXT, email TEXT,
  permissions JSONB DEFAULT '[]',
  active BOOLEAN DEFAULT true,
  last_login TIMESTAMPTZ,
  created_at TIMESTAMPTZ DEFAULT now(),
  updated_at TIMESTAMPTZ DEFAULT now(),
  deleted BOOLEAN DEFAULT false
);

-- ② 고객 테이블
CREATE TABLE IF NOT EXISTS customers (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  name TEXT NOT NULL, phone TEXT, email TEXT,
  gender TEXT, birth_year TEXT, resident_num TEXT,
  address TEXT, bank_account TEXT, card_number TEXT,
  car_number TEXT, car_model TEXT, insurer TEXT,
  start_date DATE, expiry_date DATE, premium BIGINT,
  contract_type TEXT, referrer TEXT, assigned_staff TEXT,
  status TEXT DEFAULT 'active', notice TEXT,
  photos JSONB DEFAULT '[]', profile_photo TEXT,
  join_date DATE DEFAULT CURRENT_DATE,
  source TEXT DEFAULT 'staff',
  created_at TIMESTAMPTZ DEFAULT now(),
  updated_at TIMESTAMPTZ DEFAULT now(),
  deleted BOOLEAN DEFAULT false
);

-- ③ 계약 테이블
CREATE TABLE IF NOT EXISTS contracts (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  customer_id UUID REFERENCES customers(id),
  car_number TEXT, car_model TEXT, insurer TEXT,
  insured TEXT, insured_phone TEXT,
  contractor TEXT, contractor_phone TEXT,
  start_date DATE, expiry_date DATE, premium BIGINT,
  renewal_status TEXT DEFAULT 'pending',
  contract_type TEXT, referrer TEXT,
  assigned_to TEXT, memo TEXT,
  status TEXT DEFAULT 'active',
  created_at TIMESTAMPTZ DEFAULT now(),
  updated_at TIMESTAMPTZ DEFAULT now(),
  deleted BOOLEAN DEFAULT false
);

-- ④ 파트너 테이블
CREATE TABLE IF NOT EXISTS partners (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  partner_id TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL, name TEXT NOT NULL,
  type TEXT DEFAULT 'dealer', phone TEXT, email TEXT,
  biz_number TEXT, address TEXT,
  status TEXT DEFAULT 'pending',
  assigned_staff TEXT, notice TEXT, memo TEXT,
  reject_reason TEXT,
  photos JSONB DEFAULT '[]', profile_photo TEXT,
  join_date DATE DEFAULT CURRENT_DATE,
  created_at TIMESTAMPTZ DEFAULT now(),
  updated_at TIMESTAMPTZ DEFAULT now(),
  deleted BOOLEAN DEFAULT false
);

-- ⑤ 유입 고객 테이블 (웹/광고 DM)
CREATE TABLE IF NOT EXISTS leads (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  name TEXT NOT NULL, phone TEXT NOT NULL,
  car_number TEXT, car_model TEXT,
  insurer TEXT, expiry_date DATE, message TEXT,
  source TEXT DEFAULT 'web',
  ad_code TEXT, utm_source TEXT, utm_campaign TEXT,
  status TEXT DEFAULT 'new',
  assigned_to TEXT, memo TEXT,
  created_at TIMESTAMPTZ DEFAULT now(),
  updated_at TIMESTAMPTZ DEFAULT now(),
  deleted BOOLEAN DEFAULT false
);

-- ⑥ 공지사항
CREATE TABLE IF NOT EXISTS notices (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  title TEXT NOT NULL, content TEXT,
  priority TEXT DEFAULT 'normal',
  author TEXT, target TEXT DEFAULT 'all',
  created_at TIMESTAMPTZ DEFAULT now(),
  updated_at TIMESTAMPTZ DEFAULT now(),
  deleted BOOLEAN DEFAULT false
);

-- ⑦ 이력 로그
CREATE TABLE IF NOT EXISTS history_logs (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  target_id TEXT, target_type TEXT,
  staff_id TEXT, staff_name TEXT, action TEXT,
  created_at TIMESTAMPTZ DEFAULT now()
);

-- ⑧ 샘플 직원 데이터 삽입
INSERT INTO staff (staff_id, password, name, role, dept, title, active) VALUES
  ('admin',      'admin123',  '대표자',   'admin',     '경영',   '대표',    true),
  ('secretary1', 'sec123',    '이비서',   'secretary', '관리',   '비서',    true),
  ('staff1',     'staff123',  '김직원',   'staff',     '영업1팀','팀장',    true),
  ('staff2',     'staff123',  '박직원',   'staff',     '영업2팀','사원',    true)
ON CONFLICT (staff_id) DO NOTHING;

-- ⑨ RLS 활성화 (보안)
ALTER TABLE staff        ENABLE ROW LEVEL SECURITY;
ALTER TABLE customers    ENABLE ROW LEVEL SECURITY;
ALTER TABLE contracts    ENABLE ROW LEVEL SECURITY;
ALTER TABLE partners     ENABLE ROW LEVEL SECURITY;
ALTER TABLE leads        ENABLE ROW LEVEL SECURITY;
ALTER TABLE notices      ENABLE ROW LEVEL SECURITY;
ALTER TABLE history_logs ENABLE ROW LEVEL SECURITY;

-- ⑩ 개발용 전체 허용 정책 (중복 생성 방지)
DO $$ BEGIN
  IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE tablename='staff'        AND policyname='allow_all') THEN
    CREATE POLICY "allow_all" ON staff        FOR ALL USING (true) WITH CHECK (true); END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE tablename='customers'    AND policyname='allow_all') THEN
    CREATE POLICY "allow_all" ON customers    FOR ALL USING (true) WITH CHECK (true); END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE tablename='contracts'    AND policyname='allow_all') THEN
    CREATE POLICY "allow_all" ON contracts    FOR ALL USING (true) WITH CHECK (true); END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE tablename='partners'     AND policyname='allow_all') THEN
    CREATE POLICY "allow_all" ON partners     FOR ALL USING (true) WITH CHECK (true); END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE tablename='leads'        AND policyname='allow_all') THEN
    CREATE POLICY "allow_all" ON leads        FOR ALL USING (true) WITH CHECK (true); END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE tablename='notices'      AND policyname='allow_all') THEN
    CREATE POLICY "allow_all" ON notices      FOR ALL USING (true) WITH CHECK (true); END IF;
  IF NOT EXISTS (SELECT 1 FROM pg_policies WHERE tablename='history_logs' AND policyname='allow_all') THEN
    CREATE POLICY "allow_all" ON history_logs FOR ALL USING (true) WITH CHECK (true); END IF;
END $$;

-- ⑪ Realtime 활성화 (실시간 알람)
ALTER PUBLICATION supabase_realtime ADD TABLE leads;
ALTER PUBLICATION supabase_realtime ADD TABLE customers;
ALTER PUBLICATION supabase_realtime ADD TABLE contracts;
▶ STEP 4 — Run 버튼 클릭해서 실행
1

SQL Editor 우측 상단 ▶ Run 버튼 클릭

또는 단축키 Ctrl + Enter (Mac: Cmd+Enter)

SQL Editor — 실행 결과
실행 결과 예시:
✅ 성공 (정상)
Success. No rows returned
⚠️ 이 오류는 정상 (이미 테이블 존재)
ERROR: relation "staff" already exists
→ CREATE TABLE IF NOT EXISTS 이므로 건너뜀, 나머지 실행됨
❌ 실제 오류 (조치 필요)
permission denied for table ...
→ 아래 "오류 해결" 섹션 참고
2

Table Editor에서 테이블 생성 확인

왼쪽 메뉴 📋 Table Editor 클릭 → 아래 테이블들이 보이면 성공입니다:

staff customers contracts partners leads notices history_logs
🔗 STEP 5 — 연결 테스트
1

아래 버튼을 클릭해 연결을 확인하세요

SQL 실행 후 직원 4명이 나오면 완전히 성공입니다.

🔄 Supabase 프로젝트에 직접 연결하여 직원 데이터를 조회합니다.
🔧 오류 해결 가이드
오류 1: 테이블이 이미 존재할 때
ERROR: relation "staff" already exists
정상입니다. CREATE TABLE IF NOT EXISTS 구문이므로 이미 있으면 건너뜁니다.
나머지 INSERT, RLS, Realtime 구문은 정상 실행됩니다. 그대로 진행하세요.
오류 2: RLS 정책이 이미 있을 때
ERROR: policy "allow_all" for table "staff" already exists
정상입니다. SQL에 IF NOT EXISTS 조건이 포함되어 있어 중복 생성을 방지합니다.
오류처럼 보여도 전체 실행이 완료됩니다.
오류 3: 권한 오류
permission denied for table ... / must be owner of table ...
프로젝트 소유자가 아닌 계정으로 로그인한 경우입니다.
→ Supabase에서 로그아웃 후 프로젝트를 만든 본인 계정으로 다시 로그인하세요.
오류 4: Realtime 오류
ERROR: publication "supabase_realtime" does not exist
⚠️ Realtime 기능 미활성화 상태입니다.
→ Supabase 대시보드 → Database → Replication → Realtime을 활성화한 후 마지막 3줄만 다시 실행하세요.
오류 5: 연결 테스트 실패 (직원 0명)
연결 성공이지만 직원 0명 (테이블이 비어 있음)
⚠️ INSERT INTO staff 부분만 다시 실행해 보세요:
INSERT INTO staff (staff_id, password, name, role, dept, title, active) VALUES
  ('admin',      'admin123',  '대표자',   'admin',     '경영',   '대표',    true),
  ('secretary1', 'sec123',    '이비서',   'secretary', '관리',   '비서',    true),
  ('staff1',     'staff123',  '김직원',   'staff',     '영업1팀','팀장',    true),
  ('staff2',     'staff123',  '박직원',   'staff',     '영업2팀','사원',    true)
ON CONFLICT (staff_id) DO NOTHING;
🔗 직원별 전용 접속 URL

각 직원에게 아래 URL을 카카오톡 또는 문자로 공유하세요.
링크를 클릭하면 아이디가 자동 입력되고, 비밀번호만 입력하면 바로 로그인됩니다.

⚠️ 비밀번호는 처음 로그인 후 직원에게 변경하도록 안내하세요.
기본 비밀번호: admin → admin123 / secretary1 → sec123 / staff1,2 → staff123
🚀 설정 완료 후 다음 단계
🔐
직원 로그인
admin / admin123
📊
대시보드
로그인 후 이동
📋
Google Sheets 연동
데이터 백업·공유
⚙️
시스템 설정
직원 정보·연락처
✅ SQL 실행 완료 후 staff-login.html에서 admin / admin123 으로 로그인하면
Supabase DB와 연결된 직원 전산을 모든 장소에서 사용할 수 있습니다.