# DataLayer Schema Reference

GA4 권장 이벤트 기반 DataLayer 스키마 정의.

## Core Principles

1. GTM 스니펫 이전에 dataLayer 초기화
2. 이벤트 발생 시점에 push (사전 아님)
3. ecommerce 객체는 push 전 clear 필수
4. PII 데이터 직접 수집 금지

## Base Structure

### Page Load
```javascript
window.dataLayer = window.dataLayer || [];
dataLayer.push({
  'event': 'page_data',
  'page': {
    'type': 'home|category|product|cart|checkout|thankyou|content|search',
    'name': 'Page Name',
    'category': 'Category/Subcategory',
    'language': 'ko'
  },
  'user': {
    'status': 'logged_in|logged_out',
    'id': 'hashed_user_id',           // SHA256, 로그인 시에만
    'type': 'new|returning|member|guest',
    'loginMethod': 'email|kakao|naver|google'
  }
});
```

## E-commerce Events

### view_item
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
  'event': 'view_item',
  'ecommerce': {
    'currency': 'KRW',
    'value': 29000,
    'items': [{
      'item_id': 'SKU_12345',
      'item_name': 'Product Name',
      'item_brand': 'Brand Name',
      'item_category': 'Category',
      'item_variant': 'Blue / Large',
      'price': 29000,
      'quantity': 1
    }]
  }
});
```

### add_to_cart
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
  'event': 'add_to_cart',
  'ecommerce': {
    'currency': 'KRW',
    'value': 29000,
    'items': [{
      'item_id': 'SKU_12345',
      'item_name': 'Product Name',
      'price': 29000,
      'quantity': 1
    }]
  }
});
```

### begin_checkout
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
  'event': 'begin_checkout',
  'ecommerce': {
    'currency': 'KRW',
    'value': 58000,
    'coupon': 'WELCOME10',
    'items': [/* cart items */]
  }
});
```

### purchase
```javascript
dataLayer.push({ ecommerce: null });
dataLayer.push({
  'event': 'purchase',
  'ecommerce': {
    'transaction_id': 'T_20250115_001',
    'affiliation': 'Store Name',
    'value': 53000,
    'tax': 4818,
    'shipping': 3000,
    'currency': 'KRW',
    'coupon': 'WELCOME10',
    'items': [{
      'item_id': 'SKU_12345',
      'item_name': 'Product Name',
      'price': 29000,
      'quantity': 1
    }]
  }
});
```

## Lead Gen Events

### generate_lead
```javascript
dataLayer.push({
  'event': 'generate_lead',
  'currency': 'KRW',
  'value': 50000,
  'lead': {
    'source': 'contact_form|landing_page',
    'type': 'inquiry|quote_request'
  }
});
```

### form_submit
```javascript
dataLayer.push({
  'event': 'form_submit',
  'form': {
    'id': 'contact_form',
    'name': 'Contact Us Form',
    'type': 'contact',
    'success': true
  }
});
```

## Engagement Events

### login / sign_up
```javascript
dataLayer.push({
  'event': 'login',  // or 'sign_up'
  'method': 'email|kakao|naver|google'
});
```

### search
```javascript
dataLayer.push({
  'event': 'search',
  'search_term': 'user search query',
  'search': {
    'results_count': 42,
    'category': 'product|content'
  }
});
```

## Item Object Reference

| Parameter | Type | Required | Description |
|-----------|------|----------|-------------|
| item_id | string | Yes | SKU |
| item_name | string | Yes | 상품명 |
| price | number | Yes | 단가 |
| quantity | number | Yes | 수량 |
| item_brand | string | No | 브랜드명 |
| item_category | string | No | 카테고리 |
| item_category2-5 | string | No | 하위 카테고리 |
| item_variant | string | No | 옵션 |
| coupon | string | No | 쿠폰 코드 |
| discount | number | No | 할인 금액 |
| index | number | No | 목록 위치 |

## Validation Rules

```javascript
// ✅ Correct
'price': 29000        // number
'quantity': 1         // number
'currency': 'KRW'     // uppercase

// ❌ Wrong
'price': '29000'      // string
'currency': 'krw'     // lowercase
```

### Array Limits
- items[]: 최대 200개
- 초과 시 분할 전송
