# Supabase 설정 가이드

AgentC Starter Kit에서 Supabase를 백엔드로 사용하는 완전한 설정 가이드입니다.

## 📋 목차

- [Supabase 프로젝트 생성](#supabase-프로젝트-생성)
- [환경 변수 설정](#환경-변수-설정)
- [데이터베이스 설정](#데이터베이스-설정)
- [인증 설정](#인증-설정)
- [스토리지 설정](#스토리지-설정)
- [보안 정책](#보안-정책)
- [API 사용법](#api-사용법)

## 🚀 Supabase 프로젝트 생성

### 1. 새 프로젝트 생성

1. [Supabase Dashboard](https://supabase.com/dashboard) 접속
2. "New Project" 클릭
3. 프로젝트 정보 입력:
   - **Project Name**: `customer-website`
   - **Database Password**: 강력한 비밀번호 생성 (저장 필요!)
   - **Region**: `Asia Pacific (Seoul)` 선택 (한국 사용자용)

### 2. 프로젝트 정보 확인

프로젝트 생성 후 다음 정보를 복사:

1. **Settings > API**에서:
   - Project URL
   - anon/public key
   - service_role key (관리자용)

2. **Settings > Database**에서:
   - Connection string

## 🔧 환경 변수 설정

### .env.local 파일 생성

```env
# Supabase Configuration
DATABASE_URL="postgresql://postgres:[YOUR-PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres"
SUPABASE_URL="https://[PROJECT-REF].supabase.co"
SUPABASE_ANON_KEY="eyJ..."
SUPABASE_SERVICE_ROLE_KEY="eyJ..."

# NextAuth.js Configuration
NEXTAUTH_URL="http://localhost:3000"
NEXTAUTH_SECRET="your-nextauth-secret-key"

# File Upload Configuration
UPLOAD_MAX_SIZE="10485760" # 10MB
UPLOAD_ALLOWED_TYPES="image/*,video/*,application/pdf"

# Optional: Analytics
GOOGLE_ANALYTICS_ID="G-XXXXXXXXXX"
```

### 환경 변수 설명

| 변수명 | 설명 | 필수 |
|--------|------|------|
| `DATABASE_URL` | PostgreSQL 연결 문자열 | ✅ |
| `SUPABASE_URL` | Supabase 프로젝트 URL | ✅ |
| `SUPABASE_ANON_KEY` | 공개 API 키 | ✅ |
| `SUPABASE_SERVICE_ROLE_KEY` | 관리자 API 키 | 🔒 |
| `NEXTAUTH_SECRET` | 인증 암호화 키 | ✅ |

## 🗄️ 데이터베이스 설정

### 1. Prisma 스키마 동기화

```bash
# 기존 스키마를 Supabase에 적용
npx prisma db push

# Prisma 클라이언트 생성
npx prisma generate

# 데이터베이스 스키마 확인
npx prisma studio
```

### 2. 초기 데이터 설정 (선택사항)

```sql
-- 관리자 사용자 생성 (Supabase SQL Editor에서 실행)
INSERT INTO users (id, email, name, role) VALUES 
('admin-user-id', 'admin@example.com', 'Admin User', 'ADMIN');

-- 기본 페이지 생성
INSERT INTO pages (title, slug, content, published) VALUES 
('홈페이지', 'home', '메인 페이지 콘텐츠', true),
('회사 소개', 'about', '회사 소개 콘텐츠', true);
```

## 🔐 인증 설정

### 1. Supabase Auth 설정

**Authentication > Settings**에서:

1. **Site URL**: `http://localhost:3000` (개발용)
2. **Redirect URLs**: `http://localhost:3000/auth/callback`
3. **이메일 템플릿** 커스터마이징 (선택사항)

### 2. 소셜 로그인 설정 (선택사항)

**Authentication > Providers**에서 원하는 제공자 활성화:

- Google OAuth
- GitHub OAuth
- Discord OAuth

### 3. NextAuth.js 설정

```typescript
// lib/auth.ts
import { createClient } from '@supabase/supabase-js';
import { SupabaseAdapter } from '@auth/supabase-adapter';

const supabase = createClient(
  process.env.SUPABASE_URL!,
  process.env.SUPABASE_SERVICE_ROLE_KEY!
);

export const authOptions = {
  adapter: SupabaseAdapter({
    url: process.env.SUPABASE_URL!,
    secret: process.env.SUPABASE_SERVICE_ROLE_KEY!,
  }),
  providers: [
    // 인증 제공자 설정
  ],
};
```

## 📁 스토리지 설정

### 1. 버킷 생성

**Storage**에서 다음 버킷 생성:

1. **`media`** - 이미지, 비디오 파일
2. **`documents`** - PDF, 문서 파일
3. **`uploads`** - 일반 업로드 파일

### 2. 버킷 정책 설정

```sql
-- 미디어 버킷 공개 읽기 허용
UPDATE storage.buckets 
SET public = true 
WHERE id = 'media';

-- 인증된 사용자만 업로드 허용
CREATE POLICY "Authenticated users can upload" ON storage.objects
FOR INSERT TO authenticated
WITH CHECK (bucket_id = 'media');

-- 모든 사용자 읽기 허용
CREATE POLICY "Public read access" ON storage.objects
FOR SELECT TO public
USING (bucket_id = 'media');
```

### 3. 파일 업로드 API

```typescript
// app/api/upload/route.ts
import { createClient } from '@supabase/supabase-js';

const supabase = createClient(
  process.env.SUPABASE_URL!,
  process.env.SUPABASE_SERVICE_ROLE_KEY!
);

export async function POST(request: Request) {
  const formData = await request.formData();
  const file = formData.get('file') as File;
  
  const { data, error } = await supabase.storage
    .from('media')
    .upload(`uploads/${Date.now()}-${file.name}`, file);
    
  if (error) {
    return Response.json({ error: error.message }, { status: 500 });
  }
  
  return Response.json({ 
    url: `${process.env.SUPABASE_URL}/storage/v1/object/public/media/${data.path}` 
  });
}
```

## 🛡️ 보안 정책 (RLS)

### 1. Row Level Security 활성화

```sql
-- 모든 테이블에 RLS 활성화
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER TABLE pages ENABLE ROW LEVEL SECURITY;
ALTER TABLE media ENABLE ROW LEVEL SECURITY;
ALTER TABLE posts ENABLE ROW LEVEL SECURITY;
```

### 2. 기본 정책 설정

```sql
-- 사용자는 자신의 데이터만 수정 가능
CREATE POLICY "Users can update own data" ON users
FOR UPDATE TO authenticated
USING (id = auth.uid());

-- 관리자는 모든 페이지 관리 가능
CREATE POLICY "Admins can manage pages" ON pages
FOR ALL TO authenticated
USING (
  EXISTS (
    SELECT 1 FROM users 
    WHERE id = auth.uid() AND role = 'ADMIN'
  )
);

-- 게시된 페이지는 모든 사용자가 읽기 가능
CREATE POLICY "Published pages are public" ON pages
FOR SELECT TO public
USING (published = true);
```

## 📡 API 사용법

### 1. Supabase 클라이언트 설정

```typescript
// lib/supabase.ts
import { createClient } from '@supabase/supabase-js';

// 클라이언트용 (브라우저)
export const supabase = createClient(
  process.env.NEXT_PUBLIC_SUPABASE_URL!,
  process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!
);

// 서버용 (API 라우트)
export const supabaseAdmin = createClient(
  process.env.SUPABASE_URL!,
  process.env.SUPABASE_SERVICE_ROLE_KEY!
);
```

### 2. 데이터 조회

```typescript
// 페이지 목록 조회
const { data: pages, error } = await supabase
  .from('pages')
  .select('*')
  .eq('published', true)
  .order('created_at', { ascending: false });

// 특정 페이지 조회
const { data: page } = await supabase
  .from('pages')
  .select('*')
  .eq('slug', 'about')
  .single();
```

### 3. 실시간 업데이트

```typescript
// 실시간 구독
const subscription = supabase
  .channel('page-changes')
  .on('postgres_changes', 
    { event: 'UPDATE', schema: 'public', table: 'pages' },
    (payload) => {
      console.log('페이지가 업데이트됨:', payload);
    }
  )
  .subscribe();

// 구독 해제
subscription.unsubscribe();
```

## 🚀 배포 환경 설정

### 1. Vercel 환경 변수

Vercel Dashboard에서 다음 환경 변수 설정:

```env
DATABASE_URL=postgresql://postgres:[PASSWORD]@db.[PROJECT-REF].supabase.co:5432/postgres
SUPABASE_URL=https://[PROJECT-REF].supabase.co
SUPABASE_ANON_KEY=eyJ...
NEXTAUTH_URL=https://your-domain.com
NEXTAUTH_SECRET=your-production-secret
```

### 2. Supabase 배포 설정

**Authentication > Settings**에서:

1. **Site URL**: `https://your-domain.com`
2. **Redirect URLs**: `https://your-domain.com/auth/callback`

## 🔧 문제 해결

### 1. 연결 문제

```bash
# ���결 테스트
npx prisma db pull

# 스키마 동기화
npx prisma db push --force-reset
```

### 2. 권한 문제

```sql
-- RLS 정책 확인
SELECT * FROM pg_policies WHERE tablename = 'your_table';

-- 정책 비활성화 (개발용)
ALTER TABLE your_table DISABLE ROW LEVEL SECURITY;
```

### 3. 로그 확인

Supabase Dashboard > **Logs**에서:
- API 로그
- 데이터베이스 로그
- 인증 로그

## 📚 추가 리소스

- [Supabase 공식 문서](https://supabase.com/docs)
- [Prisma + Supabase 가이드](https://supabase.com/docs/guides/integrations/prisma)
- [NextAuth.js + Supabase](https://supabase.com/docs/guides/auth/auth-helpers/nextjs)

이제 Supabase가 완전히 설정되어 AgentC Starter Kit과 함께 사용할 준비가 완료되었습니다! 🎉