๐ฏ I-1 G1 ์ค๊ณ โ geobh-jsonld EF ์ธ์ฆ ํค๋ ํตํฉ v1.2 (5/11 ํ์ ์ ์ )
ํต์ฌ ์์ฝ
# ๐ฏ I-1 G1 ์ค๊ณ โ geobh-jsonld EF ์ธ์ฆ ํค๋ ํตํฉ v1.2 (5/11 ํ์ ์ ์ )
> ์์ฑ: 2026-05-10 KST | v1.0
> ๊ฐฑ์ : 2026-05-11 KST | v1.1 (5/11 GEOCARE ๋ฐฉ EF v5 ๋ผ์ด๋ธ ํ์ธ ํ ์ ์ โ ๋ณธ์ง ๋ณํ 0, ๋ช ์นญ๋ง ์ ์ )
> ๊ฐฑ์ : 2026-05-11 KST | v1.2 (5/11 ํ์ โ GEOCARE G2-1/G2-3 ํ์ ์๋ น + 4๊ฐ ๊ฒฐ์ ์น์ธ ๋ฐ์, ๋ณธ์ง ๋ณํ 0)
> ํธ๋: T-AUTO-INJECT-UNIFIED-v1 Phase 1.2 / Track I I-1
> Track I Reference: KHub ea16e72e-e577-4ff7-a68c-8c796857f660
> ๋์ EF: bawee Supabase geobh-jsonld (ํ์ฌ v5 ๋ผ์ด๋ธ, schema.geocare.ai CNAME)
> Phase: ๐ READY (G2 4/4 ALL PASS, PUT ์ง์ ๊ฐ๋ฅ)
> ์ฐ์ ์์: P0
> ์์ ์์: 0.5์ผ
---
0. v1.0 โ v1.1 โ v1.2 ์ ์ ์ฌ์ (๋ณ๊ฒฝ ์ด๋ ฅ ยง10 ์ฐธ์กฐ)
v1.0 โ v1.1 (5/11 KST 1์ฐจ)
5/11 KST ์ ๋ฐฉ 5/10~5/11 ํตํฉ ์ ๊ฒ ๋งคํธ๋ฆญ์ค์์ ๋ฐ๊ฒฌ:
- GEOCARE ๋ฐฉ์ด 5/11 KST ์์ฐ ์ง์ T-BIZSPRING-JSONLD-FILL ์๊ฒฐ โ EF v3 โ EF v5๋ก ๋ง์ด๊ทธ ๋ผ์ด๋ธ
- 5/11 schema.geocare.ai EF v5:
verify_jwt:false,ef_version=v5,rpc_version=v3,sources=[site_jsonld, brand_jsonld, eeat_analysis.generated_jsonld](3 SSOT ํตํฉ) - ๋ณธ v1.0 ์ค๊ณ์ "EF v3" ๋ช ์นญ โ ์ค ๋ผ์ด๋ธ "EF v5" ์ ์ ํ์
- ๋ณธ๋ฐฉ ์ธ์ฆ ์ ๊ตฌ ์ถ๊ฐ ํจ์น ๋ณธ์ง ๋ณํ 0 (์๋ต ๋ณธ๋ฌธ ๋ฏธ๋ณ๊ฒฝ ์์น ๋์ผ)
- G2 ์ง์ ์กฐ๊ฑด #2 (T-BIZSPRING-JSONLD-FILL Step 3 PUT ์ฌ๋ถ) โ ์ถฉ์กฑ ๋งํน
v1.1 โ v1.2 (5/11 KST ํ์)
5/11 KST GEOCARE โ PREMIUM_GEO Cross-Room MB 13์ฐจ ํ์ ์๋ น + ์ฐฐ์ค 4๊ฐ ๊ฒฐ์ ์น์ธ:
- G2-1 โ ์ถฉ์กฑ: GEOCARE PO ์ธ๊ฐ ๊ฒฐ์ โ G0 5๊ฑด ์ ์ ์ถฉ์กฑ (ํ ์ด๋ธ+RPC+RLS+ํ ์คํธ ํค 5๊ฑด ALL PASS = G0 ์ฐ์ถ๋ฌผ)
- G2-3 โ
์ถฉ์กฑ: BIZSPRING_DEV prefix =
biz_. ์ ๊ท์^[a-z]{3}_[A-Za-z0-9]{32}$. client_code ๋งค์นญ์ RPC ๋ด๋ถ ๋ก์ง - G2 4๊ฑด ALL PASS โ I-1(ฮฑ) ์ฆ์ PUT ์ง์ ๊ฐ๋ฅ
- ADR-001 ์ ์ค (I-3 ์์น ์ ์ : bmp.ai/admin โ geocare-admin-hub)
- ADR-002 ์ ์ค (I-2 ์์น ์ ์ : Vercel jsonld-serve โ CF Workers + DNS ๋ช ๋ช ์ฒด๊ณ)
- ์๋ต ํค๋
X-GEOcare-Cache-Source์ ์ค (CF Workers Phase B ์ง์ ํ ํ์ฉ, ํ์ฌ PUT ์direct๊ฐ ๋ช ์) - ๋ณธ์ง ๋ณํ 0 โ ์ ๊ตฌ ์ถ๊ฐ + ์๋ต ๋ณธ๋ฌธ ๋ฏธ๋ณ๊ฒฝ ์์น ๋์ผ
---
1. ํ ์ค ์ ์
geobh-jsonld EF v5(2026-05-11 ๋ผ์ด๋ธ)์ X-GEOcare-Key ํค๋ ๊ฒ์ฆ ์
๊ตฌ๋ฅผ ์ถ๊ฐํ์ฌ, ์ธ๋ถ ์ฌ์ดํธ์ ์ธ์ฆ ํธ์ถ๋ง ์๋ตํ๋๋ก ๊ฒ์ดํธ๋ฅผ ๋ซ๋๋ค. ์๋ต ๋ณธ๋ฌธ์ ๋ฏธ๋ณ๊ฒฝ (3 SSOT ํตํฉ ๋ก์ง ๊ทธ๋๋ก).
---
2. ๋ณ๊ฒฝ ๋ฒ์ (์ ๊ตฌ ํ์ )
2.1 ์ถ๊ฐ
- ํค๋ ๊ฒ์ฆ:
X-GEOcare-Key๋๋ฝ ์ HTTP 400 +X-GEOcare-Failure-Reason: missing_key_header - RPC ํธ์ถ:
verify_geoex_inject_key(p_api_key, p_origin, p_request_url)1ํ - 401 ๋ถ๊ธฐ:
is_valid=falseโ HTTP 401 +X-GEOcare-Failure-Reason: <reason> - 200 ๋ถ๊ธฐ:
is_valid=trueโ ๊ธฐ์กด v5 ์ค์ธก ์๋ต ๋ก์ง ๊ทธ๋๋ก ์งํ - ์๋ต ํค๋:
X-GEOcare-Client-Code์ถ๊ฐ (๊ด์ธก + Phase 5 ํ์ฉ) - (v1.2 ์ ๊ท) ์๋ต ํค๋:
X-GEOcare-Cache-Source์ถ๊ฐ โ ํ์ฌ v6 PUT ์direct๊ฐ (CF Workers Phase B ์ง์ ํcf-hit/cf-miss๊ฐ ํ์ฉ ์์ )
2.2 ๋ฏธ๋ณ๊ฒฝ (์ ๋ ๊ธ์ง)
- ์๋ต ๋ณธ๋ฌธ (EF v5 3 SSOT ํตํฉ ๋ก์ง: site_jsonld + brand_jsonld + eeat_analysis.generated_jsonld)
gp_geoex_jsonld_elements(5/11 GEOCARE ๊ทธ๋ฆฐํ๋ SSOT) โ ๋ณธ๋ฐฉ ๋ฏธ์ ๊ทผbmp_jsonld_delivery(๋ณธ๋ฐฉ Phase D SSOT) โ ๋ณธ๋ฐฉ ์์ญ ๋ณ๋- GPT ์ฆ์ ์์ฑ ๋ถ๊ธฐ (EF v5 ์๋ต ๋ณธ๋ฌธ ๋ด๋ถ ๋ก์ง)
โ ๋ณธ๋ฐฉ์ ์ ๊ตฌ๋ง ์ถ๊ฐ. GEOCARE ์ธก EF v6 ๋ฐฐํฌ ์์ (T-FIX-3SSOT-PIPELINE Step 4)์์ ๋ณธ๋ฐฉ ์ธ์ฆ ์ ๊ตฌ ๋ณด์กด ์๋ฌด ํฉ์ ํ์ (Cross-Room MB 14์ฐจ์์ ํต๋ณด).
---
3. ์์ฌ ์ฝ๋ (ํ์ฌ v5 ๋ผ์ด๋ธ ์์ ์ ๊ตฌ๋ง ์ถ๊ฐ)
// === Deno Edge Function: geobh-jsonld v6 (์ธ์ฆ ํตํฉ) ===
// v5 โ v6 (์
๊ตฌ๋ง ์ถ๊ฐ, ์๋ต ๋ณธ๋ฌธ ๋ฏธ๋ณ๊ฒฝ)
import { serve } from "https://deno.land/std/http/server.ts";
import { createClient } from "https://esm.sh/@supabase/supabase-js@2";
const supabase = createClient(
Deno.env.get("SUPABASE_URL")!,
Deno.env.get("SUPABASE_SERVICE_ROLE_KEY")!
);
serve(async (req) => {
// === [v6 ์ ๊ท] ์ธ์ฆ ํค๋ ๊ฒ์ฆ ===
const apiKey = req.headers.get("x-geocare-key");
if (!apiKey) {
return new Response(
JSON.stringify({ error: "missing_key_header" }),
{
status: 400,
headers: {
"Content-Type": "application/json",
"X-GEOcare-Failure-Reason": "missing_key_header"
}
}
);
}
const origin = req.headers.get("origin") || req.headers.get("referer") || null;
const url = new URL(req.url);
const targetUrl = url.searchParams.get("url");
// verify RPC ํธ์ถ (1ํ)
const { data: verifyResult, error: verifyError } =
await supabase.rpc("verify_geoex_inject_key", {
p_api_key: apiKey,
p_origin: origin,
p_request_url: targetUrl
});
if (verifyError || !verifyResult?.[0]?.is_valid) {
const reason = verifyResult?.[0]?.failure_reason || "verify_error";
return new Response(
JSON.stringify({ error: "Unauthorized", reason }),
{
status: 401,
headers: {
"Content-Type": "application/json",
"X-GEOcare-Failure-Reason": reason
}
}
);
}
const { client_code } = verifyResult[0];
// === [v5 ๊ธฐ์กด] ์๋ต ๋ณธ๋ฌธ ๋ก์ง ๊ทธ๋๋ก ===
// ... 3 SSOT ํตํฉ ๋ก์ง (site_jsonld + brand_jsonld + eeat_analysis.generated_jsonld) ...
// ... GPT fallback ๋ถ๊ธฐ ...
//
// ์๋ต ํค๋ ์ถ๊ฐ (๊ด์ธก):
// X-GEOcare-Client-Code: <client_code>
// X-GEOcare-Cache-Source: direct โ v1.2 ์ ๊ท (CF Workers Phase B ์ง์
ํ cf-hit/cf-miss ๊ฐ)
});
โ ๏ธ PUT ์์ ์ GET โ ๊ธฐ์กด EF v5 ์ฝ๋ ์ ์ฒด ์ถ์ถ โ ์ ์ ๊ตฌ ๋ถ๋ถ๋ง prepend โ PUT ํจํด (AP-07). ๊ธฐ์กด ์๋ต ๋ณธ๋ฌธ ๋ก์ง(EF v5์ 3 SSOT ํตํฉ) ํ ์ค๋ ๋ณ๊ฒฝ ๊ธ์ง.
---
4. ํธํ์ฑ (BIZSPRING_DEV ๋๊ทธํธ๋ฉ)
4.1 ์์ฌ ๋น์ฆ์คํ๋ง ์ฌ์ดํธ v2.10 PHP ์ฝ๋
KHub 3f8b6f09 STD-DEPLOY-SERVERSIDE-SCRIPT v1.1 ยง3 v2.10 ๋ผ์ด๋ธ ๋ช
์:
- ํธ์ถ ํค๋:
X-GEOcare-Key: <key> - ํธ์ถ URL:
https://schema.geocare.ai/functions/v1/geobh-jsonld?url=<page_url>
4.2 PUT ์งํ ํธํ์ฑ ๋งคํธ๋ฆญ์ค
| ์ฌ์ดํธ | ์ฌ์ฉ ํค prefix | A-4 ๋ฐ๊ธ ํค | I-1 PUT ํ |
|---|---|---|---|
| bizspring.co.kr v2.10 | biz_ โ
(v1.2 5/11 GEOCARE ํ์ ํ์ ) | BIZSPRING_DEV biz_qBzs... | โ ์ฆ์ ํต๊ณผ (prefix ์ผ์น ํ์ ) |
| bmp.ai/admin | adm_ | ADMIN_INTERNAL adm_mJpe... | โ I-2-Alt ์์ ํ์ฉ |
| growthplatform.ai | gpf_ | GROWTHPLATFORM_DEV gpf_HHw2... | โ ๋ฏธ์ฌ์ฉ (๋ณด์กด) |
| luvhunter.net (PoC) | lvh_ | TEST_LUVHUNTER (5/9 GEOCARE ๋ฐ๊ธ) | โ ์ฆ์ ํต๊ณผ |
| ivanahelsinki.co.kr | ivn_ | TEST_IVANA (5/9 GEOCARE ๋ฐ๊ธ) | โ ์ฆ์ ํต๊ณผ |
๊ฒ์ฆ ์ ๊ท์ (v1.2 ์ถ๊ฐ): ^[a-z]{3}_[A-Za-z0-9]{32}$
4.3 5/11 luvhunter ์์ฐ๊ณผ์ ๊ด๊ณ
GEOCARE Snapshot v3.37 NOW ยงB "luvhunter ์ ๋ชจ๋ธ ๋ง์ด๊ทธ โ STD-PARTNER-JSONLD-FILL ์ ์ฉ" ์งํ ์ค.
๋ณธ๋ฐฉ I-1 PUT ์์ = GEOCARE luvhunter ๋ง์ด๊ทธ ํ ๊ถ๊ณ (์ถฉ๋ ์์ผ๋ ์์ฐ ์์ ์ฑ ์ฐ์ ).
4.4 ์ฌ์ ์ ๊ฒ ์๋ฌด
โ
(v1.2 ์ถฉ์กฑ ๋ช
๊ธฐ) PUT ์ GEOCARE ๋ฐฉ์ v2.10 PHP ์ฝ๋ ์ค ์ฌ์ฉ ํค prefix ํ์ธ = biz_ ํ์ (Cross-Room MB 13์ฐจ ํ์ ) โ G2 ์ง์
์กฐ๊ฑด #3 ALL PASS.
---
5. ํ ์คํธ ์๋๋ฆฌ์ค (B1~B6)
| # | ์๋๋ฆฌ์ค | ํธ์ถ | ๊ธฐ๋ |
|---|---|---|---|
| B1 | ํค๋ ๋๋ฝ | X-GEOcare-Key ์์ด GET | HTTP 400 + missing_key_header |
| B2 | ์๋ชป๋ ํค | X-GEOcare-Key: invalid_xxx | HTTP 401 + key_not_found_or_inactive |
| B3 | TEST_LUVHUNTER ์ ์ | + Origin: https://www.luvhunter.net | HTTP 200 + JSON-LD (v5 3 SSOT ํตํฉ ์๋ต) |
| B4 | TEST_LUVHUNTER + Origin ๋ถ์ผ์น | + Origin: https://wrong.com | HTTP 401 + origin_not_allowed |
| B5 | TEST_IVANA ์ ์ | ivn_ ํค + Origin ์ผ์น | HTTP 200 + JSON-LD |
| B6 | BIZSPRING_DEV ๋๊ทธํธ๋ฉ | + Origin: https://www.bizspring.co.kr | HTTP 200 + JSON-LD |
์ถ๊ฐ ๊ฒ์ฆ
- B3/B5/B6 ํธ์ถ ์งํ
gp_geoex_inject_keys.last_used_at๊ฐฑ์ ํ์ธ - ์๋ต ์๊ฐ ์ธก์ (verify RPC ์ถ๊ฐ๋ก ํ๊ท +50~150ms ์์)
- v5 ์๋ต ๋ณธ๋ฌธ(3 SSOT ํตํฉ) ์ ํํ ๋ณด์กด๋๋์ง ๊ฒ์ฆ โญ (v1.1 ์ถ๊ฐ)
- ์๋ต ํค๋
X-GEOcare-Cache-Source: direct๋ช ์ ํ์ธ (v1.2 ์ถ๊ฐ)
---
6. ๋กค๋ฐฑ ๊ณํ
EF ์ด์ ๋ฒ์ PUT (Supabase Management API revision ์ ํ).
- ํ์ฌ v5 ๋ผ์ด๋ธ โ I-1 PUT ํ v6
- ๋กค๋ฐฑ ์ v5๋ก ๋ณต๊ท (verify_jwt:false ์ํ + 3 SSOT ํตํฉ ๋ก์ง ๊ทธ๋๋ก)
- ์์: 1๋ถ ๅ ง
์ ์: A-4 ๋ฐ๊ธ ํค 3๊ฑด + 5/9 GEOCARE ํ ์คํธ ํค 2๊ฑด์ ๊ทธ๋๋ก ์ ์ง.
---
7. G2 ์ง์ ์กฐ๊ฑด (Self-Check) โ v1.2 ๊ฐฑ์
PUT ์ง์ ๋ณธ๋ฐฉ PO(์ฐฐ์ค) ์ปจํ + GEOCARE ํ์ ์๋ฌด. ๋ค์ 4๊ฑด ์ถฉ์กฑ ์ G2 ํต๊ณผ:
- [x] โ G2-1: G0 5๊ฑด ์ถฉ์กฑ ์ธ์ง ํ์ธ โ ์ถฉ์กฑ (5/11 GEOCARE Cross-Room MB 13์ฐจ ํ์ ). GEOCARE PO ์ธ๊ฐ ๊ฒฐ์ โ 5/9 Phase 1.1 ์ฐ์ถ(gp_geoex_inject_keys ํ ์ด๋ธ + verify_geoex_inject_key RPC + RLS no_direct_access + SECURITY DEFINER + ํ ์คํธ ํค T1~T5 ALL PASS)์ด G0 5๊ฑด ์ ์ ์ถฉ์กฑ ์ฐ์ถ๋ฌผ. ๊ตฌ์ํ 5/9 ๋ฐํ๋ ๋ณ๋ ์ฌ์, PREMIUM_GEO Track I ์งํ๊ณผ ๋ถ๋ฆฌ ์ฒ๋ฆฌ
- [x] โ G2-2: T-BIZSPRING-JSONLD-FILL Step 3 PUT ์ฌ๋ถ โ ์ถฉ์กฑ (5/11 EF v5 ๋ผ์ด๋ธ = Step 3 ์๊ฒฐ)
- [x] โ
G2-3: v2.10 PHP ๋๊ทธํธ๋ฉ ์ค ์ฌ์ฉ ํค prefix ํ์ธ โ ์ถฉ์กฑ (5/11 GEOCARE Cross-Room MB 13์ฐจ ํ์ ). BIZSPRING_DEV prefix =
biz_. ์ ๊ท์^[a-z]{3}_[A-Za-z0-9]{32}$. prefix๋ ์ผ๋ฐ ํจํด, client_code ๋งค์นญ์ RPC verify_geoex_inject_key ๋ด๋ถ ๋ก์ง - [x] โ G2-4: ๋ณธ G1 v1.2 PO ์ปจํ โ ์๋ฃ (5/11 ์ฐฐ์ค 4๊ฐ ๊ฒฐ์ ์น์ธ)
G2 4/4 ALL PASS โ I-1 PUT ์ง์ ๊ฐ๋ฅ ๐ข
---
8. PUT ํ Phase (v1.2 ์ ์ )
PUT โ B1~B6 ๋จ์ ํ ์คํธ โ ๊ฒฐ๊ณผ ๋ณด๊ณ โ ๋ค์ ์ง์ (v1.2 ์ ์ ๋งคํธ๋ฆญ์ค ์ฐธ์กฐ):
| ํญ๋ชฉ | v1.0/v1.1 | v1.2 |
|---|---|---|
| I-2 | bmp.ai/api/jsonld-serve ์ธ์ฆ ํตํฉ (Vercel) | ํ๊ธฐ โ ADR-002 ์ฐธ์กฐ |
| I-2-Alt | (์์) | ์ ์ค: Cloudflare Workers + KV ์บ์ (๋ณ ํธ๋) โ ADR-002 ์ฐธ์กฐ |
| I-3 | bmp.ai/admin PDP ํญ ํ์ฅ | ์ ์ : geocare-admin-hub /admin/inject-keys โ ADR-001 ์ฐธ์กฐ |
| I-4 | Phase D DevLog v3.0 ๊ฐฑ์ | ๊ทธ๋๋ก ์ ์ง (๋จ, ADR-001/002 ๋ฐ์ ๊ฐฑ์ ) |
I-2-Alt ์ง์ ์ ๋ณธ G1 v1.2 ์ธ์ฆ ์ ๊ตฌ ํจํด + KV ์บ์ ํจํด ๋ณ๋ G1๋ก ๋ช ์ธ (KHub ์ ์ค ์์ ).
I-3 ์ง์
์ Lovable geocare-admin-hub ๋ณ G1 ๋ช
์ธ (KHub ์ ์ค ์์ ).
---
9. ์ง ์์ฐ
| ์์ฐ | KHub ID |
|---|---|
| Track I Reference | ea16e72e-e577-4ff7-a68c-8c796857f660 |
| ํธ๋ ์ ๋ณธ v1.0 | 46fdc824 |
| ํธ์ถ ํ์ค v1.1 | dc3ce334 |
| ์๋ฒ์ฌ์ด๋ ์คํฌ๋ฆฝํธ v1.1 (v2.10 PHP) | 3f8b6f09 |
| Phase D DevLog v2.0 (I-4 ๊ฐฑ์ ๋์) | 0c006e31 |
| GEOCARE Snapshot v3.37 (EF v5 ๋ผ์ด๋ธ anchor) | 061e5edb (5/11 03:00 EF v5 ์ ์ฌ ๊ฒ์ฆ) |
| T-FIX-3SSOT-PIPELINE PRD v1.4 | a8692b7f-ab67-467b-ae62-652c900ae874 (๊ทธ๋ฆฐํ๋ SSOT) |
| STD-PARTNER-JSONLD-FILL v1.0 | fceee150 (GEOCARE ์ธก ์ ๋ชจ๋ธ ๋ง์ด๊ทธ ํ์ค) |
| (v1.2 ์ ๊ท) Cross-Room MB | 36928e3f (5/11 14์ฐจ prepend ์์ โ DNS ๋ช
๋ช
์ฒด๊ณ + I-2-Alt ์ง์
ํต๋ณด) |
| (v1.2 ์ ๊ท) geocare-admin-hub Lovable | https://lovable.dev/projects/ab6a109b-76dc-4159-9c98-ae2708057451 |
| (v1.2 ์ ๊ท) geocare-admin-hub GitHub | https://github.com/CharlesLee1991/geocare-admin-hub |
---
10. ๋ณ๊ฒฝ ์ด๋ ฅ
| ์ผ์ | ๋ฒ์ | ๋ณ๊ฒฝ |
|---|---|---|
| 2026-05-10 KST | v1.0 | ์ ์ค โ G1 ์ค๊ณ ๋จ๊ณ. ๋ช ์ธ์ ยง4-1 ์์ฌ์ฝ๋์ "3๋จ๊ณ fallback" ๋ถ๋ถ ์ ์ (ํ์ฌ v1.1 ์ค์ธก ๋์ ์์ ์ ๊ตฌ๋ง ์ถ๊ฐ). G2 ์ง์ ์กฐ๊ฑด 4๊ฑด ์ปจํ ๋๊ธฐ. |
| 2026-05-11 KST | v1.1 | EF v3 โ EF v5 ๋ช ์นญ ์ ์ (5/11 GEOCARE ๋ฐฉ ๋ผ์ด๋ธ ํ ๋ฐ๊ฒฌ). G2-2 โ ์ถฉ์กฑ ๋งํน (T-BIZSPRING-JSONLD-FILL ์๊ฒฐ). ์ง ์์ฐ 3๊ฑด ์ถ๊ฐ (GEOCARE Snapshot v3.37 / PRD v1.4 / STD-PARTNER-JSONLD-FILL). ๋ณธ์ง ๋ณํ 0 โ ์ ๊ตฌ ์ถ๊ฐ + ์๋ต ๋ณธ๋ฌธ ๋ฏธ๋ณ๊ฒฝ ์์น ๋์ผ. |
| 2026-05-11 KST ํ์ | v1.2 | 5/11 GEOCARE G2-1/G2-3 ํ์ ์๋ น โ G2 4/4 ALL PASS ๋ช ๊ธฐ. ADR-001 ์ ์ค(I-3 ์์น ์ ์ : bmp.ai/admin โ geocare-admin-hub). ADR-002 ์ ์ค(I-2 ์์น ์ ์ : Vercel jsonld-serve โ CF Workers ๋ณ ํธ๋ + DNS ๋ช ๋ช ์ฒด๊ณ cf-jsonld.geocare.ai / supabase.geocare.ai / schema.geocare.ai ํ๊ธฐ). X-GEOcare-Cache-Source ์๋ต ํค๋ ๋ช ์ธ. ๋ณธ์ง ๋ณํ 0 โ ์ ๊ตฌ ์ถ๊ฐ + ์๋ต ๋ณธ๋ฌธ ๋ฏธ๋ณ๊ฒฝ ์์น ๋์ผ. |
---
11. ADR-001 โ I-3 ์์น ์ ์ (bmp.ai/admin โ geocare-admin-hub)
์ปจํ ์คํธ
v1.0/v1.1 ์ค๊ณ ์ I-3 ์ด๋๋ฏผ UI๋ฅผ bmp.ai/admin PDP ํญ ํ์ฅ์ผ๋ก ๊ฐ์ . Phase D DevLog(0c006e31) 7ํญ ์ํผ์ด๋๋ฏผ ์์ฐ์ด 4/1๋ถํฐ ์ค์ฌํ๊ธฐ ๋๋ฌธ.
๊ฒฐ์ (2026-05-11 KST ํ์, ์ฐฐ์ค)
I-3 ์์น๋ฅผ CharlesLee1991/geocare-admin-hub Lovable repo์ /admin/inject-keys ์ ๊ท ํญ์ผ๋ก ์ ์ .
๊ทผ๊ฑฐ
- ํ๋ฅด์๋ ์ผ์น: ์ธ์ฆ ํค = ์ํผ์ด๋๋ฏผ๋ง ์์ญ (์ฐฐ์ค + ์ฅ์๋ฌด + ๋ด๋ถ)
- geocare-admin-hub = ์ํผ์ด๋๋ฏผ ์ ์ฉ Lovable ์์ฐ (ํ๋ฅด์๋ ๋ช ํ)
- bmp.ai/admin์ ๋ค๋ชฉ์ 7ํญ (ํํธ๋/๊ณ ๊ฐ/๊ณ์ /BrandHub/PDP/๋ถ์)
- Lovable Edit โ main push ํจํด ๊ฒ์ฆ ์๋ฃ (Track A PR-S5-1/2)
๊ฒฐ๊ณผ (์์ฐ)
- Lovable: https://lovable.dev/projects/ab6a109b-76dc-4159-9c98-ae2708057451
- GitHub: https://github.com/CharlesLee1991/geocare-admin-hub
- I-3 G1 ๋ณ KHub ์ ์ค ์์
์ํฅ
- bmp.ai/admin์ PDP ํญ ๊ทธ๋๋ก (Phase D ์์ฐ ๋ณด์กด)
- geocare-admin-hub์ ์ ๊ท ํญ ์ถ๊ฐ
- admin RPC 4์ข SECURITY DEFINER (์ง์ INSERT/UPDATE ๋ ธ์ถ ๊ธ์ง) โ ์์น ๋ฌด๊ด ๋์ผ
---
12. ADR-002 โ I-2 ์์น ์ ์ (Vercel jsonld-serve โ CF Workers + DNS ์ฒด๊ณ)
์ปจํ ์คํธ
v1.0/v1.1 ์ค๊ณ ์ I-2 ์ธ์ฆ ํตํฉ์ bmp.ai/api/jsonld-serve (Vercel)์ ์ ์ฉ ์์ . Phase D ์์ฐ 3๋จ๊ณ fallback ์์ ์ธ์ฆ ์ ๊ตฌ ์ถ๊ฐ ๋ชจ๋ธ.
๊ฒฐ์ (2026-05-11 KST ํ์, ์ฐฐ์ค)
- I-2 (Vercel jsonld-serve)๋ ํ๊ธฐ (Phase D ์์ฐ deprecated ์ผ์ ๊ณผ ์ ํฉ)
- I-2-Alt ์ ์ค: Cloudflare Workers ์ธ์ฆ ๊ฒ์ดํธ + KV ์บ์
- ๋ณ ํธ๋ ๋ถ๋ฆฌ โ ๋ณธ Phase 1.2 SLA(5/19) ๋ณด์กด, GEOCARE DNS ํ์ ํ ์ง์
- DNS ๋ช ๋ช ์ฒด๊ณ ์ ์ค (์ด์์ ์ธ์ง ๋ถ๋ด 0)
๊ทผ๊ฑฐ
- ๋ณธ๋ฐฉ CF ์์ฐ ๋ณด์ (Account
2458e1cce049da407fb497c419b6a2a6+ API Tokengp_admin_secrets.CF_API_TOKEN+ Workers ์ด์ ๊ฒฝํ) - ๊ธ๋ก๋ฒ latency: Supabase ~200ms โ CF Workers ~5ms (HIT) (10๋ฐฐ ๊ฐ์ )
- ๋น์ฉ: 1000๋ง req/์ Supabase ~$50 โ CF ~$5 (10๋ฐฐ ์ ๊ฐ)
- GEOCARE 5/11 ์ SSOT(
gp_geoex_jsonld_elements) + EF v6 ์ผ์ ๊ณผ ์ ํฉ - Phase D ์์ฐ(
bmp_jsonld_delivery)์ Step 5 archive ์ผ์ ๊ณผ ์ ํฉ
๊ฒฐ๊ณผ (DNS ๋ช ๋ช ์ฒด๊ณ ์ ์ค)
| ๋๋ฉ์ธ | ์ธํ๋ผ | ์ญํ | ๋ ธ์ถ |
|---|---|---|---|
cf-jsonld.geocare.ai | CF Workers | JSON-LD ์ก์ถ ๊ฒ์ดํธ์จ์ด (์ธ์ฆ + KV ์บ์) | ๐ ์ธ๋ถ |
supabase.geocare.ai | Supabase EF | ์๋ณธ EF(geobh-jsonld) origin | ๐ internal-only |
~~schema.geocare.ai~~ | (deprecated) | ์ถ์ alias, ์ด์์ ๊ธฐ์ต ๋ถ๋ด | โ ํ๊ธฐ (30์ผ ํธํ alias โ DNS ์ ๊ฑฐ) |
๋ง์ด๊ทธ ์๋๋ฆฌ์ค (Phase A~D, 1์ฃผ ๋ด)
| Phase | ๋ด์ฉ | ์์ |
|---|---|---|
| A | ์ ๋๋ฉ์ธ ์ ์ค (supabase.geocare.ai + cf-jsonld.geocare.ai). schema.geocare.ai ๊ทธ๋๋ก ์ ์ง (ํธํ์ฑ) | 5/12~5/13 |
| B | ์ธ๋ถ ์ฌ์ดํธ ์ ์ง ๋ง์ด๊ทธ (luvhunter, ivanahelsinki, bizspring v2.10 PHP โ ํ๊ฒฝ๋ณ์ 1๊ฐ ๊ต์ฒด) | 5/13~5/19 |
| C | schema.geocare.ai ํ๊ธฐ (30์ผ ํธํ alias โ DNS ์ ๊ฑฐ) | 5/20~6/20 |
| D | ์ ๊ฐ์ ์ฌ์ดํธ๋ ์ฒ์๋ถํฐ cf-jsonld.geocare.ai๋ง ์ฌ์ฉ (ํ์ค ๋ฌธ์ ๊ฐฑ์ ) | 6/20~ |
์ํฅ
- ์ธ๋ถ ์ฌ์ดํธ ์ ์ฅ: URL ๋ณ๊ฒฝ 0 (schema.geocare.ai ํธํ ์ ์ง) โ Phase B์์ ์ ์ง ๋ง์ด๊ทธ โ Phase C ์ด์ ์ 100% ๋ง์ด๊ทธ ์๋ฃ
- ์๋ต latency: ๊ธ๋ก๋ฒ ~200ms โ ~5ms (95%+ HIT)
- ๋น์ฉ: ์ ~$45 ์ ๊ฐ (1000๋ง req ๊ธฐ์ค)
- ๋ณด์ ๊ฐํ: supabase.geocare.ai internal-only ํค ๊ฒ์ฆ (์ธ๋ถ ์ง์ ํธ์ถ ์ฐจ๋จ)
Cross-Room MB 14์ฐจ ๋ฐ์ ํญ๋ชฉ
- DNS ๋ช ๋ช ์ฒด๊ณ ํต๋ณด
- GEOCARE์
cf-jsonld.geocare.ai+supabase.geocare.aiCNAME 2๊ฑด ๋ฐ๊ธ ์์ฒญ - schema.geocare.ai 30์ผ ํธํ alias ์ ์ง ์๋ด
- I-2-Alt ๋ณ ํธ๋ ์ง์ ์์ง ํต๋ณด (G1 ๋ณ KHub ์ ์ค ์์ )