BizSpring.ai

์ง€์‹์„ผํ„ฐ / ๋ ˆํผ๋Ÿฐ์Šค

๐Ÿ”€ ์„œ๋ธŒ๋ฐฉ ํ•ธ๋“œ์˜คํ”„: SoM ๋ถ„์„ ์„ค์ • ๋ชจ๋‹ฌ v2

# ๐Ÿ”€ ์„œ๋ธŒ๋ฐฉ ํ•ธ๋“œ์˜คํ”„: SoM ๋ถ„์„ ์„ค์ • ๋ชจ๋‹ฌ > ๋ฉ”์ธ๋ฐฉ ์ž‘์„ฑ: 2026-02-17 (v2 ์—…๋ฐ์ดํŠธ) > ์„œ๋ธŒ๋ฐฉ ํ”„๋กœํ† ์ฝœ: โ‘ ์ž‘์—…์„ค๋ช…+์Šน์ธ๋Œ€๊ธฐ โ‘ก์Šน์ธ ํ›„ ์‹คํ–‰ โ‘ข๊ฒฐ๊ณผ๋ณด๊ณ  --- ## ์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ | Phase | ์ž‘์—… | ์ƒํƒœ | ๋น„๊ณ  | |-------|------|:-

ํ•ต์‹ฌ ์š”์•ฝ

    # ๐Ÿ”€ ์„œ๋ธŒ๋ฐฉ ํ•ธ๋“œ์˜คํ”„: SoM ๋ถ„์„ ์„ค์ • ๋ชจ๋‹ฌ

    > ๋ฉ”์ธ๋ฐฉ ์ž‘์„ฑ: 2026-02-17 (v2 ์—…๋ฐ์ดํŠธ)

    > ์„œ๋ธŒ๋ฐฉ ํ”„๋กœํ† ์ฝœ: โ‘ ์ž‘์—…์„ค๋ช…+์Šน์ธ๋Œ€๊ธฐ โ‘ก์Šน์ธ ํ›„ ์‹คํ–‰ โ‘ข๊ฒฐ๊ณผ๋ณด๊ณ 

    ---

    ์ „์ฒด ์ง„ํ–‰ ์ƒํƒœ

    Phase์ž‘์—…์ƒํƒœ๋น„๊ณ 
    A1gp_geoex_som_usage ํ…Œ์ด๋ธ”โœ… ์™„๋ฃŒDDL ์‹คํ–‰
    A2check_som_quota() RPCโœ… ์™„๋ฃŒ์–ด๋“œ๋ฏผ ์ด์ค‘ํ™•์ธ + RLS
    A3increment_som_usage() RPCโœ… ์™„๋ฃŒUPSERT + overage
    A4Realtime Publicationโœ… ์™„๋ฃŒgp_geoex_som_results ๋“ฑ๋ก
    A5Premium-2 WF ๋ณ‘๋ ฌํ™”โœ… ์™„๋ฃŒv9.3โ†’v9.4 (B์•ˆ)
    B1queriesReviewed UXโœ… ์™„๋ฃŒ์ปค๋ฐ‹ cf78b2b
    B2SoM ๋ผ์ด๋ธŒ ํ”ผ๋“œโœ… ์™„๋ฃŒ์ปค๋ฐ‹ cf78b2b
    B3SomAnalysisModal ์ปดํฌ๋„ŒํŠธ๐Ÿ”ฒ Phase B ์ž”์—ฌ์„œ๋ธŒ๋ฐฉ ์ž์œจ
    B4QueryListSubModal๐Ÿ”ฒ Phase B ์ž”์—ฌ์„œ๋ธŒ๋ฐฉ ์ž์œจ
    B5SoM ํŽ˜์ด์ง€ ์—ฐ๋™๐Ÿ”ฒ Phase B ์ž”์—ฌ์„œ๋ธŒ๋ฐฉ ์ž์œจ
    B6TrialModal ์ฒด์ด๋‹๐Ÿ”ฒ Phase B ์ž”์—ฌ์„œ๋ธŒ๋ฐฉ ์ž์œจ
    C1SoM Orchestrator WF ์ˆ˜์ •โณ ๋Œ€๊ธฐ๋ฉ”์ธ๋ฐฉ ์Šน์ธ ํ•„์š”
    C2Quota ์ฒดํฌ WF ์ถ”๊ฐ€โณ ๋Œ€๊ธฐ๋ฉ”์ธ๋ฐฉ ์Šน์ธ ํ•„์š”

    ---

    ๋ฐฐ๊ฒฝ

    SoM ๋ถ„์„ ์‹คํ–‰/์žฌ์‹คํ–‰์„ ์œ„ํ•œ ๊ณต์šฉ ์„ค์ • ๋ชจ๋‹ฌ ์‹ ๊ทœ ๊ฐœ๋ฐœ.

    ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ

    1. ์—…์ข…(industry) null โ†’ ์ฟผ๋ฆฌ ํ’ˆ์งˆ ์ €ํ•˜: ๋ชจ๋‹ฌ์—์„œ ์—…์ข… ํ•„์ˆ˜ ์ž…๋ ฅ
    2. ์žฌ๋ถ„์„ ๋ถˆ๊ฐ€: SoM ํŽ˜์ด์ง€์—์„œ ์ง์ ‘ ์‹คํ–‰ ๊ฐ€๋Šฅ
    3. ์–ด๋“œ๋ฏผ ๋Œ€ํ–‰ ๋ถˆ๊ฐ€: ์–ด๋“œ๋ฏผ ํŒจ๋„์—์„œ ๊ณ ๊ฐ์‚ฌ ๋Œ€์‹  ์‹คํ–‰ ๊ฐ€๋Šฅ

    ---

    โœ… ๋ฉ”์ธ๋ฐฉ ์™„๋ฃŒ ์‚ฌํ•ญ

    A1~A3. Quota ๋ฐฑ์—”๋“œ

    A4. Realtime Publication

    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 ๊ตฌ๋…:

    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

    {
      "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

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

    Submit ํ•ธ๋“ค๋Ÿฌ

    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.tsxAliasTagInput, ๊ฒฝ์Ÿ์‚ฌ ์นด๋“œ
    useCompetitorManagement.ts๊ฒฝ์Ÿ์‚ฌ CRUD
    useSettingsData.tsbrand_settings ๋กœ๋“œ
    save_trial_competitors RPC๊ฒฝ์Ÿ์‚ฌ ์ €์žฅ

    ---

    ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค

    ๋‹ค๋ฅธ ํ‘œํ˜„: Markdown ยท JSON ยท ์ตœ์ข… ๊ฐฑ์‹  2026-08-24