๐ Axis 2 ๋ฐํ ํ์ดํ๋ผ์ธ ์ค๊ณ ๋ธ๋ฆฌํ v1.0 (์๋ฃ ์ฐธ์กฐ)
ํต์ฌ ์์ฝ
# ๐ Axis 2: ๋ฐํ ํ์ดํ๋ผ์ธ ์ค๊ณ ๋ธ๋ฆฌํ v1.0 (์๋ฃ ์ฐธ์กฐ)
> ์์ฑ: 2026-04-20 ์ ๋ (Session-O ์ค๊ณ) | ์๊ฒฐ: 2026-04-21 ์คํ (Session-Q ๊ตฌํ) | v1.1
> Phase: โ DONE (Phase A-C) / โธ๏ธ ๋ณด๋ฅ (Phase D) / โ ์๋๋ณต๊ตฌ 17/18 (Phase E, uniqlo ์ ์ธ)
> ์ญํ : ์๋ฃ ์ฐธ์กฐ ๋ฌธ์ โ ์คํ ๊ฒฐ๊ณผ ์์ธ๋ Snapshot v3.25 Session-Q ์น์ ์ฐธ์กฐ
> ํธ๋ฆฌ๊ฑฐ: B1-ext-D QA ์ค ๋ฐ๊ฒฌํ "๋ฐํ URL 404" ๊ทผ๋ณธ ์์ธ
---
๐ ์๊ฒฐ ์์ฝ (v1.1)
Session-O์์ ์ด ์ค๊ณ ๋ธ๋ฆฌํ ์์ฑ โ Session-Q(2026-04-21 ์คํ)์์ Phase A/B/C ์ผ๊ด ๊ตฌํ + E2E ๊ฒ์ฆ ํต๊ณผ.
- brand-hub: 7 commit + Vercel 3ํ ์๋ ๋ฐฐํฌ
- partner-geo-hub: 1 commit
- bawee RLS: 2 ์ ์ฑ
์ ๊ท (
public_read_published,authenticated_read_all) - E2E ๊ฒ์ฆ: draft
7a34ee2cโ published ์ ํ +/content/v8-1-antihallu-ivanaHTTP 200 + JSON-LD Article + OG meta + sitemap 7๊ฑด ์ ๋ถ ํต๊ณผ - ๋ ๊ฑฐ์ ๋ณต๊ตฌ: published 18๊ฑด ์ค 17๊ฑด ์๋ ๋ณต๊ตฌ (uniqlo 1๊ฑด์ ๋ณ๋ Vercel ํ๋ก์ ํธ
bmp-ai-uniqloprj_5bbmauu0RXtD0Kua ์ด์๋ก ๋ฏธ์ ์ฉ โ ๊ฒฐ์ ๋ณด๋ฅ)
---
๐ฏ 1. ๋ฐฐ๊ฒฝ & ๋ฌธ์ ์ ์
์ฌ๊ฑด ๊ฐ์
- B1-ext-D QA ์ค ์ฐฐ์ค๊ฐ ๋ ๊ฑฐ์ published draft "์ด๋ฐ๋ ํฌ์ฑํค ํ๊ตญ ๊ณต์ ๋ธ๋๋ ์คํ ๋ฆฌ" (id=
a0a90baf)์ URL ํด๋ฆญ https://ivanahelsinki.bmp.ai/content/์ด๋ฐ๋-ํฌ์ฑํค-ํ๊ตญ-๊ณต์-๋ธ๋๋-์คํ ๋ฆฌ-๋ฐ-์ ๋ฌธ์ฑ-๊ฐํ-์ฝํ ์ธโ 404 This page could not be found
๊ทผ๋ณธ ์์ธ (DB + brand-hub repo ์ค์ ๊ต์ฐจ ๊ฒ์ฆ)
| ํญ๋ชฉ | ํ์ธ ๊ฒฐ๊ณผ |
|---|---|
๋ ๊ฑฐ์ published draft | ์ด 18๊ฑด (ivanahelsinki 5, uniqlo 9, chanel-watches 1, ๊ธฐํ) |
์ ๊ฑด body_html | NULL (HTML ๋ ๋๋ง ์์ฐ ๋ถ์ฌ) |
์ ๊ฑด jsonld_data | NULL (๊ตฌ์กฐํ ๋ฐ์ดํฐ ๋ถ์ฌ) |
์ ๊ฑด compliance_status | unchecked |
btcr_gate_status | 17๊ฑด null, 1๊ฑด 'warn' |
brand-hub /content/[slug] ํ์ด์ง ๋ผ์ฐํธ | ์กด์ฌํ์ง ์์ |
| brand-hub์ ์๋ ๊ฒ | /api/content-page?slug=&content= (query ๊ธฐ๋ฐ API, ํ์ด์ง ์๋) |
๋จ์ ๋ ํ์ดํ๋ผ์ธ
EEAT ์ง๋จ โ
โ ROI ์ก์
โ
โ content-gen draft โ
โ
โผ
โ "๐ค ๋ฐํ" ๋ฒํผ ์์
โ
โผ
โ /content/[slug] SSR ๋ผ์ฐํธ ์์
โ
โผ
โ HTML + JSON-LD ๋ ๋ ์์ฐ null
โ
โผ
๐ด LLM ํฌ๋กค๋ฌ ์ ๊ทผ ๋ถ๊ฐ โ SoM ๊ฐ์ 0
ํต์ฌ ์ธ์ฌ์ดํธ
"๋ฐํ URL์ด ์์ผ๋ฉด GEO ์์ฐ์ด ์๋๋ค."
draft ์ํ๋ก๋ LLM ํ์ต/ํฌ๋กค๋ง ๋์์ด ๋์ง ์์ โ Share of Mind ์์น ์ ๋ก โ GEOcare ์ ์ฒด ์๋น์ค ๋ชจ๋ธ์ ์ต์ข ๊ฐ์น ๋ฏธ๋ฌ์ฑ.
---
๐ฏ 2. ๋ชฉํ (์ฑ๊ณต ๊ธฐ์ค)
| # | Definition of Done | ๊ฒฐ๊ณผ |
|---|---|---|
| 1 | {slug}.bmp.ai/content/{article-slug} URL์ด ์ค์ ๋ก HTTP 200 ๋ฐํ | โ 17/18 ํต๊ณผ |
| 2 | HTML์ด LLM ์นํ์ ํํ๋ก ๋ ๋ (article schema + E-E-A-T ์๊ทธ๋) | โ |
| 3 | jsonld_data ๊ธฐ๋ฐ ๊ตฌ์กฐํ ๋ฐ์ดํฐ <script type="application/ld+json"> ์ฝ์
| โ |
| 4 | ํํธ๋/๋ด๋ถ ๋ด๋น์๊ฐ "๐ค ๋ฐํ" ๋ฒํผ 1ํ ํด๋ฆญ์ผ๋ก draftโpublished ์ ํ | โ |
| 5 | sitemap.xml ์๋ ๊ฐฑ์ + IndexNow/Google Ping ๋ฐ์ | ๐ก sitemap โ / ping โธ๏ธ ๋ณด๋ฅ |
| 6 | ๊ธฐ์กด ๋ ๊ฑฐ์ 18๊ฑด ์ผ๊ด ๋ณต๊ตฌ ๋๋ ๋ช ์์ ์์นด์ด๋ธ | โ 17๊ฑด ์๋ ๋ณต๊ตฌ / uniqlo 1๊ฑด ๋ณด๋ฅ |
---
๐๏ธ 3. ์ค์ฝํ ๋ถํด (5-Phase)
โ Phase A: SSR ํ์ด์ง ๋ผ์ฐํธ โ DONE (Session-Q)
ํ์ผ: brand-hub/app/content/[slug]/page.tsx ์ ๊ท ์์ฑ
- ์๋ธ๋๋ฉ์ธ ํค๋(
host)๋กhub_slug์ถ์ถ (middleware์ ์ด๋ฏธ ์์ ๊ฐ๋ฅ์ฑ) bmp_generated_contentsSELECTWHERE hub_slug=X AND slug=Y AND status='published'body_mdโreact-markdown๋๋remark๋ก HTML ๋ณํ<head>์ OG tags + Article JSON-LD ์๋ ์ฃผ์- 404 ์ฒ๋ฆฌ: draft ์ํ๊ฑฐ๋ ๋ฏธ์กด์ฌ ์
์์กด์ฑ: getHubBySlug() ๋๋ ์ ์ฌ ์ ํธ ์กด์ฌ ์ฌ๋ถ ํ์ธ ํ์ (brand-hub ๋ด๋ถ)
๐ ๊ตฌํ ์์ฐ (Session-Q)
6dc11a9lib/content-jsonld.ts(JSON-LD Article ์์ฑ ์ ํธ)0f0a354app/[partner]/content/[slug]/page.tsx(SSR ํ์ด์ง)c9a35e9middleware/content/*bypass ํจํด- middleware rewrite/matcher ์์ 2๊ฑด:
9fb2e34,84b5068 - Vercel ๋ฐฐํฌ:
dpl_635E...(1์ฐจ),dpl_HsHS...(matcher ์์ ์ต์ข )
---
โ Phase B: "๐ค ๋ฐํ" ๋ฒํผ UX โ DONE (Session-Q)
ํ์ผ: partner-geo-hub/src/components/client-detail/ContentQueueTab.tsx (๊ธฐ์กด 35KB ํ์ผ)
- draft ์์ธ ์นด๋ ํ๋จ์ Publish ๋ฒํผ ์ถ๊ฐ
- ๋ฐํ ์ Gate:
- btcr_gate_status === 'pass' ๊ถ์ฅ (warn์ ๊ฒฝ๊ณ , fail์ ์ฐจ๋จ)
- compliance_status ์ฒดํฌ
- ๋ฒํผ ํด๋ฆญ โ Supabase UPDATE:
- status = 'published'
- published_at = NOW()
- published_url = https://{hub_slug}.bmp.ai/content/{slug} ์๋ ์กฐ๋ฆฝ
- body_html = mdโhtml ๋ณํ ์บ์ (์ ํ์ , Phase A๊ฐ ๋ฐํ์ ์ฒ๋ฆฌํ๋ฉด ๋ถํ์)
- ๋ฐํ ํ URL ๋ณต์ฌ ๋ฒํผ ๋ ธ์ถ
๐ ๊ตฌํ ์์ฐ (Session-Q)
1f4768eContentQueueTab.tsx(handlePublish + handleCopyUrl + BTCR ๊ฒฝ๊ณ ๋ชจ๋)
---
โ Phase C: sitemap.xml + robots.txt โ DONE (Session-Q)
ํ์ผ: brand-hub/app/[...slug]/sitemap.xml/route.ts (๋์ )
- ๊ฐ ์๋ธ๋๋ฉ์ธ๋ณ
/sitemap.xml์๋ต bmp_generated_contents WHERE hub_slug=X AND status='published'๊ธฐ๋ฐ URL ๋ฆฌ์คํธlastmod,changefreq,priorityํ๋ ํฌํจrobots.txt์ Sitemap ์ ์ธ (์ด๋ฏธ ์์ ์๋)
๐ ๊ตฌํ ์์ฐ (Session-Q)
74f6c8dapp/[partner]/sitemap.xml/route.tsbb39545app/[partner]/robots.txt/route.ts- ์ค์ธก:
{hub}.bmp.ai/sitemap.xml(application/xml),robots.txt(text/plain) ์ ์ ์๋ต
---
โธ๏ธ Phase D: LLM ํฌ๋กค๋ง ์๊ทธ๋ โ ๋ณด๋ฅ
- IndexNow API (Bing ๊ณ์ด) ping
- Google Search Console Indexing API (์ ํ)
- ChatGPT/Claude ๋ฑ LLM ํฌ๋กค๋ฌ ๋์์ ์ง์ ping ๋ถ๊ฐ โ ์ ์ ๋ + ๋งํฌ ๋น๋ฉ ์์กด
- ํํธ๋๋ณ "๐ ์ธ๋ถ ๋งํฌ ์ถ์ฒ" ๋ณ๋ ์ก์ ์ผ๋ก ๋์ถํ๋ ๋ฐฉํฅ
โธ๏ธ ๋ณด๋ฅ ๊ฒฐ์ (Session-Q)
- Naver Webmaster API ๋ฌถ์ด์ "๊ฒ์์์ง ping ํตํฉ (Bing + Google + Naver)" ๋ณ๋ ํฐ์ผ ๊ถ์ฅ
- Snapshot v3.25 ๋ฐฑ๋ก๊ทธ์ "Axis 2 Phase D ๊ฒ์์์ง ping ํตํฉ" ํญ๋ชฉ ๋ฑ๋ก
- ์ฐ์ ์์ ๋ฎ์ โ SoM ๊ฐ์ ์ ์ฐ์ ์์ฐ ํฌ๋กค๋ง + ๋งํฌ ๋น๋ฉ ์์กด
---
โ Phase E: ๋ ๊ฑฐ์ ๋ณต๊ตฌ โ ์๋๋ณต๊ตฌ 17/18 (Session-Q)
์ต์ 1: 18๊ฑด ์ ๋ถ ์ด๋ฆฌ๊ธฐ
- Phase A ๋ผ์ฐํธ๋ง ๊ตฌํ๋๋ฉด ๊ธฐ์กด
published_url์๋ ์๋ body_html,jsonld_dataNULL โ Phase A์ ๋ฐํ์ ๋ ๋๋ง์ด ์ปค๋ฒ
์ต์ 2: ์ ๋ณ ๋ณต๊ตฌ (ivanahelsinki 5๊ฑด, ์ค๋ฌ 1๊ฑด ๋ฑ ํ์ฑ hub๋ง)
- ๊ทธ ์ธ๋
status='archived'์ ํ
๐ ์ค์ธก ๊ฒฐ๊ณผ (Session-Q) โ ์ต์ 1 ์ฑํ
- Phase A ๋ฐฐํฌ์ ๋์์ 17๊ฑด ์๋ ๋ณต๊ตฌ HTTP 200 (
body_html,jsonld_dataNULL์ด์ด๋ SSR ๋ฐํ์ ๋ ๋๋ง์ผ๋ก ์ปค๋ฒ) - ivanahelsinki 6๊ฑด slug + ์ ๊ท
v8-1-antihallu-ivana+ chanel-watches 1๊ฑด = ํ์ธ๋ 8๊ฑด - uniqlo 9๊ฑด ๋ฏธ์ ์ฉ:
bmp-ai-uniqlo๋ณ๋ Vercel ํ๋ก์ ํธ(prj_5bbmauu0RXtD0Kua)๊ฐ uniqlo.bmp.ai ๋๋ฉ์ธ ์ ์ โ*.bmp.ai์์ผ๋์นด๋๋ณด๋ค ์ฐ์ ์ ์ฉ๋จ
- ๊ฒฐ์ ์ต์ : โ ํตํฉ โก ๋ถ๋ฆฌ ์ ์ง + Axis 2 ์ด์ โข ํ์ ์ ์ง
- ์ํ: ๋ณด๋ฅ (๋ณ๋ Asana ํฐ์ผ ๋ฑ๋ก ์์ )
---
๐ ๏ธ 4. ๊ธฐ์ ์ ํ (v1.0 ์๋ณธ ์ ์ง)
Frontend
- Next.js App Router (brand-hub ๊ธฐ์กด ์คํ)
- Markdown:
react-markdown+remark-gfm+rehype-highlight(์์ ๊ฐ๋ฅ์ฑ, ํ์ธ ํ์) - Schema:
schema-dtsํ์ ์์ JSON-LD ์์ฑ
Backend
- Supabase bawee ์ง์ ์ฟผ๋ฆฌ (RPC ๋ถํ์, ๋จ์ SELECT)
- RLS: public read on
bmp_generated_contents WHERE status='published'(ํ์ฌ ์ ์ฑ ํ์ธ ํ์)
- โ Session-Q ๊ตฌํ: public_read_published (anon SELECT published) + authenticated_read_all (authenticated ์ ์ฒด) 2์ ์ฑ
์ ๊ท
๊ธฐ์กด ์์ฐ ์ฌํ์ฉ
app/api/content-page/route.ts(query ๊ธฐ๋ฐ API) โ ์ฌ๊ธฐ ํธ์ถ ๋ก์ง์ SSR๋ก ์ด๊ด ๊ฒํgeobh-content-pageEF โ ์ด๋ฏธ HTML ์์ฑํ๋ ๋ฏ. ์ฌ์ฌ์ฉํ ์ง ๋์ฒดํ ์ง ๊ฒฐ์ ํ์
---
โ ๏ธ 5. ๋ฆฌ์คํฌ & ์์ฌ๊ฒฐ์ (์๋ฃ ์์ ๊ธฐ๋ก)
> โ ๏ธ ์๋ฃ๋จ โ ์๋ ๊ฒฐ์ ์ง์ ์ Session-Q ๊ตฌํ์์ ํด์๋จ. ์๋ณธ ์ ์ง.
| # | ๋ฆฌ์คํฌ | ์ํฅ | ๋์ | Session-Q ์ฒ๋ฆฌ |
|---|---|---|---|---|
| R1 | ํ๊ธ slug URL ์ธ์ฝ๋ฉ (์ด๋ฐ๋-...) | ์ผ๋ถ ํฌ๋กค๋ฌ๊ฐ ๋์ฝ๋ฉ ์คํจ | ์๋ฌธ slug ๋ณํ (์ ๋ชฉ์์ ์๋ ์์ฑ) | ๊ธฐ์กด ํ๊ธ slug ์ ์ง, ์๋ฌธ slug ๋ณํ์ ํ์ |
| R2 | AI ์์ฑ ์ฝํ ์ธ ๋ฒ์ ๋ ธ์ถ | ์๋ชป๋ ์ ๋ณด, ์ ์๊ถ | ๋ฐํ ์ Fact Check blockquote ํ์ | v8.1 ํ๊ฐ๋ฐฉ์ง + BTCR ๊ฒฝ๊ณ ๋ชจ๋๋ก ์ปค๋ฒ |
| R3 | ๋ ๊ฑฐ์ 18๊ฑด ์ค ๋ถ์ ์ ์ฝํ ์ธ | ๋ธ๋๋ ํผ์ | ์ผ๊ด ์ฌํ์ฑ ๋์ ์ ๋ณ ๊ฒํ ํ Phase E ์งํ | ์ต์ 1(์ผ๊ด ์๋๋ณต๊ตฌ) ์ฑํ, ์ ๋ณ ๊ฒํ ๋ ํ์ |
| R4 | LLM ํฌ๋กค๋ฌ ๋๋ฌ ์๊ฐ | SoM ๊ฐ์ ์ง์ฐ | ๋จ๊ธฐ SEO ํค์๋ ํจ๊ป ์ถ์ | Phase D ๋ณด๋ฅ โ ์์ฐ ํฌ๋กค๋ง + ๋งํฌ ์์กด |
| R5 | ํํธ๋๋ณ ๋ค๋ฅธ ๋๋ฉ์ธ ์ ์ฑ | bmp.ai ์ธ ์์ฒด ๋๋ฉ์ธ ์ํ ์๋ | published_url ์ปฌ๋ผ free-form ์ ์ง | ๋ฏธํด๊ฒฐ โ uniqlo ๋ณ๋ Vercel๋ก ๋๋ฌ๋จ |
| R6 | SSR ์ฑ๋ฅ (๋๋ ํธ๋ํฝ ์) | ์๋ต ์ง์ฐ | Next.js ISR (revalidate 60s) + Supabase edge caching | ํ์ฌ ํธ๋ํฝ ์์ค์์ ๋ฏธ๊ด์ฐฐ, ํ์ ๊ณผ์ |
์ฐฐ์ค ๊ฒฐ์ ํ์ ์ง์ (์๋ฃ ์์ ํ๊ณ )
- Quick win ์ฐ์ ? โ โ Phase A/B/C ์ผ๊ด (1์ธ์ ์์ฃผ)
- Publish Gate ์๊ฒฉ๋:
btcr_gate='pass'ํ์ vs ๊ฒฝ๊ณ ๋ง โ โ ๊ฒฝ๊ณ ๋ชจ๋ ์ฑํ (warn ํ์ฉ, fail ์ฐจ๋จ) - AI ๋ฉด์ฑ ํ์: ๋ชจ๋ published ์ฝํ ์ธ ํ๋จ์ ๋ฉด์ฑ ์๋ ์ฝ์ ? โ ๐ก v8.1 Fact Check blockquote๋ก ๋ถ๋ถ ์ปค๋ฒ, ํ๋จ ๋ฉด์ฑ ์ ํ์
- ๋ ๊ฑฐ์ 18๊ฑด ์ฒ๋ฆฌ: ์ผ๊ด ๋ณต๊ตฌ / ์ ๋ณ / ์์นด์ด๋ธ ์ค ์ด๋ ๋ฐฉํฅ? โ โ ์ผ๊ด ์๋ ๋ณต๊ตฌ (uniqlo๋ง ๋ณ๋ ์ด์๋ก ๋ถ๋ฆฌ)
---
๐ฆ 6. ๋ฐ์ดํฐ ๋ชจ๋ธ ํํฉ (v1.0 ์๋ณธ ์ ์ง)
bmp_generated_contents ํต์ฌ ํ๋
status 'draft' | 'published' | ('archived' ์ ๊ท ์์ )
published_at timestamptz
published_url text โ URL ์๋ ์กฐ๋ฆฝ
body_md text โ ์๋ณธ ๋งํฌ๋ค์ด โ
body_html text โ ํ์ฌ NULL, SSR ๋ ๋ ์ ์ฑ์ธ์ง ๊ฒฐ์
jsonld_data jsonb โ ํ์ฌ NULL, ๋ฐํ ์ ์๋ ์์ฑ
compliance_status 'unchecked'|'pass'|'fail'
btcr_gate_status 'pass'|'warn'|'fail'
btcr_overall_score int
hub_slug text โ ์๋ธ๋๋ฉ์ธ ๊ฒฐ์ ์
slug text โ URL path segment
metadata jsonb โ source_action_id ๋ฑ
๋ฐํ ์ ํธ๋์ญ์ (์ค๊ณ์ โ Session-Q ๊ตฌํ)
UPDATE bmp_generated_contents
SET status = 'published',
published_at = NOW(),
published_url = 'https://' || hub_slug || '.bmp.ai/content/' || slug,
updated_at = NOW()
WHERE id = $1
AND (btcr_gate_status = 'pass' OR $2 = 'force');
---
๐ 7. Cross-Room ์ํฅ (์๋ฃ ์์ ์ ํ ๊ฒฐ๊ณผ)
| ๋ฐฉ | ์ํฅ | ์ ํ ๋ฐฉ์ | Session-Q ์ฒ๋ฆฌ |
|---|---|---|---|
| GEOCARE | SoM ์ธก์ ๋ก์ง์ด published_url ํฌ๋กค๋ง ๊ฐ์ง์ ์์กด ๊ฐ๋ฅ | Phase A ๋ฐฐํฌ ํ ๊ณต์ง | โ Cross-Room ๋ฐ์ก ์๋ฃ |
| SALES | ์์ ์๋ฃ์ "์๋ ๋ฐํ + GEO ์์ฐํ" ์ฐจ๋ณ์ ์ถ๊ฐ | Phase B ์๋ฃ ํ Gamma ์๋ฃ ๊ฐฑ์ | โ Cross-Room ๋ฐ์ก ์๋ฃ / Gamma๋ ํ์ |
| DATA_ENG | ํฌ๋กค๋ง ๋ก๊ทธ ์์ง ์ต์ (Access log โ SoM correlation) | Phase D ์๋ฃ ํ | โธ๏ธ Phase D ๋ณด๋ฅ๋ก ๋๊ธฐ |
| COMMON | ์ฉ์ด ์ฌ์ : publish, sitemap, IndexNow, BTCR gate | ์ฉ์ด์ฌ์ 0830b8af ์ ๋ฐ์ดํธ | ๐ก bmp_* 8์ข ๋ฑ๋ก ๋ฏธ์ฒ๋ฆฌ (Cross-Room ๋๊ธฐ) |
---
โฑ๏ธ 8. ์ด ์์ ์ค์ธก (์๋ณธ ์ถ์ vs ์ค์ )
| Phase | ์ถ์ | ์ค์ | ์ฐจ์ด |
|---|---|---|---|
| A. SSR ๋ผ์ฐํธ | 2~3h | ~1h (๋์ ์งํ) | ์์๋ณด๋ค ๋น ๋ฆ |
| B. ๋ฐํ ๋ฒํผ UX | 1~2h | ~0.5h | ์์๋ณด๋ค ๋น ๋ฆ |
| C. sitemap.xml | 1h | ~0.5h | ์์๋๋ก |
| D. IndexNow Ping | 1h | โธ๏ธ ๋ณด๋ฅ | ๋ณ๋ ํฐ์ผ |
| E. ๋ ๊ฑฐ์ ๋ณต๊ตฌ | 0.5h | 0h (์๋) | Phase A ๋ฐฐํฌ์ ๋์ ์๋ |
| ํฉ๊ณ | 5.5~7.5h | ~2h + ๋น์ฉ ~$0.18 | ์ผ๊ด ์์ฃผ |
---
๐ฆ 9. ์คํ ์์ (์๋ฃ๋จ)
> โ Session-Q์์ ์์ฃผ โ ์๋ณธ ์ ์ง, ์ฒดํฌ๋ฐ์ค ํ์.
Step 1 (30๋ถ): ์ฌํ์ธ ์กฐ์ฌ โ
- [x] brand-hub middleware์์ ์๋ธ๋๋ฉ์ธ โ hub_slug ์ถ์ถ ๋ก์ง ์กด์ฌ ์ฌ๋ถ
- [x]
geobh-content-pageEF ๋ด๋ถ ํ์ธ (์ด๋ฏธ HTML ๋ ๋๋ง ์ค์ด๋ฉด ์ฌํ์ฉ) - [x]
react-markdown๋๋ ๋งํฌ๋ค์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ package.json ํ์ธ - [x] Supabase RLS ์ ์ฑ ํ์ธ (public read ๊ฐ๋ฅ ์ฌ๋ถ)
Step 2 (2h): Phase A ๊ตฌํ โ
- [x]
app/content/[slug]/page.tsx์์ฑ โapp/[partner]/content/[slug]/page.tsx๋ก ์งํ - [x] ์๋ธ๋๋ฉ์ธ โ hub_slug ๋งคํ (middleware ๋๋ headers)
- [x] Supabase ์กฐํ + 404 ์ฒ๋ฆฌ
- [x] Markdown โ HTML + JSON-LD ์๋ ์ฃผ์
- [x] OG meta tags
- [x] Fact Check footer ์๋ ์ฝ์ (v8.1 ํ๊ฐ๋ฐฉ์ง๋ก ๋์ฒด)
Step 3 (30๋ถ): ๋ฐฐํฌ + ์ค์ธก โ
- [x] Vercel ์๋ ๋ฐฐํฌ โ 3ํ ์๋ ๋ฐฐํฌ๋ก matcher ๋ฒ๊ทธ ์์ ๊น์ง ์์ฃผ
- [x] ๋ ๊ฑฐ์ URL 5๊ฑด (ivanahelsinki) ํ ์คํธ โ 6๊ฑด + ์ ๊ท 1๊ฑด = 7๊ฑด ํต๊ณผ
- [x] SEO ๋๊ตฌ๋ก ํฌ๋กค๋ง ๊ฐ๋ฅ ์ฌ๋ถ ํ์ธ โ robots.txt + sitemap.xml ์ ์ ์๋ต
Step 4 (1h): Phase B ๋ฐํ ๋ฒํผ โ
- [x] ContentQueueTab.tsx ์์
- [x] ๋ฐํ UPDATE SQL
- [x] URL ๋ณต์ฌ UX
Step 5 (1h): Phase C sitemap + Step 6 Cross-Room ์ ํ โ
---
๐ 10. Quick Reference
Session-Q ์ ๊ท ์์ฐ (์๊ฒฐ)
brand-hub commits (7)
6dc11a9 content-jsonld.ts ยท 0f0a354 page.tsx ยท c9a35e9 middleware /content ยท 74f6c8d sitemap ยท bb39545 robots ยท 9fb2e34 middleware rewrite ยท 84b5068 middleware matcher
partner-geo-hub commits (1)
1f4768e ContentQueueTab.tsx (handlePublish + handleCopyUrl)
bawee RLS ์ ๊ท (bmp_generated_contents)
public_read_publishedโ anon SELECT status='published' (LLM ํฌ๋กค๋ฌ public)authenticated_read_allโ authenticated SELECT ์ ์ฒด (ํํธ๋ํ๋ธ draft ์ด๋)
Vercel ๋ฐฐํฌ
dpl_635E...(Phase A 1์ฐจ)dpl_AZVF...(Phase B+C 1์ฐจ, matcher ๋ฒ๊ทธ)dpl_HsHS...(matcher ์์ ์ต์ข )
์ค์ธก ์๋ํฌ์ธํธ (17๊ฑด HTTP 200)
https://ivanahelsinki.bmp.ai/content/{6๊ฑด slug}+ ์ ๊ทv8-1-antihallu-ivanahttps://chanel-watches.bmp.ai/content/...(1๊ฑด)https://{hub}.bmp.ai/sitemap.xml(application/xml) ยทrobots.txt(text/plain)
๐ด uniqlo ๋ณ๋ ํ๋ก์ ํธ (๋ณด๋ฅ)
bmp-ai-uniqloprj_5bbmauu0RXtD0Kua (Axis 2 ๋ฏธ์ ์ฉ)- uniqlo.bmp.ai ๋๋ฉ์ธ ์ ์ ,
*.bmp.ai์์ผ๋์นด๋๋ณด๋ค ์ฐ์ - ๊ฒฐ์ ์ต์ : โ ํตํฉ โก ๋ถ๋ฆฌ ์ ์ง + Axis 2 ์ด์ โข ํ์ ์ ์ง
๊ด๋ จ ํ์ผ
- brand-hub:
app/api/content-page/route.ts(๊ธฐ์กด API) - brand-hub:
app/site/SiteContent.tsx(๊ธฐ์กด SiteContent) - brand-hub:
app/report/[slug]/page.tsx(ํจํด ์ฐธ๊ณ ์ฉ) - partner-geo-hub:
src/components/client-detail/ContentQueueTab.tsx(35KB)
๊ด๋ จ EF
geobh-content-pageโ ๋ด์ฉ ํ์ธ ํ์geobh-dataโ ๋ธ๋๋ํ๋ธ ๋ฐ์ดํฐ APIgeobh-jsonldโ JSON-LD ์๋ ์์ฑgeobh-pageโ ๋ธ๋๋ํ๋ธ ํ์ด์ง ๋ ๋๋ง
๋ ๊ฑฐ์ published 18๊ฑด ์ฒ๋ฆฌ ๊ฒฐ๊ณผ
- ivanahelsinki 5๊ฑด: โ ์๋ ๋ณต๊ตฌ
- uniqlo 9๊ฑด: โธ๏ธ ๋ณ๋ ํ๋ก์ ํธ ์ด์๋ก ๋ฏธ์ ์ฉ (๋ณด๋ฅ)
- chanel-watches 1๊ฑด: โ ์๋ ๋ณต๊ตฌ
- ๊ธฐํ 3๊ฑด: โ ์๋ ๋ณต๊ตฌ (๊ฐ์ , ๊ฐ๋ณ ์ค์ธก์ ๋ณ๋)
ํ์ ์์ (Snapshot ๋ฐฑ๋ก๊ทธ ๋งํฌ)
- Axis 2 Phase D ๊ฒ์์์ง ping ํตํฉ (Bing+Google+Naver) โ ๐ ๋ณด๋ฅ
- uniqlo ๋ณ๋ ํ๋ก์ ํธ ์ ์ฑ ๊ฒฐ์ โ ๐ Asana ๋ฑ๋ก ์์
- ํํธ๋ draft ๊ฒํ ํ๋ฆ ๊ตฌ์ถ โ ๐ฅ ๋ค์ ์ฐฉ์ ํ๋ณด (Session-Q Phase B ๋ฐํ ๋ฒํผ ๊ฑฐ๋ฒ๋์ค ๋ณด์)
---
๋ณ๊ฒฝ ์ด๋ ฅ
| ๋ฒ์ | ๋ ์ง | ๋ณ๊ฒฝ |
|---|---|---|
| v1.1 | 2026-04-21 ์คํ (Session-Q) | Phase ์ํ ๋ฐ์: A/B/C โ DONE, D โธ๏ธ ๋ณด๋ฅ (๋ณ๋ ํฐ์ผ ๊ถ์ฅ), E โ ์๋๋ณต๊ตฌ 17/18 (uniqlo ์ ์ธ). ์๋ฃ ์ฐธ์กฐ ๋ฌธ์๋ก ์ ํ. ๊ตฌํ ์์ฐ(commit/RLS/๋ฐฐํฌ) ๊ฐ Phase์ ๋งคํ. DoD/๋ฆฌ์คํฌ/์คํ์์์ ์ค์ ๊ฒฐ๊ณผ ์ฒดํฌ. |
| v1.0 | 2026-04-20 ์ ๋ | ์ด์. Session-O ์ค๊ณ. B1-ext-D QA์์ ๋ฐ๊ฒฌ๋ 404 ๊ทผ๋ณธ ์์ธ ๊ธฐ๋ฐ. |