# 🔀 서브방 핸드오프: SoM 분석 설정 모달 v2

> # 🔀 서브방 핸드오프: SoM 분석 설정 모달 > 메인방 작성: 2026-02-17 (v2 업데이트) > 서브방 프로토콜: ①작업설명+승인대기 ②승인 후 실행 ③결과보고 --- ## 전체 진행 상태 | Phase | 작업 | 상태 | 비고 | |-------|------|:-

## 핵심 요약


# 🔀 서브방 핸드오프: SoM 분석 설정 모달

> 메인방 작성: 2026-02-17 (v2 업데이트)
> 서브방 프로토콜: ①작업설명+승인대기 ②승인 후 실행 ③결과보고

---

## 전체 진행 상태

| Phase | 작업 | 상태 | 비고 |
|-------|------|:----:|------|
| A1 | gp_geoex_som_usage 테이블 | ✅ 완료 | DDL 실행 |
| A2 | check_som_quota() RPC | ✅ 완료 | 어드민 이중확인 + RLS |
| A3 | increment_som_usage() RPC | ✅ 완료 | UPSERT + overage |
| A4 | Realtime Publication | ✅ 완료 | gp_geoex_som_results 등록 |
| A5 | Premium-2 WF 병렬화 | ✅ 완료 | v9.3→v9.4 (B안) |
| B1 | queriesReviewed UX | ✅ 완료 | 커밋 cf78b2b |
| B2 | SoM 라이브 피드 | ✅ 완료 | 커밋 cf78b2b |
| B3 | SomAnalysisModal 컴포넌트 | 🔲 Phase B 잔여 | 서브방 자율 |
| B4 | QueryListSubModal | 🔲 Phase B 잔여 | 서브방 자율 |
| B5 | SoM 페이지 연동 | 🔲 Phase B 잔여 | 서브방 자율 |
| B6 | TrialModal 체이닝 | 🔲 Phase B 잔여 | 서브방 자율 |
| **C1** | **SoM Orchestrator WF 수정** | **⏳ 대기** | **메인방 승인 필요** |
| **C2** | **Quota 체크 WF 추가** | **⏳ 대기** | **메인방 승인 필요** |

---

## 배경

SoM 분석 실행/재실행을 위한 **공용 설정 모달** 신규 개발.

### 해결하는 문제
1. **업종(industry) null → 쿼리 품질 저하**: 모달에서 업종 필수 입력
2. **재분석 불가**: SoM 페이지에서 직접 실행 가능
3. **어드민 대행 불가**: 어드민 패널에서 고객사 대신 실행 가능

---

## ✅ 메인방 완료 사항

### A1~A3. Quota 백엔드

- `gp_geoex_som_usage` 테이블 — RLS, UNIQUE(user_id, site_domain, period_start)
- `check_som_quota(p_user_id, p_site_domain, p_is_admin)` → allowed, remaining, limit, used
- `increment_som_usage(p_user_id, p_site_domain, p_executed_by)` → UPSERT

### A4. Realtime Publication

```sql
ALTER PUBLICATION supabase_realtime ADD TABLE gp_geoex_som_results;
```

### A5. Premium-2 WF 병렬화 (v9.4)

WF: https://bawee.app.n8n.cloud/workflow/4ZSWwyYmqVqEOVVjyEWSM

```
SplitInBatches → ┬ OpenAI → Save → Merge[0] ─┐
                 ├ Anthropic → Save → Merge[1] ─┤→ Loop
                 ├ Perplexity → Save → Merge[2] ─┤
                 └ Gemini → Save → Merge[3] ─┘
```

LLM별 즉시 개별 저장 → Realtime 3~8초 간격 1건씩 수신

---

## ✅ 작업 1+2 (커밋 cf78b2b)

### queriesReviewed UX

| 상황 | 라디오 | force_regenerate |
|------|:---:|:---:|
| 쿼리 0개 | 숨김 | true |
| 쿼리 있음 + 미확인 | 숨김 | true |
| 쿼리 있음 + 확인함 + 기존 유지 | 표시 | false |
| 쿼리 있음 + 확인함 + 재생성 | 표시 | true |

### SoM 라이브 피드

Realtime 구독:
```typescript
const channel = baweeSupabase
  .channel(`som-results-${siteDomain}`)
  .on('postgres_changes', {
    event: 'INSERT', schema: 'public',
    table: 'gp_geoex_som_results',
    filter: `site_domain=eq.${siteDomain}`
  }, (payload) => { /* payload.new = LLM 결과 1건 */ })
  .subscribe();
```

---

## ⏳ Phase C (메인방 승인 필요)

### C1. SoM Orchestrator 파라미터

WF: SXdgnGyUFMAP9oTB
https://bawee.app.n8n.cloud/workflow/SXdgnGyUFMAP9oTB

```json
{
  "force_regenerate_queries": false,
  "skip_report": true,
  "executed_by": "user"
}
```

### C2. Quota 체크

CONFIG 직후 → check_som_quota → If allowed=false → 에러 → 완료 후 increment_som_usage

---

## Phase B 잔여 (서브방 자율)

### B3. SomAnalysisModal Props

```typescript
interface SomAnalysisModalProps {
  open: boolean;
  onOpenChange: (open: boolean) => void;
  siteDomain: string;
  userId: string;
  mode: 'user' | 'admin';
  adminTargetUserId?: string;
  onAnalysisStarted?: () => void;
}
```

### Submit 핸들러

```typescript
await fetch('https://bawee.app.n8n.cloud/webhook/geo/som/pipeline', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    user_id, site_domain,
    force_regenerate_queries: queryMode === 'regenerate',
    skip_report: true,
    executed_by: mode === 'admin' ? `admin:${userId}` : 'user'
  })
});
```

### B4. QueryListSubModal

쿼리 목록/수정/삭제(soft)/추가, 5~30개 제한

### 참조 코드

| 파일 | 참조 이유 |
|------|----------|
| TrialModal.tsx | AliasTagInput, 경쟁사 카드 |
| useCompetitorManagement.ts | 경쟁사 CRUD |
| useSettingsData.ts | brand_settings 로드 |
| save_trial_competitors RPC | 경쟁사 저장 |

---

## 테스트 시나리오

- T1: dentistestore.kr (20쿼리) → 모달 → 간편재분석 → force_regenerate:false
- T2: 새 사이트 (쿼리 0개) → 자동 생성 → force_regenerate:true
- T3: 업종 변경 → 재생성 → force_regenerate:true
- T4: 어드민 모드 → quota 무제한 → increment 미호출
- T5: 라이브 피드 → 3~8초 간격 → 80건 → 3초 후 자동 종료

## FAQ


---
출처: https://bizspring.ai/kb/ref/khub/geocare-서브방-핸드오프-som-분석-설정-모달-v2 · 최종 갱신 2026-08-24T11:53:44.5731+00:00
