Graphify ๋ฐ์ดํฐ ์ถ๊ฐ API
๐ Graphify ํ์ด์ง๋ก ์ด๋ โ](/ko/graphify)
Graphify๋ ์ง์๋ฒ ์ด์ค(tKB) ํญ๋ชฉ์ 3D ์ง์ ๊ทธ๋ํ๋ก ์๊ฐํํฉ๋๋ค. ์ด ๋ฌธ์๋ API๋ก ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ณ , ์ ๋ณด๊ฐ ์ ๋ณด์ด๋๋ก ํธ์ถํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
๋ฐ์ดํฐ ํ๋ฆ์ 2๋จ๊ณ์ ๋๋ค: โ ํญ๋ชฉ ์ ์ฌ(giipKb) โ โก ๊ทธ๋ํ ์ฌ๋น๋(giipGraphifyRebuild). ์ฌ๋น๋๋ฅผ ํธ์ถํด์ผ ์ ํญ๋ชฉ์ด ๊ทธ๋ํ์ ๋ฐ์๋ฉ๋๋ค.
๐ฆ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ํ๋ฆ โ tKB๊ฐ "์ง์ง ์ ์ฅ์"๋ค
โ ๏ธ ๊ฐ์ฅ ํํ ์คํด: "์ด์๋ฅผ ๋ฑ๋กํ๋๋ฐ ๊ทธ๋ํ์ ์ ๋ณด์ธ๋ค"๋ ๋๋ถ๋ถ tKB์ ์์ง ์ ์ฌ๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋๋ค.
tBlogGraphNodes/tBlogGraphEdges(๊ทธ๋ํ ํ ์ด๋ธ)๋ ๊ทธ ์์ฒด๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์์ง ์๊ณ , ์ฌ๋น๋๋ฅผ ํธ์ถํ ๋๋ง๋ค tKB๋ก๋ถํฐ ๋ค์ ๋ง๋ค์ด์ง๋ ํ์ ๊ฒฐ๊ณผ์ ๋๋ค. ๊ทธ๋ํ ํ ์ด๋ธ์ ์ง์ ์ฑ์ฐ๊ฑฐ๋ ์์ ํ๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค โ ํญ์ tKB โ ์ฌ๋น๋ ์์๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
[issue / ์ง์ ์์ค]
โ โ ์ธ์ ์คํธ: POST /api/giipKb (x-api-key: ak/sk)
โ โ tKB ํ
์ด๋ธ์ 1ํ ์ ์ฅ (csn, refType, title, content, tags, extRefId)
โ โ refType='ISSUE'(์ธ๋ถ/์์ฌ issue) ๋๋ 'k-layer-daily'(K-Layer ์ผ์ผ ๋๊ธฐํ, ์๋ ์ฐธ์กฐ)
โ โ extRefId๋ก ๋ฉฑ๋ฑ upsert(๊ฐ์ extRefId ์ฌ์ ์ก ์ ์ ํ์ด ์๋๋ผ ๊ธฐ์กด ํ UPDATE)
โผ
tKB (๊ทธ๋ํ์ "์ค์ ๋ฐ์ดํฐ ์ ์ฅ์" โ ๊ทธ๋ํ ํ
์ด๋ธ ์์ฒด๋ ํ์ ๊ฒฐ๊ณผ์ผ ๋ฟ)
โ โก ์ฌ๋น๋: POST /api/giipGraphifyRebuild {csn} (x-api-key)
โ โ SP pApiGraphifyRebuildbyAk๊ฐ ๊ทธ csn์ tBlogGraphNodes/tBlogGraphEdges๋ฅผ
โ ํต์งธ๋ก DELETE ํ tKB๋ก๋ถํฐ ์ฌ์์ฑ(์ ์ฌ๋ง ํ๊ณ ์ฌ๋น๋ ์ ํ๋ฉด ๊ทธ๋ํ๋ ๊ทธ๋๋ก ์ ๋ฐ๋)
โ โ DOC ๋
ธ๋(tKB ๊ฐ ํ=๋ฌธ์ ํ๋) + TAG ๋
ธ๋(2๊ฐ ์ด์ ๋ฌธ์๊ฐ ๊ณต์ ํ๋ ํ๊ทธ๋ง, ํค์ด๋ณผ ๋ฐฉ์ง๋ก
โ ๋๋ฌด ํํ ํ๊ทธ๋ ์๋ ์ ์ธ) + docโtag ์ฃ์ง
โ โ (์ ๊ท) ์ด csn์ ์ค์ ๋ ์ธ์ด(tCorp.cLang)๋ก ๋
ธ๋ ๋ผ๋ฒจ์ ์๋ ๋ฒ์ญํด์ ์ ์ฅ
โผ
tBlogGraphNodes / tBlogGraphEdges (csn ์ค์ฝํ, ํ๋ฉด์ด ์ค์ ๋ก ์ฝ๋ ํ
์ด๋ธ)
โ โข ์กฐํ: GET /api/giipGraphifyTenant?csn= (์๊ฒฉ ๊ฒฉ๋ฆฌ, ak ์ธ๊ฐ) ๋๋ ํ๋ฉด /graphify?csn=
โผ
3D ์ง์ ๊ทธ๋ํ ์๊ฐํ
- 1๋จ๊ณ(์ธ์ ์คํธ)๋ง์ผ๋ก๋ ๊ทธ๋ํ์ ์๋ฌด๊ฒ๋ ๋ํ๋์ง ์์ต๋๋ค. ๋ฐ๋์ 2๋จ๊ณ(์ฌ๋น๋)๊น์ง ํธ์ถํด์ผ ๋ฐ์๋ฉ๋๋ค.
- ์ฌ๋น๋๋ ๋งค๋ฒ ์ ๋ ์ฌ์์ฑ์
๋๋ค. ์ด์ ๊ทธ๋ํ ์ํ๋ฅผ ์ด์ด๋ฐ๋ ๊ฒ์ด ์๋๋ผ, ๊ทธ ์์ ์ tKB ๋ด์ฉ ์ ์ฒด๋ก ๋ค์ ๊ทธ๋ฆฝ๋๋ค. ๊ทธ๋์ tKB์์ ํญ๋ชฉ์ ์ง์๋(๋๋
refType๋ณ๋ก ์ผ๊ด ์ญ์ ํด๋) ๋ค์ ์ฌ๋น๋์์ ์์ฐํ ๊ทธ๋ํ์์ ๋น ์ง๋๋ค. - ๊ฒฉ๋ฆฌ: ๋ชจ๋ ๋จ๊ณ๊ฐ
csn(ํ๋ก์ ํธ ๊ฒฝ๊ณ)๊ณผx-api-key(ak/sk ์ธ๊ฐ)๋ก ์ค์ฝํ๋ฉ๋๋ค. ๋ค๋ฅธ csn์ tKB๋ ๊ทธ๋ํ์๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
K-Layer ์๋ ์ธ์ ์คํธ (์ด๋ฏธ ์ด์ ์ค, refType='k-layer-daily')
giip ์ธ์ ์ด ์ถ์ ํ๋ **์์ง๋์ด๋ง ๋ ธํ์ฐ(K-Layer)**๋ ์ด๋ฏธ ๋งค์ผ ์๋์ผ๋ก tKB์ ์ ์ฌ๋๊ณ ์์ต๋๋ค(์ ๊ท ๊ธฐ๋ฅ์ด ์๋๋ผ ๊ธฐ์กด ์ด์ ๊ธฐ๋ฅ์ ๋๋ค).
- ์ค์ผ์ค๋ฌ:
giipdb/mgmt/run_klayer_daily_wiki.ps1์ด ๋งค์ผ 00:15 UTC์ Windows ์ค์ผ์ค๋ฌ ์์GIIP_Daily_KLayerWiki๋ก ์คํ๋ฉ๋๋ค. - ๋์: giip ์ด์๊ฐ ์๋ ๋ชจ๋ csn์ ๋ํด ์ ๋ ํ๋ฃจ์น ์ด์+์ฝ๋ฉํธ๋ฅผ ๋ชจ์ MiniMax๋ก ์์ฝํ ๋ค
giipKb๋ฅผ ํตํด tKB์ INSERTํฉ๋๋ค. - ํ๋ ๊ฐ:
refType='k-layer-daily',tags='k-layer-wiki,daily',title='K-Layer Wiki {csn} - {yyyy-MM-dd}'. - ๋ง์คํน: ๋ฏผ๊ฐ์ ๋ณด๋
giipdb/mgmt/lib/Mask-SensitiveInfo.ps1๋ก ์ด์ค ๋ง์คํน๋ ๋ค ์ ์ฅ๋ฉ๋๋ค. - ๊ทธ๋ํ์์ ๋ณด์ด๋ ๋ฐฉ์: ์ด tKB ํ๋ค๋ ๋ค๋ฅธ ํญ๋ชฉ๊ณผ ๋์ผํ๊ฒ ๋ค์ ์ฌ๋น๋ ๋ DOC ๋
ธ๋๋ก ํก์๋ฉ๋๋ค. ๊ณต์ ํ๊ทธ
k-layer-wiki,daily๊ฐ TAG ๋ ธ๋๊ฐ ๋์ด, ๋ ์ง๋ณ๋ก ์์ธ K-Layer ๋ฌธ์๋ค์ด ์์ฐ์ค๋ฝ๊ฒ ํ๋์ ํด๋ฌ์คํฐ๋ก ๋ฌถ์ฌ ๋ณด์ ๋๋ค. - ํํฐยท์ญ์ ์
refType='k-layer-daily'๋ก ๋ฒ์๋ฅผ ์ขํ ์ ์์ต๋๋ค(ยง1 ํ์refType์ฐธ๊ณ ).
csn ์ธ์ด ๊ธฐ๋ฐ ์๋ ๋ฒ์ญ (์ ๊ท)
giipGraphifyRebuild ํธ์ถ ์, ๊ทธ csn์ ํ๋ก์ ํธ ์ธ์ด ์ค์ (tCorp.cLang, ์: ko-KR, en-US โ ํ๋ก์ ํธ ๊ด๋ฆฌ ํ๋ฉด์์ ์ด๋ฏธ ์ค์ ๊ฐ๋ฅํ ๊ธฐ์กด ๊ฐ) ์ ๋ง์ถฐ ๊ทธ๋ํ ๋
ธ๋ ๋ผ๋ฒจ์ ์๋ ๋ฒ์ญํด์ ์ ์ฅํฉ๋๋ค.
- ๋์ ์์ : tKB ์๋ณธ ๋ฐ์ดํฐ(
title/content)๋ ์ธ์ด์ ๋ฌด๊ดํ๊ฒ ๊ทธ๋๋ก ์ ์ฅ๋๊ณ , ์ฌ๋น๋๊ฐ ์คํ๋๋ ์์ ์ ๊ทธ csn์cLang๊ฐ์ ์ฝ์ด ๋ ธ๋ ๋ผ๋ฒจ์ ๋ฒ์ญํฉ๋๋ค. - ์ฌ์ฉ์ ๊ด์ ์์ฝ: ํ๋ก์ ํธ ๊ด๋ฆฌ ํ๋ฉด์์ csn์ ์ธ์ด ์ค์ (cLang)์ ๋ฐ๊พธ๋ฉด, ๋ค์
giipGraphifyRebuildํธ์ถ๋ถํฐ ๊ทธ๋ํ์ ํ์๋๋ ํ ์คํธ ์ธ์ด๊ฐ ๋ฐ๋๋๋ค. ์๋ณธ tKB ๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฟ ํ์๊ฐ ์์ต๋๋ค. - ๊ฐ์ tKB ๋ฐ์ดํฐ๋ผ๋ csn๋ง๋ค
cLang์ด ๋ค๋ฅด๋ฉด ๊ฐ csn์ ๊ทธ๋ํ์๋ ์๋ก ๋ค๋ฅธ ์ธ์ด๋ก ๋ ธ๋๊ฐ ํ์๋ ์ ์์ต๋๋ค. - ๋ฒ์ญ์ ์ฌ๋น๋๋ง๋ค ๋ค์ ์ํ๋ฉ๋๋ค(์บ์/๋์ ์์) โ ์๋ณธ
title/content๊ฐ ์ต์ ์์ค์ ๋๋ค.
๋น ๋ฅธ ์์ (3๋จ๊ณ)
# 1) ํญ๋ชฉ ์ ์ฌ โ giipKb POST (ํธ์คํธ: giipfaw.azurewebsites.net)
curl -X POST "https://giipfaw.azurewebsites.net/api/giipKb" \
-H "x-api-key: <YOUR_AK_OR_SK>" -H "Content-Type: application/json" \
-d '{"csn":47,"title":"OAuth ์ฝ๋ฐฑ 500 ์ค๋ฅ","content":"## ์์ธ\ntoken ๊ตํ ํ์์์","tags":"auth,oauth,timeout","refType":"ISSUE","extRefId":"ISSUE-1001"}'
# 2) ๊ทธ๋ํ ์ฌ๋น๋ โ giipGraphifyRebuild POST
curl -X POST "https://giipfaw.azurewebsites.net/api/giipGraphifyRebuild" \
-H "x-api-key: <YOUR_AK_OR_SK>" -H "Content-Type: application/json" \
-d '{"csn":47}'
# 3) ํ์ธ โ ๋ธ๋ผ์ฐ์ ์์ https://<host>/ko/graphify?csn=47
์ธ์ฆ ํค(
x-api-key)๋ ๋ก๊ทธ์ธ ์ฌ์ฉ์์ AK ๋๋ ํ๋ก์ ํธ ์ค์ฝํ SK๋ฅผ ์ฌ์ฉํฉ๋๋ค. ํค๋ ์์ ์csn๋ฒ์๋ก๋ง ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ/์ฌ๋น๋ํ ์ ์์ต๋๋ค.
โญ ์ ๋ณด๊ฐ ์ ๋ณด์ด๊ฒ ํ๋ ๋ฒ (ํต์ฌ)
Graphify๋ ํ๊ทธ ์ด๋ถ(bipartite) ๊ทธ๋ํ์ ๋๋ค. ์ฆ ๋ฌธ์๋ "๊ณต์ ํ๊ทธ"๋ฅผ ํตํด ์๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค(ํ๊ทธ๊ฐ 1๊ธ ๋ ธ๋). ๋ฐ๋ผ์ ํ๊ทธ๋ฅผ ์ด๋ป๊ฒ ๋ถ์ด๋๋๊ฐ ๊ทธ๋ํ ํ์ง์ ์ข์ฐํฉ๋๋ค.
์ข์ ํ๊ทธ (์ฐ๊ฒฐ์ด ์ ์๊น)
- 2~50๊ฐ ํญ๋ชฉ์ด ๊ณต์ ํ๋ ์๋ฏธ ์๋ ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ธ์. ์:
auth,billing,timeout,payment,login. - ๊ฐ์ ์ฃผ์ ์ ํญ๋ชฉ๋ค์ด ๊ณต์ ํ๊ทธ ๋ ธ๋๋ฅผ ์ค์ฌ์ผ๋ก ํด๋ฌ์คํฐ๋ฅผ ์ด๋ฃน๋๋ค.
ํผํด์ผ ํ ํ๊ทธ
| ๋์ ํจํด | ์ ์ ์ข์๊ฐ | ๊ฒฐ๊ณผ |
|---|---|---|
ํญ๋ชฉ๋ง๋ค ์ ์ผํ ํ๊ทธ (์: ํ์ผ๋ช
report_2026_01.md) | ๊ณต์ ํ๋ ํญ๋ชฉ์ด ์์(DF=1) | ์๋ฌด๊ฒ๋ ์ฐ๊ฒฐ ์ ๋จ โ ๊ณ ๋ฆฝ ๋ ธ๋ |
๊ฑฐ์ ๋ชจ๋ ํญ๋ชฉ์ ๋ถ๋ ์ ๋ค๋ฆญ ํ๊ทธ (์: doc, sync, general) | ๋ฌธ์๋น๋(DF)๊ฐ ๋๋ฌด ๋์ | ์๋ ํํฐ๋ง๋์ด ์ฃ์ง์์ ์ ์ธ(ํค์ด๋ณผ ๋ฐฉ์ง) |
๊ท์น ์์ฝ: ๋๋ฌด ํํ์ง๋, ๋๋ฌด ์ ์ผํ์ง๋ ์์ ํ๊ทธ๊ฐ ์ข์ ์ฐ๊ฒฐ์ ๋ง๋ญ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํ
csn์์์ DF(๋ฌธ์๋น๋)๊ฐ 2~50์ธ ํ๊ทธ๋ง ํ๊ทธ ๋ ธ๋๊ฐ ๋ฉ๋๋ค.
๊ทธ ์ธ ํ์ ํ
title: ๊ทธ๋ํ์ ๋ ธ๋ ๋ผ๋ฒจ์ด ๋ฉ๋๋ค. ์งง๊ณ ๋ช ํํ๊ฒ.content: ๋ ธ๋๋ฅผ ํด๋ฆญํ๋ฉด ์์ธ ํ์ ๋ณธ๋ฌธ์ผ๋ก ๋งํฌ๋ค์ด ๋ ๋๋ฉ๋๋ค.extRefId: ์ธ๋ถ ์์คํ ์ ํญ๋ชฉ ID. ์ฌ๋๊ธฐํ ์ **์ค๋ณต ์์ฑ ์์ด ๊ฐฑ์ (๋ฉฑ๋ฑ)**๋ฉ๋๋ค.- ์ฌ๋น๋ ํ์: ํญ๋ชฉ๋ง ์ถ๊ฐํ๊ณ ์ฌ๋น๋๋ฅผ ์ ํ๋ฉด ๊ทธ๋ํ๋ ๊ทธ๋๋ก์
๋๋ค. ๋ฐฐ์น ์ ์ฌ ํ
giipGraphifyRebuild๋ฅผ ํ ๋ฒ ํธ์ถํ์ธ์.
์์ธ ๊ธฐ๋ฅ ยท API ์ฐธ์กฐ
1) ํญ๋ชฉ ์ ์ฌ โ giipKb
POST https://giipfaw.azurewebsites.net/api/giipKb ยท ํค๋ x-api-key: <ak/sk>
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
csn | int | โ | ํ๋ก์ ํธ ๋ฒํธ. ํค ๊ถํ ๋ฒ์์ ์ผ์นํด์ผ ํจ(๊ธฐ๋ณธ ์์: 47) |
title | string(200) | โ | ๋ ธ๋ ๋ผ๋ฒจ |
content | string | ๋ ธ๋ ์์ธ ๋ณธ๋ฌธ(๋งํฌ๋ค์ด ํ์ฉ) | |
tags | string(500) | ์ฝค๋ง ๊ตฌ๋ถ ํ๊ทธ. ์ฐ๊ฒฐ์ ํต์ฌ(์ "์ข์ ํ๊ทธ" ์ฐธ์กฐ) | |
refType | string(50) | โ | ํญ๋ชฉ ์ข
๋ฅ. ์: ISSUE, GENERAL, GUIDE |
extRefId | string(100) | ์ธ๋ถ ํญ๋ชฉ ID(๋ฉฑ๋ฑ upsert ํค). ์์ผ๋ฉด ์ฌ๋๊ธฐํ ์ ๊ฐฑ์ |
์๋ต
{ "success": true, "kbSn": 844, "message": "KB entry created successfully" }
๋์ผ extRefId๋ก ๋ค์ ๋ณด๋ด๋ฉด:
{ "success": true, "kbSn": 844, "message": "KB entry updated (idempotent)" }
PowerShell ์์
$headers = @{ "x-api-key"="<ak/sk>"; "Content-Type"="application/json; charset=utf-8" }
$body = @{ csn=47; title="๊ฒฐ์ ์ง์ฐ"; content="## ์ฆ์`n๊ฒฐ์ ์น์ธ 5์ด ์ง์ฐ"; tags="payment,timeout"; refType="ISSUE"; extRefId="ISSUE-1002" } | ConvertTo-Json
Invoke-RestMethod -Uri "https://giipfaw.azurewebsites.net/api/giipKb" -Method POST -Headers $headers -Body ([Text.Encoding]::UTF8.GetBytes($body))
2) ๊ทธ๋ํ ์ฌ๋น๋ โ giipGraphifyRebuild
POST https://giipfaw.azurewebsites.net/api/giipGraphifyRebuild ยท ํค๋ x-api-key: <ak/sk>
ํด๋น csn์ ๊ทธ๋ํ๋ฅผ tKB๋ก๋ถํฐ ์ฌ์์ฑํฉ๋๋ค(DOC ๋
ธ๋ + ๋ณ๋ณ๋ ฅ ํ๊ทธ ๋
ธ๋ + docโtag ์ฃ์ง).
| ํ๋ | ํ์ | ํ์ | ์ค๋ช |
|---|---|---|---|
csn | int | โ | ์ฌ๋น๋ํ ํ๋ก์ ํธ ๋ฒํธ |
maxTagDF | int | ์ ๋ค๋ฆญ ํ๊ทธ ์ปท(๋ฌธ์๋น๋ ์ํ, ๊ธฐ๋ณธ 50). ์ด๋ณด๋ค ํํ ํ๊ทธ๋ ์ ์ธ | |
maxNodes | int | DOC ๋ ธ๋ ์์ ์ํ(๊ธฐ๋ณธ 20000) |
์๋ต
{ "success": true, "nodes": 838, "edges": 11, "docNodes": 835, "tagNodes": 3, "message": "Graph rebuilt (tag-bipartite)" }
docNodes: ๋ฌธ์ ๋ ธ๋ ์,tagNodes: ํ๊ทธ ๋ ธ๋ ์,edges: docโtag ์ฐ๊ฒฐ ์.
๋ฌธ์ ํด๊ฒฐ
| ์ฆ์ | ์์ธ | ํด๊ฒฐ |
|---|---|---|
| ๊ทธ๋ํ๊ฐ ๋น์ด ๋ณด์ | ์ฌ๋น๋ ๋ฏธํธ์ถ / ์๋ชป๋ csn | giipGraphifyRebuild ํธ์ถ, ?csn= ํ์ธ |
| ๋ ธ๋๋ ๋ง์๋ฐ ์ฐ๊ฒฐ์ด ๊ฑฐ์ ์์ | ํ๊ทธ๊ฐ ์ ์ผ(DF=1)ํ๊ฑฐ๋ ์ ๋ค๋ฆญ(DF ๊ณผ๋ค) | 2~50๊ฐ๊ฐ ๊ณต์ ํ๋ ์๋ฏธ ํ๊ทธ๋ก ์ฌ์ ์ฌ ํ ์ฌ๋น๋ |
| ๊ฐ์ ํญ๋ชฉ์ด ์ค๋ณต ์์ฑ | extRefId ๋ฏธ์ฌ์ฉ | extRefId๋ฅผ ๋ฃ์ด ๋ฉฑ๋ฑ ์ ์ฌ |
| 401/403 | ํค ์์ / ๋ค๋ฅธ csn | ์ฌ๋ฐ๋ฅธ x-api-key์ ์๊ธฐ csn ์ฌ์ฉ |
๋ฉํ๋ฐ์ดํฐ
- ์์ค ํ์ผ:
giipv3/public/help/api-graphify.ko.md - raw ์๋ฌธ ๊ฒฝ๋ก:
/help/api-graphify.ko.md - ๊ด๋ จ API:
giipfaw/giipKb,giipfaw/giipGraphifyRebuild - ๊ด๋ จ ํ์ด์ง:
/[locale]/graphify