์ด์ ๊ด๋ฆฌ API ๋ ํผ๋ฐ์ค
GIIP ํ๋ซํผ์์ ๋ฐ์ํ๋ ์ด์ ๋ฐ ์๋ฌ ๋ก๊ทธ๋ฅผ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์กฐํํ๊ณ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ API๋ฅผ ์๋ดํฉ๋๋ค.
๐ ๊ฐ์
์ด API ๋ชจ๋์ ์ค์๊ฐ ์ด์ ๊ด๋ฆฌ ์๋ฃจ์ ์ธ [์ด์ ๊ด๋ฆฌ] ๋ฉ๋ด์ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ ์์คํ ๊ณผ ๋๊ธฐํํ๊ฑฐ๋, ์ฅ์ ๋์ ํ์ดํ๋ผ์ธ(ITSM ๋ฑ)๊ณผ ์ฐ๋ํ๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
๐ ์ธ์ฆ (Authentication)
์ด API๊ฐ ๋ฐ์๋ค์ด๋ ํค์ ์ข
๋ฅ, ํค๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ ์ค๋ฅ ์์ธ์ ์ค์ ์๋ฒ ์ฝ๋
(giipfaw/giipIssues/run.ps1, giipfaw/giipIssueComments/run.ps1, ๋์ pApiGiipIssue*byAK SP๊ตฐ)์
๋ผ์ด๋ธ API ์ค์ธก(giipfaw, 2026-08-20) ์์ชฝ์ผ๋ก ํ์ธํ ๋ด์ฉ์ ๊ธฐ์ค์ผ๋ก ์ค๋ช
ํฉ๋๋ค. ๊ณตํต AK/SK ์ฉ์ด ์ ์๋
API ๋ ํผ๋ฐ์ค ๊ฐ์ โ ์ธ์ฆ ์ ์ฐธ์กฐํ์ธ์.
x-api-key๋ HTTP ํค๋์ "์ด๋ฆ"์ด์ง, ๋ณ๋์ ์๊ฒฉ์ฆ๋ช ์ข ๋ฅ๊ฐ ์๋๋๋ค. ์ ํจํ ํ๋ก์ ํธ SK, ์ฌ์ฉ์ ๊ณ ์ ํค, ๋ก๊ทธ์ธ ์ธ์ AK ์ค ํ๋๋ฅผ ์ด ํค๋์ ๊ฐ์ผ๋ก ๋ฐ๋ก ๋ฃ์ผ์ธ์. ํ๋ก์ ํธ SK ๋ฅผ ์ด๋ค๋ฉด ๋ณ๋์ "API ํค"๋ฅผ ๋ฐ๊ธํ ํ์๊ฐ ์์ต๋๋ค.
ํค ์ ๋ฌ ๋ฐฉ์ โ ํค๋๋ง ์ง์ (์ค์ธก)
| ์ ๋ฌ ๋ฐฉ์ | ์ง์ ์ฌ๋ถ |
|---|---|
x-api-key: <key> ํค๋ | โ ์ง์(๊ถ์ฅ) |
Authorization: Bearer <key> ํค๋ | โ ์ง์(๋์ฒด ๊ฐ๋ฅ) |
JSON ๋ฐ๋ { "token": "<key>" } | โ ๋ฏธ์ง์(์๋ฒ ์ฝ๋๊ฐ ์ฝ์ง ์์. ์ ๋ฌํด๋ 401 Auth required) |
์ฟผ๋ฆฌ ๋ฌธ์์ด ?token=<key> | โ ๋ฏธ์ง์/์ง์์ค๋จ(์์ ๋์ผ. ๊ฒ๋ค๊ฐ ํค๋ฅผ ์ฟผ๋ฆฌ ๋ฌธ์์ด์ ์ฃ๋ ๋ฐฉ์ ์์ฒด๊ฐ ์๋ฒ ๋ก๊ทธยท๋ธ๋ผ์ฐ์ ๊ธฐ๋กยทํ๋ก์ ๋ก๊ทธ์ ํค๋ฅผ ๋จ๊ธฐ๋ฏ๋ก ๋ณด์์ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค) |
์ด ๋ฌธ์์ ์ด์ ๋ฒ์ ์๋ "Body/Query๋ก๋ ์ ๋ฌ ๊ฐ๋ฅ"์ด๋ผ๋ ๋ด์ฉ์ด ์์์ง๋ง,
giipIssues/giipIssueComments์run.ps1์$Request.Headers["x-api-key"]โ ์คํจ ์Authorizationํค๋, ์ด 2๊ฐ์ง๋ง ์ฝ์ผ๋ฉฐ ์ค์ ๋ก๋ ๋์ํ์ง ์์ต๋๋ค(2026-08-20, ์ฝ๋ ํ์ธ + ๋ผ์ด๋ธ ์ค์ธก์ผ๋ก ์ญ์ ํ์ ). ํค๋ ๋ฐ๋์ ํค๋๋ก ์ ๋ฌํ์ธ์.
ํค์ ์ข ๋ฅ(3๊ฐ์ง, ๊ถํ ๋ฒ์๊ฐ ๋ค๋ฆ)
| ์ข ๋ฅ | ์ค์ฒด | ๋ฐ๊ธ ๋จ์ | ๊ถํ ๋ฒ์ | ๋ฐ๊ธ/ํ์ธ | ๊ฒ์ฆ ๋ฐฉ๋ฒ |
|---|---|---|---|---|---|
| ํ๋ก์ ํธ SK(๊ถ์ฅยท์์ด์ ํธ์ฉ) | tSecretKey.SKey | ํ๋ก์ ํธ(csn)๋น 1๊ฐ | ๊ทธ csn๋ง. ํธ์ถ์ ๊ฐ์ธ์ ํน์ ๋์ง ์๋ ๊ณต์ ํค(์ฝ๋ฉํธ ๋ฑ๋ก ์ author๋ ํด๋ผ์ด์ธํธ๊ฐ ์ง์ ํ ๊ฐ์ด ๊ทธ๋๋ก ์ฌ์ฉ๋จ โ ์ค์ธก ํ์ธ) | /svclist(์๋น์ค ๋ชฉ๋ก) ํ๋ฉด์์ ๋ฐ๊ธ/์ฌ๋ฐ๊ธ | ์๋ "์ธ์ฆ ํ์ธ ์ ์ฐจ" ์ฐธ์กฐ |
์ฌ์ฉ์ ๊ณ ์ ํค(tCorpUser.uSecretKey) | ๋์ผ | ์ฌ์ฉ์(usn)๋น 1๊ฐ | ํด๋น ์ฌ์ฉ์ ๋ณธ์ธ์ด ์ํ csn(tUserPerCorp/tCorpUserRel). ๊ด๋ฆฌ์ ๊ถํ(uLevelโฅ99) ์ฌ์ฉ์๋ผ๋ฉด ์ ์ฒด csn | ๊ด๋ฆฌ์๊ฐ ๋ฐ๊ธ(giipv3 ์ฌ์ฉ์ ๊ด๋ฆฌ ํ๋ฉด) | ๋์ผ |
| ๋ก๊ทธ์ธ ์ธ์ AK | tUserLogin.AccToken | ๋ก๊ทธ์ธํ ๋๋ง๋ค ์ ๊ท ๋ฐ๊ธ, 24์๊ฐ ํ ๋ง๋ฃ | ๋ก๊ทธ์ธํ ์ฌ์ฉ์ ๋ณธ์ธ๊ณผ ๋์ผํ ๊ถํ | ๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ ์ ์๋ ๋ฐ๊ธ(sessionStorage) | ๋์ผ |
์ธ ์ข ๋ฅ ๋ชจ๋ ๊ฐ์
x-api-keyํค๋๋ก ์ ๋ฌํ๋ฉด ์๋ฒ๊ฐ ์๋์ผ๋ก ํ๋ณํฉ๋๋ค(lwGetUSNbyatโ ์คํจ ์lwGetUSNbysk๋ก ํด๋ฐฑํ๋ ์ฒด์ธ). ์๋ต๋ง์ผ๋ก๋ ํธ์ถ์๊ฐ ์ด๋ค ์ข ๋ฅ๋ฅผ ์ผ๋์ง ๊ตฌ๋ถํ ์ ์์ต๋๋ค(์ฑ๊ณต/์คํจ ๋์์ ๋์ผ)๋ง, ๊ถํ ๋ฒ์(์ด๋ csn์ ์ ๊ทผ ๊ฐ๋ฅํ์ง)๋ ์ข ๋ฅ๋ง๋ค ๋ค๋ฆ ๋๋ค.์ด๋ฒ ์ธ์ ์ ์ค์ธก์ ์ฃผ๋ก ํ๋ก์ ํธ SK(
giip-accounts.json์ ๋ฑ๋ก๋ ์ค์ด์ SK)๋ก ์งํํ์ต๋๋ค. ์ฌ์ฉ์ ๊ณ ์ ํคยท๋ก๊ทธ์ธ ์ธ์ AK๋ ์ด ์ธ์ ์์ ๋ธ๋ผ์ฐ์ ๋ก๊ทธ์ธ์ผ๋ก ์ ๊ท ๋ฐ๊ธํ ์ ์์ด ์์ค ์ฝ๋ ๋ถ์์ผ๋ก๋ง ํ์ธํ์ต๋๋ค(lwGetUSNbyat.sql์ 3๋จ๊ณ ํด๋ฐฑ ๋ก์ง์์ ์กด์ฌ๋ฅผ ํ์ธํจ. ๋ผ์ด๋ธ ์ ๊ท ๋ฐ๊ธยท์ค์ธก์ ์ํํ์ง ์์ โ ์์งํ ๋ฐํ๋๋ค).
SK์ ์กฐ๊ฑด(์ ๋ถ ์ค์ธก+์ฝ๋ ํ์ธ)
- ๋ฐ๊ธ ์์น: giipv3์
/svclist(์๋น์ค ๋ชฉ๋ก) ํ๋ฉด. ํ๋ก์ ํธ(csn)๋น 1๊ฐ. - ํ์ฑํ ํ์ธ:
tSecretKey.SKStatus = 1์ผ ๋๋ง ์ ํจํฉ๋๋ค. ์ฌ๋ฐ๊ธ/ํ์ ํ๋ฉด ์ด์ SK๋ ์ฆ์SKStatus = 0์ด ๋๊ณ , ์ดํ401 Invalid session์ ๋ฐํํฉ๋๋ค(giip #1265์์ ์ค์ธก: ํ์ฑ SKโ200, ๋นํ์ฑํ๋ SKโ401๋ ๋ค ํ์ธ). - ์ฐ๊ฒฐ csn:
tSecretKey.CSn์ 1:1๋ก ๊ณ ์ ๋ฉ๋๋ค. (๊ด๋ฆฌ์ ๊ถํ์ด ์๋ ํ) ๋ค๋ฅธ csn์๋ ์ ๊ทผํ ์ ์์ต๋๋ค (์๋ "csn ๊ถํ ๋ถ์ผ์น ์ ๋์" ์ฐธ์กฐ). - ํ์ ๊ถํ: SK ์์ฒด๊ฐ ํด๋น csn ์ ๊ทผ ๊ถํ์ ๋ํ๋ด๋ฏ๋ก ์ถ๊ฐ ๊ถํ ์ค์ ์ด ํ์ ์์ต๋๋ค.
- ๋ง๋ฃ ์ฌ๋ถ: ์๊ฐ ๊ฒฝ๊ณผ๋ก ์๋ ๋ง๋ฃ๋์ง ์์ต๋๋ค(๋ก๊ทธ์ธ ์ธ์ AK์ ๋ฌ๋ฆฌ 24์๊ฐ ์ ํ ์์). ๋นํ์ฑํ๋๋ ๊ฒฝ์ฐ๋ ์ฌ๋ฐ๊ธ/ํ์ ์๋ฟ์ ๋๋ค.
- ํ์ฉ ์๋ํฌ์ธํธ:
GET/POST/PUT /api/giipIssues,GET/POST /api/giipIssueComments์ ๋ถ์์ ์ฌ์ฉ ๊ฐ๋ฅ(์ค์ธก ํ์ธ). ๋จgiipApiSk2๊ฒฝ์GiipIssuePut์ปค๋งจ๋๋ ์ ์ฒด ๋ฎ์ด์ฐ๊ธฐ SP๋ผ ๋ณ๊ฐ์ด๋ฏ๋ก ์ฐ๊ธฐ์๋ ์ฐ์ง ๋ง์ธ์(์๋ "๋ฐฉ๋ฒ 2" ์ฐธ์กฐ). - ํค ๊ฒ์ฆ์ฉ ์ฝ๊ธฐ API: ์ฐ๊ธฐ(POST/PUT) API๋ฅผ ํธ์ถํ๊ธฐ ์ , ๋ถ์์ฉ ์๋
GET /api/giipIssues๋ก ๋จผ์ ํค๊ฐ ์ ํจํ์ง ์์ ํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค(์๋ "์ธ์ฆ ํ์ธ ์ ์ฐจ" ์ฐธ์กฐ). - ์ฌ๋ฐ๊ธ ๋ฐฉ๋ฒ:
/svclistํ๋ฉด์์ ๋์ csn์ SK๋ฅผ ์ฌ์์ฑํฉ๋๋ค(์ด์ SK๋ ์ฆ์ ๋ฌดํจํ๋๋ฏ๋ก, ์ด ํค์ ์์กดํ๋ ์๋ํ๊ฐ ์๋ค๋ฉด ํจ๊ป ๊ฐฑ์ ํ์ธ์).
์ธ์ฆ ํ์ธ ์ ์ฐจ(์ฐ๊ธฐ ์ ์์ ํ๊ฒ ๊ฒ์ฆ)
์ฐ๊ธฐ API(POST/PUT)๋ฅผ ํธ์ถํ๊ธฐ ์ ์, ๋ถ์์ฉ ์๋ GET์ผ๋ก ํค์ ์ ํจ์ฑ์ ๋จผ์ ํ์ธํ์ธ์.
curl -s -o /dev/null -w "%{http_code}\n" \
"https://giipfaw.azurewebsites.net/api/giipIssues?csn=47" \
-H "x-api-key: ${GIIP_API_KEY}"
- ์ฑ๊ณต ์(
200):{"issues":[...]}โ ์ด ํค๋ฅผ ๊ทธ๋๋ก ์์ฑ/์ํ๋ณ๊ฒฝ API์ ์ฌ์ฉํ ์ ์์ต๋๋ค. - ์คํจ ์(
401):{"error":"Auth required"}(ํค๋ ์์ฒด๊ฐ ์๊ฑฐ๋ ์ฝํ์ง ์์) ๋๋{"error":"Invalid session"}(ํค๋ ์์ง๋ง ๋ฌดํจ โ ์์ธํ ๋ด์ฉ์ ์๋ "401 Invalid session ์์ธ ๋ถ๋ฅ" ์ฐธ์กฐ). ์ด ๊ฒฝ์ฐ ์์ฑ API๋ฅผ ์คํํ์ง ๋ง์ธ์.
๐ ์ฃผ์ API ์๋ํฌ์ธํธ (์ค์ ๊ตฌํ ๊ธฐ์ค)
์ด์ API๋ ๋ ๊ฒฝ๋ก ๋ชจ๋ ์ ์ ๋์ํฉ๋๋ค. ์ ๊ท ๋ฑ๋กยท์ฝ๋ฉํธ ๋ฑ CRUD๋ ์ ์ฉ REST ์๋ํฌ์ธํธ(giipv3 ์ด๋๋ฏผ UI๊ฐ ์ค์ ์ฌ์ฉํ๋ ๊ฒฝ๋ก)๋ฅผ, SP ์ง์ ํธ์ถ์ giipApiSk2 ๋ํผ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
1. ์ด์ ์ ์ฉ ์๋ํฌ์ธํธ (REST API)
๊ฐ์ฅ ์ง๊ด์ ์ธ ํธ์ถ ๋ฐฉ์์ด๋ฉฐ, giipv3 ์ด๋๋ฏผ UI๊ฐ ์ค์ ์ฌ์ฉํ๋ ๊ฒฝ๋ก์
๋๋ค. ์ธ์ฆ์ x-api-key ํค๋, Content-Type์ application/json. ํค๋ ํ๊ฒฝ๋ณ์๋ก ์ ๋ฌํ๊ณ ํ๋์ฝ๋ฉํ์ง ๋ง์ธ์.
- ์ ๊ท ๋ฑ๋ก:
POST /api/giipIssuesโisn์ ์๋ต(๋๋ 0)ํ๋ฉด ์ ๊ท ์ด์๊ฐ INSERT๋๊ณ ์isn์ ๋ฐํํฉ๋๋ค.
curl -s -X POST "https://giipfaw.azurewebsites.net/api/giipIssues" \
-H "x-api-key: ${GIIP_API_KEY}" -H "Content-Type: application/json" \
-d '{ "title":"์ ๋ชฉ(ํ์)", "content":"๋ณธ๋ฌธ", "status":"PENDING",
"csn":47, "target_lssn":null, "agent_workflow":null }'
- ์ฑ๊ณต:
{ "isn":577, "message":"Issue created", "success":true }(์ค์ธก: 2026-08-20, isn 1282๋ก ํ์ธ ํ ์ญ์ ) - ๋ชฉ๋ก ์กฐํ:
GET /api/giipIssues?status=READY&csn=47(csn ์ง์ ๊ถ์ฅ โ ์๋ตํ๋ฉด ํค ๊ถํ ๋ฒ์ ๋ด ์ ์ฒด csn ๋ฐํ) - ์์ธ ์กฐํ:
GET /api/giipIssues?isn=7890 - ์ํ ์
๋ฐ์ดํธ/์๋ฃ:
PUT /api/giipIssues- Body:
{ "isn":7890, "status":"DONE" }โ{ "success":true }
- Body:
- ์ฝ๋ฉํธ ๋ฑ๋ก:
POST /api/giipIssueComments- Body:
{ "isn":7890, "content":"์ฒ๋ฆฌ ์๋ฃ", "author":"api-tester", "issuetype":"comment" }โ{ "success":true } - ์ฝ๋ฉํธ ์กฐํ:
GET /api/giipIssueComments?isn=7890โ{ "comments":[...] }
- Body:
์ ๋ฌ ๋ฐฉ์ ์์ฝ (์ค์ธก, 2026-08-20)
| ์๋ํฌ์ธํธ | x-api-key ํค๋ | Authorization: Bearer ํค๋ | JSON ๋ฐ๋ token | ์ฟผ๋ฆฌ ?token= |
|---|---|---|---|---|
GET /api/giipIssues | โ ์ค์ธก 200 | โ ์ค์ธก 200 | โ ๋ฏธ์ง์(401) | โ ์ค์ธก 401 |
POST /api/giipIssues(์์ฑ) | โ ์ค์ธก 200 | ์ฝ๋ ๋์ผ(๋ฏธ์ค์ธกยท๊ณ ์ ๋ขฐ) | โ ์ค์ธก 401 | โ ์ค์ธก 401 |
PUT /api/giipIssues(์ํ๋ณ๊ฒฝ) | โ ์ค์ธก 200 | ์ฝ๋ ๋์ผ(๋ฏธ์ค์ธกยท๊ณ ์ ๋ขฐ) | โ ์ค์ธก 401 | ์ฝ๋ ๋์ผ(๋ฏธ์ค์ธกยท๊ณ ์ ๋ขฐ) |
POST /api/giipIssueComments | โ ์ค์ธก 200 | ์ฝ๋ ๋์ผ(๋ฏธ์ค์ธกยท๊ณ ์ ๋ขฐ) | โ ์ค์ธก 401 | โ ์ค์ธก 401 |
GET /api/giipIssueComments | โ ์ค์ธก 200 | ์ฝ๋ ๋์ผ(๋ฏธ์ค์ธกยท๊ณ ์ ๋ขฐ) | โ ๋ฏธ์ง์ | โ ๋ฏธ์ง์(๋ฏธ์ค์ธกยท๊ณ ์ ๋ขฐ) |
"์ฝ๋ ๋์ผ(๋ฏธ์ค์ธกยท๊ณ ์ ๋ขฐ)"์ 4๊ฐ ์๋ํฌ์ธํธ ๋ชจ๋์ ์ธ์ฆ ์ถ์ถ ์ฝ๋(
$Request.Headers["x-api-key"]โ ์คํจ ์Authorizationํค๋, ์ด 2๊ฐ์ง๋ฟ)๊ฐgiipfaw/giipIssues/run.ps1ยทgiipIssueComments/run.ps1์์ ์์ ํ ๋์ผํจ์ ์์ค๋ก ํ์ธํ ๋ค์ ์ถ์ ์ ๋๋ค(์ ์ฒด 20์นธ์ ๋งค๋ฒ ์คํํ์ง๋ ์์๊ณ , ์ฃผ์ ์นธ์ ์ค์ธกํ๊ณ ๋๋จธ์ง๋ ์ฝ๋ ๋ฆฌ๋ทฐ๋ก ๋์ฒดํ์ต๋๋ค).
์ธ์ฆ ์ค๋ฅ ์ ๋์(2026-08-24 ๋ผ์ด๋ธ ์ค์ธก): ์ด ๋ฌธ์์ ์ด์ ๋ฒ์ ์๋
GET /api/giipIssueComments๊ฐ ๋ฌดํจํ ํค์๋ HTTP 200์ ๋ฐํํ๋ ์๋ ค์ง ๋ฒ๊ทธ๊ฐ ์๋ค๋ ๊ธฐ๋ก์ด ์์์ง๋ง, ์ด๋ ์์ ๋์์ต๋๋ค(giip #1285). ํ์ฌ๋GET /api/giipIssues์ ๋์ผํ๊ฒ ๋์ํ๋ฉฐ, ๋ฌดํจํ ํค์๋ HTTP 401{"error":"Invalid session"}์ ๋ฐํํฉ๋๋ค(2026-08-24, giipfaw API์ ๋ํด ๋ผ์ด๋ธ ์ค์ธก์ผ๋ก ํ์ธ). ์ธ์ฆ ์ฑ๊ณต/์คํจ๋ HTTP ์ํ ์ฝ๋๋ก ํ์ ํ๋ฉด ๋ฉ๋๋ค.
csn ๊ถํ ๋ถ์ผ์น ์ ๋์ (401 ์๋)
ํค๋ ์ ํจํ์ง๋ง ๋์ csn์ ์ ๊ทผ ๊ถํ์ด ์๋ ๊ฒฝ์ฐ, 401์ด ๋์ง ์์ต๋๋ค(์ค์ธก ํ์ธ, 2026-08-20).
| ํธ์ถ | ์ค์ธก ๊ฒฐ๊ณผ |
|---|---|
GET /api/giipIssues?csn=<๊ถํ์์> | 200 {"issues":[]}(๋น ๋ฐฐ์ด. ์ค๋ฅ ์๋) |
POST /api/giipIssues์์ csn์ ๊ถํ ์๋ ๊ฐ์ ์ง์ | 200์ผ๋ก ์ฑ๊ณตํ์ง๋ง, ์ง์ ํ csn์ ๋ฌด์๋๊ณ ํค ์์ ์ ํ csn์ผ๋ก ์กฐ์ฉํ ํด๋จํ(clamp)๋จ(์ค์ธก: csn70335์ SK๋ก csn:47 ์ง์ โ ์ค์ ๋ก๋ cSn:70335๋ก ์์ฑ๋จ) |
ํน์ isn์ GET/PUT/์ฝ๋ฉํธ ๋ฑ๋ก์์ ๋์ ์ด์์ csn์ ๊ถํ์ด ์์ | 404 {"error":"Issue not found or no permission"} |
์ง์ ์ํ๊ฐ๊ณผ ๋ค์ค ์ํ ์กฐํ ํจํด
์ง์ ์ํ๊ฐ (์ค์ธก ํ์ธ, 2026-08-27):
| ์ํ๊ฐ | ์๋ฏธ |
|---|---|
PENDING | ๋ฑ๋ก๋จ, ๋ฏธ์ฒ๋ฆฌ |
READY | ์ฒ๋ฆฌ ์ค๋น ์๋ฃ |
IN_PROGRESS | ์ฒ๋ฆฌ ์ค |
REVIEW | ์ฌ๋ ๊ฒํ ๋๊ธฐ |
TESTED | ํ ์คํธ ์๋ฃ, ์ต์ข ๊ฒ์ ๋๊ธฐ |
WARN | ๊ฒฝ๊ณ ยท์กฐ๊ฑด๋ถ ์๋ฃ |
DONE | ์๋ฃ |
๋ค์ค ์ํ ์กฐํ โ ๋จ์ผ ํํฐ ์์ ์ผ์น๋ง ์ง์ (์ค์):
GET /api/giipIssues?status=TESTED,REVIEW ๋๋ status=TESTED|REVIEW ํํ์ OR ์กฐํ๋ ์ง์ํ์ง ์์ต๋๋ค.
์ผํยทํ์ดํยทํ๋ผ๋ฏธํฐ ๋ฐ๋ณต์ ๋ชจ๋ ๋จ์ผ ์์ ์ผ์น ๋ฌธ์์ด๋ก ์ธ์๋์ด ์๋๋๋ก ๋์ํ์ง ์์ต๋๋ค.
๋๋ ์ฒ๋ฆฌ ์ํฌํ๋ก์ฐ(์: /gissue-final-review)์์ TESTED์ REVIEW๋ฅผ ๋ชจ๋ ์ฒ๋ฆฌํด์ผ ํ ๋๋ ๊ฐ ์ํ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์กฐํํ ๋ค ํด๋ผ์ด์ธํธ์์ ์์๋๋ก ๊ฒฐํฉํฉ๋๋ค:
# 1. TESTED ๋จผ์ ์กฐํ
TESTED_ISSUES=$(curl -s "https://giipfaw.azurewebsites.net/api/giipIssues?status=TESTED&csn=47" \
-H "x-api-key: ${GIIP_API_KEY}")
# 2. REVIEW ์กฐํ
REVIEW_ISSUES=$(curl -s "https://giipfaw.azurewebsites.net/api/giipIssues?status=REVIEW&csn=47" \
-H "x-api-key: ${GIIP_API_KEY}")
# 3. ํด๋ผ์ด์ธํธ์์ TESTED โ REVIEW ์์๋ก ๊ฒฐํฉ
# (jq, Python, JS ๋ฑ ์ฌ์ฉ)
์ฃผ์: ์กฐํ ์์ ๊ธฐ์ค ํ ์ค๋ ์ท์ด๋ฏ๋ก, TESTED ์ฒ๋ฆฌ ์ค์ ์๋ก์ด REVIEW๊ฐ ๋ค์ด์ฌ ์ ์์ต๋๋ค. ์ํฌํ๋ก์ฐ์ "์ต์ด ์ค๋ ์ท" ๊ธฐ์ค์ ์งํค๋ ค๋ฉด ๋ ์ฟผ๋ฆฌ๋ฅผ ๋์์ ์คํํ๊ณ , ์ดํ ์ถ๊ฐ๋ ์ด์๋ ๋ค์ ์คํ ์ฃผ๊ธฐ์ ์ฒ๋ฆฌ ๋์์ผ๋ก ๋ก๋๋ค.
์ฝ๋ฉํธ ์ ๋ ์กฐํ:
GET /api/giipIssueComments?isn=<isn>๋ ๋์ ์ด์์ ์ ์ฒด ์ฝ๋ฉํธ๋ฅผ ์๊ฐ์์ผ๋ก ๋ฐํํฉ๋๋ค. AI ์์ด์ ํธ์ ์ต์ข
๊ฒ์ ์ํฌํ๋ก์ฐ(/gissue-final-review)์์๋ ์์
์์ ์๋ฃ ๋ณด๊ณ ๋ Actionflow SUCCESS ์ฝ๋ฉํธ๋ฅผ ๊ฒ์ฆํ ์ฃผ์ฅ์ด์ง ํฉ๊ฒฉ ์ฆ๊ฑฐ๋ก ์ทจ๊ธํ์ง ์์ต๋๋ค โ repoยทPRยทํ๋ฉดยทDB๋ฅผ ์ง์ ๋์กฐํด ๋
๋ฆฝ ์ฆ๊ฑฐ๋ฅผ ํ๋ณดํด์ผ ํฉ๋๋ค.
๐ค AI ์์ด์ ํธ์ฉ ์ ์ฒด ์ ์ฐจ(๋ฑ๋ก โ ํ์ธ โ ๋ถ๋ถ ์ ๋ฐ์ดํธ โ ์ฝ๋ฉํธ)
ChatGPT/Codex ๋ฑ์ AI ์์ด์ ํธ๊ฐ ์ด์ ์ ๊ท ๋ฑ๋กยท๋ถ๋ถ ์
๋ฐ์ดํธยท์ฝ๋ฉํธ ์ถ๊ฐ๋ฅผ ์์ ํ๊ฒ ์คํํ๊ธฐ ์ํ ์ผ๋ จ์ ์ ์ฐจ์
๋๋ค. ๋ชจ๋ ์ฐ๊ธฐ ์ ํ์ GET์ผ๋ก ํ์ธํฉ๋๋ค. ๋น๋ฐ ์ ๋ณด๋ x-api-key ํค๋์๋ง ๋ฃ๊ณ , body/query์๋ ๋ฃ์ง ๋ง์ธ์.
๋ถ๋ถ ์ ๋ฐ์ดํธ(title/content/status) โ ์ ์ฒด ๋ฎ์ด์ฐ๊ธฐ๊ฐ ์๋
์ ์ฉ REST PUT /api/giipIssues๋ ๋ถ๋ถ ์
๋ฐ์ดํธ์
๋๋ค. ๋ด๋ถ SP pApiGiipIssuePutbyAK๊ฐ ๊ฐ ํ๋๋ฅผ ISNULL(@value, existing)๋ก ๊ฐฑ์ ํ๋ฏ๋ก, JSON์ ํฌํจํ์ง ์์ ํ๋๋ ๊ธฐ์กด ๊ฐ์ ์ ์งํฉ๋๋ค(2026-08-24, SP ์์ค ํ์ธ). ๊ฐฑ์ ๊ฐ๋ฅ ํ๋: title / content / status / target_lssn / agent_workflow(๊ทธ๋ฆฌ๊ณ ๊ถํ์ด ์์ผ๋ฉด csn).
# title๊ณผ content๋ง ๊ฐฑ์ (status๋ ๋ค๋ฅธ ํ๋๋ ๊ธฐ์กด ๊ฐ ๊ทธ๋๋ก)
curl -sS -X PUT "https://giipfaw.azurewebsites.net/api/giipIssues" \
-H "x-api-key: ${GIIP_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"isn":1474,"title":"Revised title","content":"Revised body"}'
- ๋ณ๊ฒฝํ์ง ์์ ํ๋๋ JSON์ ํฌํจํ์ง ๋ง์ธ์(ํฌํจํ๋ฉด ๋ฎ์ด์จ์ง๋๋ค).
- ๋น ๋ฌธ์์ด์ "๋ฏธ์ง์ "์ด ์๋๋๋ค.
"title":""๋ฅผ ๋ณด๋ด๋ฉด ์ ๋ชฉ์ด ๋น ๊ฐ์ผ๋ก ๋ฎ์ด์จ์ง๋๋ค. ๋น์ธ ์๋๊ฐ ์๋๋ผ๋ฉด ๋ณด๋ด์ง ๋ง์ธ์. - Sk2์
GiipIssuePut์ ์ ์ฒด ๋ฎ์ด์ฐ๊ธฐ SP(pApiGiipIssuePutbySK)์ด๋ฏ๋ก ํธ์ง์๋ ์ฌ์ฉ ๊ธ์ง์ ๋๋ค(์ ๋ชฉยท๋ณธ๋ฌธ์ด ํ๊ดด๋ฉ๋๋ค. ๋ฐฉ๋ฒ 2 ์ฐธ์กฐ). ์ ์ฉ RESTPUT์ ์ฐ์ธ์.
๊ธด content(4,000์ ์ด๊ณผ๋ ๊ฐ๋ฅ)
content๋ SP ์ชฝ์์ OPENJSON ... NVARCHAR(MAX)๋ก ์ฝ์ผ๋ฏ๋ก, 4,000์๋ฅผ ๋๋ Markdown ๋ณธ๋ฌธ๋ ๋ฑ๋กยท๊ฐฑ์ ํ ์ ์์ต๋๋ค(2026-08-24, SP ์์ค ํ์ธ). ๊ธด ์์
์ง์์๋ฅผ ๊ทธ๋๋ก ์ด์ํํ ์ ์์ต๋๋ค.
- UTF-8 JSON์ผ๋ก ์ ์กํฉ๋๋ค.
- ์ ธ์ ๊ธด ๋ฌธ์ฅ์ ์ง์ ๋ฃ์ง ๋ง๊ณ , ํ์ผ์์ JSON์ผ๋ก ๋ง๋ค์ด ๋ณด๋ด๋ ๊ฒ์ด ์์ ํฉ๋๋ค:
# body.json ์ {"isn":1474,"content":"...(๊ธด ๋ฌธ์ฅ)..."} ๋ฅผ ์ค๋น
curl -sS -X PUT "https://giipfaw.azurewebsites.net/api/giipIssues" \
-H "x-api-key: ${GIIP_API_KEY}" -H "Content-Type: application/json" \
--data-binary @body.json
- ๋ฑ๋ก ํ,
GET /api/giipIssues?isn=<isn>์ผ๋ก ๋ณธ๋ฌธ ๊ธธ์ด๋ ํด์(์:sha256)๋ฅผ ๋์กฐํด ์ ์ฒด ๋ฌธ์ฅ์ด ์ ์ฅ๋๋์ง ํ์ธํฉ๋๋ค.
์ฝ๋ฉํธ ์ถ๊ฐ(ํ์ ํญ๋ชฉ๊ณผ ์ ์ฅ ํ ํ์ธ)
{ "isn": 1474, "content": "Comment body", "author": "ChatGPT Work", "issuetype": "comment" }
- ํ์:
isn,content. - ๊ธฐ๋ณธ๊ฐ:
author=Agent,issuetype=comment. - ์ ์ฅ author ์ ๊ทํ ์ฃผ์: ์๊ฒฉ์ฆ๋ช
์ข
๋ฅ์ ์๋ฒ ์ธก identity ํด์์ ๋ฐ๋ผ, ๋ณด๋ธ
author๊ฐ ์ ์ฅ ์ ์ฌ์ฉ์ ์ด๋ฆ์ผ๋ก ์ ๊ทํ๋ ์ ์์ต๋๋ค(2026-08-24 ์ค์ธก:author="ChatGPT Work"๋ก ๋ณด๋ธ ์ฝ๋ฉํธ๊ฐauthor="Lowy Shin"์ผ๋ก ์ ์ฅ๋จ). ๋ณด๋ธ author๊ฐ ๊ทธ๋๋ก ์ ์ฅ๋๋ค๊ณ ์ ์ ํ์ง ๋ง๊ณ , ์ถ๊ฐ ํGET /api/giipIssueComments?isn=<isn>์ผ๋ก content์ ์ค์ ์ ์ฅ๋ author๋ฅผ ํ์ธํ์ธ์. - ์ฝ๋ฉํธ ์ ์๋
GET /api/giipIssues?isn=<isn>์ผ๋ก ๋์ CSN์ ํ์ธํ์ธ์.
End-to-End ์์(๋ฑ๋ก โ ํ์ธ โ ๋ถ๋ถ ์ ๋ฐ์ดํธ โ ์ฌํ์ธ โ ์ฝ๋ฉํธ โ ํ์ธ)
# 1. ์ธ์ฆยทCSN scope ํ์ธ(read-only preflight)
curl -sS "https://giipfaw.azurewebsites.net/api/giipIssues?csn=47" -H "x-api-key: ${GIIP_API_KEY}"
# 2. ์ ๊ท ๋ฑ๋ก(๋ฐํ๊ฐ์ isn ์ทจ๋)
curl -sS -X POST "https://giipfaw.azurewebsites.net/api/giipIssues" \
-H "x-api-key: ${GIIP_API_KEY}" -H "Content-Type: application/json" \
-d '{"title":"AI test issue","content":"initial body","csn":47}'
# 3. ์ค์ cSn ํ์ธ(CSN ๋ถ์ผ์น๋ ์กฐ์ฉํ ํ CSN์ผ๋ก clamp๋๋ฏ๋ก ํ์)
curl -sS "https://giipfaw.azurewebsites.net/api/giipIssues?isn=<isn>" -H "x-api-key: ${GIIP_API_KEY}"
# 4. ๋ถ๋ถ ์
๋ฐ์ดํธ(title๋ง. content๋ ISNULL๋ก ๋ณด์กด๋จ)
curl -sS -X PUT "https://giipfaw.azurewebsites.net/api/giipIssues" \
-H "x-api-key: ${GIIP_API_KEY}" -H "Content-Type: application/json" \
-d '{"isn":<isn>,"title":"AI test issue (edited)"}'
# 5. ์ฌGET์ผ๋ก ๋ฏธ์ง์ ํ๋(content)๊ฐ ๋ณด์กด๋๋์ง ํ์ธ
curl -sS "https://giipfaw.azurewebsites.net/api/giipIssues?isn=<isn>" -H "x-api-key: ${GIIP_API_KEY}"
# 6. ์ฝ๋ฉํธ ์ถ๊ฐ
curl -sS -X POST "https://giipfaw.azurewebsites.net/api/giipIssueComments" \
-H "x-api-key: ${GIIP_API_KEY}" -H "Content-Type: application/json" \
-d '{"isn":<isn>,"content":"done","author":"ChatGPT Work","issuetype":"comment"}'
# 7. ์ฝ๋ฉํธ ํ์ธ(์ ์ฅ author์ content๋ฅผ GET์ผ๋ก ๋์กฐ)
curl -sS "https://giipfaw.azurewebsites.net/api/giipIssueComments?isn=<isn>" -H "x-api-key: ${GIIP_API_KEY}"
CSN silent clamp ํ์ง:
POST์์ ์ง์ ํcsn์ด ๊ถํ ๋ฐ์ด๋ฉด ์ค๋ฅ๊ฐ ๋์ง ์๊ณ ํค์ ํ CSN์ผ๋ก ์กฐ์ฉํ ํด๋จํ๋ฉ๋๋ค. ์ ์ฐจ 3์ ์ฌGET์์cSn์ด ์๋๋๋ก์ธ์ง ๋ฐ๋์ ํ์ธํ์ธ์.
2. ๋ฒ์ฉ API ๋ํผ (giipApiSk2)
GIIP์ Stored Procedure๋ฅผ ์ง์ ํธ์ถํ๋ sk ๊ธฐ๋ฐ ๋ฐฉ์์ด๋ฉฐ, ์กฐํ(List/Get)์ ์์ด์ ํธ ์ก์ (Dispatch/ReadinessCheck) ์ ์ฌ์ฉํฉ๋๋ค. ์์ฑยท์ํ๋ณ๊ฒฝยท์ฝ๋ฉํธ ๋ฑ ์ฐ๊ธฐ(write)๋ ์ด ๊ฒฝ๋ก๋ก ํ์ง ๋ง๊ณ ์ ยง1 ์ ์ฉ REST ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ์ธ์(์ด์ ๋ ์๋ ๐ซ ์ฐธ๊ณ ).
- URL:
POST /api/giipApiSk2 - Content-Type:
application/x-www-form-urlencoded - ํ๋:
token:[Your_SK]โ SK๋ ๋ฐ๋์ ์ด ํ๋๋ก๋ง ์ ๋ฌtext:[Command] [ํ๋ผ๋ฏธํฐ...]jsondata: ๊ฐ ๋งคํ์ฉ JSON(์ ํ). ์:{}๋๋{"lssn":101}
โ ๏ธ text ์์ฑ ๊ท์น(์์):
text์๋ ํด๋น SP๊ฐ ๋ฐ๋ ์ ํํ ํ๋ผ๋ฏธํฐ๋ง ์์๋๋ก ๋์ดํฉ๋๋ค. ์ธ์ฆ(@sk)๊ณผ jsondata๋ ์์ง(run.ps1)์ด ์๋ ์ฒ๋ฆฌํ๋ฏ๋ก ์ ๋ ๋์ดํ์ง ๋ง์ธ์. ํ๋ผ๋ฏธํฐ๋ฅผ ๊ณผ๋ค ๋์ดํ๋ฉด SP ์ธ์ ๊ฐ์๋ฅผ ์ด๊ณผํด has too many arguments specified ์ค๋ฅ๊ฐ ๋ฉ๋๋ค.
| ๋ช ๋ น(์์ ) | SP ํ๋ผ๋ฏธํฐ(=text์ ๋์ด) | text ์์ | ์ฑ๊ณต ์๋ต |
|---|---|---|---|
| ๋ชฉ๋ก ์กฐํ | status | GiipIssueList READY | data(์ด์ ๋ฐฐ์ด) |
| ์์ธ ์กฐํ | isn | GiipIssueGet 7890 | data[0](์ด์ 1๊ฑด) |
| ์๊ฒฉ ์คํ | isn | GiipIssueDispatch 7890 | data[0].RstVal = 200 |
๐ซ
GiipIssuePut์ Sk2๋ก ์ํ๋ณ๊ฒฝ์ ์ฐ์ง ๋ง์ธ์ (๋ฐ์ดํฐ ํ๊ดด ์ํ). Sk2GiipIssuePut์ ๋ด๋ถ SPpApiGiipIssuePutbySK(@sk, @isn, @title, @content, @status, @csn)์ ๋งคํ๋๋ ์ ์ฒด ๋ฎ์ด์ฐ๊ธฐ(full overwrite) ์ ๋๋ค(coalesce ์์).GiipIssuePut 7890 DONE๋ก ๋ถ๋ฅด๋ฉด ๋ ๋ฒ์งธ ๊ฐDONE์ด @title๋ก, ์ธ ๋ฒ์งธ(jsondata)๊ฐ @content๋ก ๋ค์ด๊ฐ ์ ๋ชฉยท๋ณธ๋ฌธ์ด ํ๊ดด๋ฉ๋๋ค. ์๋ต์RstVal:200(๊ฐ์ง ์ฑ๊ณต)์ผ๋ก ๋์ค์ง๋ง ์ค์ ๋ก๋ ์ค์๋ ๊ฒ์ ๋๋ค(์ค์ธก: 2026-07-09, task 20260708183049). ์ํ๋ง ์์ ํ๊ฒ ๋ฐ๊พธ๋ ค๋ฉด ์ ์ฉ RESTPUT /api/giipIssues {isn, status}๋ฅผ ์ฐ์ธ์. ๋ด๋ถpApiGiipIssuePutbyAK๊ฐISNULL(@title, title)๋ก ๊ธฐ์กด ์ ๋ชฉยท๋ณธ๋ฌธ์ ๋ณด์กดํฉ๋๋ค(=giipv3 ํ๋ก ํธ๊ฐ ์ค์ ์ฐ๋ ๊ฒฝ๋ก).
๐ ์๋ต ๋ฐ์ดํฐ ์์
giipApiSk2 (SP ๋ํผ) ์๋ต โ ์กฐํ๋ data ๋ฐฐ์ด์ ๋ ์ฝ๋, SP ์ก์
(Dispatch ๋ฑ)์ ์ฑ๊ณต ์ RstVal = 200:
{ "data": [ { "RstVal": 200, "Proc_MSG": "Dispatched", "isn": 7890 } ] }
์กฐํ ๋ช
๋ น(GiipIssueList/GiipIssueGet)์ data ๋ฐฐ์ด์ ์ด์ ๋ ์ฝ๋๊ฐ ๋ด๊น๋๋ค.
์ ์ฉ REST ์๋ํฌ์ธํธ ์๋ต โ ์ฑ๊ณต ์ success: true (์๋ต ๋ณธ๋ฌธ์ RstVal ์์):
{ "isn": 7890, "message": "Issue updated", "success": true }
โน๏ธ ์ฑ๊ณต ํ์ ์ฃผ์: SP ์ฑ๊ณต ์ฝ๋๋
RstVal = 200์ด๋ฉฐ0์ด ์๋๋๋ค. ์คํจ ์ 400/401/403/404๋ฅผ ๋ฐํํฉ๋๋ค(K-Layer CLAIM-006). ์ ์ฉ ์๋ํฌ์ธํธ๋RstVal๋์success๋ถ๋ฆฌ์ธ์ ๋ฐํํฉ๋๋ค.
๐ก ํ์ฉ ์ฌ๋ก
- ์ฌ๋ ์๋ฆผ ๋ด: API๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํธ์ถํ์ฌ ์ ๊ท
Critical์ด์ ๋ฐ์ ์ ์ฆ์ ๊ฐ๋ฐํ ์ฑ๋์ ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค. - ์๋ ๋ณต๊ตฌ ์คํฌ๋ฆฝํธ: ํน์ ์ ํ์ ์ด์(์: ํ๋ก์ธ์ค ๋ค์ด) ํ์ง ์ API๋ก ์ด์๋ฅผ ํ์ธํ๊ณ , ์๊ฒฉ ๋ช
๋ น API(
api-system)๋ฅผ ํธ์ถํ์ฌ ํด๋น ์๋น์ค๋ฅผ ์ฌ์์ํฉ๋๋ค.
๐ก๏ธ Sk3(๊ณ ์ฑ๋ฅ ๋ก๊น ) ํ์ฉ
์ฅ์ ๋์ ์์คํ
์ด๋ ์ธ๋ถ ํฐ์ผํ
๋๊ตฌ์์ ์ฐ๋ ์, ์
๋ฐ์ดํธ ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ๊ณผ ์์ธํ ํธ์ถ ์ด๋ ฅ ์ถ์ ์ ์ํด giipApiSk3 ์๋ํฌ์ธํธ๋ฅผ ๊ถ์ฅํฉ๋๋ค.
- ์๋ํฌ์ธํธ:
https://giipfaw.azurewebsites.net/api/giipApiSk3 - ์ฅ์ : ์ด์ ์ํ ์
๋ฐ์ดํธ(Done ์ฒ๋ฆฌ ๋ฑ) ์คํจ ์ ํธ์ถ์์ ์์ธ ํ๊ฒฝ ์ ๋ณด(IP, UA)์ StackTrace๋ฅผ ์ฆ์
tErrorLogs์ ๊ธฐ๋กํ์ฌ ์ฅ์ ๋์ ํ๋ก์ธ์ค์ ์ ๋ขฐ์ฑ์ ๋์ฌ์ค๋๋ค. - ํ์ฉ ํ:
jsondata์นํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์ด์ ๋ด์ ํน์ ๋ณ์๊ฐ์ด๋ ๊ธด ์๋ฌ ๋ฉ์์ง๋ฅผ ํ๋ผ๋ฏธํฐ ์ ์ค ์์ด ์์ ํ๊ฒ ์ ์กํ ์ ์์ต๋๋ค.
401 "Invalid session" ์์ธ ๋ถ๋ฅ
401์๋ ์๋ก ๋ค๋ฅธ ์๋ฏธ์ ๋ฉ์์ง 2๊ฐ์ง๊ฐ ์์ต๋๋ค(์ค์ธก ํ์ธ, 2026-08-20).
| ์๋ต | ์์ธ |
|---|---|
{"error":"Auth required"} | ํค๊ฐ ์๋ฒ๊น์ง ๋๋ฌํ์ง ๋ชปํจ โ x-api-key/Authorization ํค๋๊ฐ ์๊ฑฐ๋, ์ง์๋์ง ์๋ ์ ๋ฌ ๋ฐฉ์(JSON ๋ฐ๋ token, ์ฟผ๋ฆฌ ?token=, ์๋ชป๋ ํค๋ ์ด๋ฆ ๋ฑ)์ ์ฌ์ฉํจ |
{"error":"Invalid session"} | ํค๋ ๋๋ฌํ์ง๋ง ๋ฌดํจ โ ์๋ ์์ธ ์ค ํ๋ |
Invalid session์ด ๋๋ ๊ตฌ์ฒด์ ์์ธ:
- ํค ๊ฐ์ ์คํ๊ฐ ์๊ฑฐ๋ ์กด์ฌํ์ง ์์(์ด๋ค AK/SK ํ ์ด๋ธ์๋ ๋งค์นญ๋์ง ์์)
- ์ ํจํ๋ ํ๋ก์ ํธ SK๊ฐ ์ฌ๋ฐ๊ธ/ํ์ ์ผ๋ก ๋นํ์ฑํ๋จ(
SKStatus=0) โ giip #1265์์ ์ค์ธก - ๋ก๊ทธ์ธ ์ธ์
AK๊ฐ 24์๊ฐ ์ ํจ๊ธฐ๊ฐ์ ์ด๊ณผํจ(
tUserLogin.AccToken, ์ฝ๋ ํ์ธ๋งยท๋ฏธ์ค์ธก)
ํด๋นํ์ง ์๋ ๊ฒฝ์ฐ(์คํดํ๊ธฐ ์ฌ์ด ์ง์ ):
- AK ์ ์ฉ ์๋ํฌ์ธํธ์ SK๋ฅผ ์ด ๊ฒฝ์ฐ/๊ทธ ๋ฐ๋ โ ํด๋น ์์.
giipIssues/giipIssueComments๋ AKยทSK ์ด๋ ์ชฝ์ผ๋ก๋ ๋์ํ๋๋ก ๊ตฌํ๋ผ ์์ผ๋ฉฐ, ์ข ๋ฅ๋ณ ์ ์ฉ ์๋ํฌ์ธํธ ๊ตฌ๋ถ์ด ์์ต๋๋ค(์ค์ธก+์ฝ๋ ํ์ธ). - ๋์ csn์ ๊ถํ์ด ์๋ ๊ฒฝ์ฐ โ
401์ด ์๋๋ผ ์ "csn ๊ถํ ๋ถ์ผ์น ์ ๋์"๋๋ก200(๋น ๋ฐฐ์ด)/200(์กฐ์ฉํ ํด๋จํ)/404๊ฐ ๋ฉ๋๋ค.
๋ฌธ์ ํด๊ฒฐ
| ์ฆ์ | ์์ธ | ํด๊ฒฐ |
|---|---|---|
{"error":"Auth required"} (401) | ํค๋์ ํค๊ฐ ์๊ฑฐ๋, ๋ฐ๋/์ฟผ๋ฆฌ ๋ฑ ๋ฏธ์ง์ ๋ฐฉ์์ผ๋ก ์ ๋ฌํจ | x-api-key: <key> ํค๋(๋๋ Authorization: Bearer <key>)๋ก ์ ๋ฌ. ๋ฐ๋ tokenยท์ฟผ๋ฆฌ ?token=์ ์ฌ์ฉ ๋ถ๊ฐ |
{"error":"Invalid session"} (401) | ํค ์คํ, ๋นํ์ฑํ(์ฌ๋ฐ๊ธ/ํ์ ), ์ธ์ ๋ง๋ฃ ์ค ํ๋ | ์ "์ธ์ฆ ํ์ธ ์ ์ฐจ"์ GET์ผ๋ก ํค๋ฅผ ์ฌ๊ฒ์ฆ. /svclist์์ ๋์ csn์ ํ์ฌ ์ ํจํ SK ํ์ธ |
ํ๋ก์ ํธ ์ด์๊ฐ [](๋น ๋ฐฐ์ด)๋ก ๋ฐํ๋จ | ํค๋ ์ ํจํ์ง๋ง ๋์ csn์ ๊ถํ์ด ์์(401์ด ๋์ง ์์) | ๋์ csn์ฉ ํค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ด๋ฆฌ์์๊ฒ ๊ถํ ๋ถ์ฌ๋ฅผ ์์ฒญ |
POST์์ csn์ ์ง์ ํ๋๋ฐ ๋ค๋ฅธ csn์ ์์ฑ๋จ | ๊ถํ ์๋ csn์ ์ง์ ํ๋ฉด ํค์ ํ csn์ผ๋ก ์กฐ์ฉํ ํด๋จํ๋จ(์ค์ธก: ์ ์ฐธ์กฐ) | ์์ฑ ํ GET /api/giipIssues?isn=<isn>์ผ๋ก ์ค์ cSn์ ํ์ธ. ๋ค๋ฅธ csn ์์ฑ์ด ํ์ํ๋ฉด ๊ด๋ฆฌ์์๊ฒ tUserPerCorp ๊ถํ ๋ถ์ฌ ์์ฒญ |
| ๋ช ๋ น์ด ์คํ๋์ง ์๊ฑฐ๋ ๋น ๊ฒฐ๊ณผ ๋ฐํ(Sk2) | text ํ๋ผ๋ฏธํฐ ํ์ ์ค๋ฅ(๋ช
๋ นยทํ๋ผ๋ฏธํฐ ๊ตฌ๋ถ ๋๋ฝ) | GiipIssueList READY์ฒ๋ผ [๋ช
๋ น] [ํ๋ผ๋ฏธํฐ] ํ์ ์ค์ |
... has too many arguments specified ์ค๋ฅ(Sk2) | text์ SP ํ๋ผ๋ฏธํฐ๋ฅผ ๊ณผ๋ค ๋์ด | SP์ ์ ํํ ํ๋ผ๋ฏธํฐ๋ง ๋์ด. @skยทjsondata๋ ์์ง์ด ์๋ ์ถ๊ฐํ๋ฏ๋ก ๋์ด ๊ธ์ง |
์ํ๋ณ๊ฒฝ ํ๋๋ ์ ๋ชฉยท๋ณธ๋ฌธ์ด DONE/{} ๋ฑ์ผ๋ก ํ๊ดด๋จ(Sk2) | Sk2 GiipIssuePut(์ ์ฒด ๋ฎ์ด์ฐ๊ธฐ SP)๋ก ์ํ๋ณ๊ฒฝ ์๋ | ์ํ๋ณ๊ฒฝ์ ์ ์ฉ REST PUT /api/giipIssues {isn,status} ์ฌ์ฉ(ยง1). Sk2 GiipIssuePut์ write์ ์ฐ์ง ๋ง ๊ฒ |
์๋ต data[0].RstVal์ด 200์ด ์๋(Sk2) | Stored Procedure ์คํ ์ค๋ฅ ๋๋ ์๋ชป๋ isn | Proc_MSG ํ์ธ ํ API ๊ฒฐ๊ณผ ์ฝ๋ ๊ฐ์ด๋ ์ฐธ์กฐ (์ฑ๊ณต์ 0์ด ์๋๋ผ 200) |
| ๊ธด ์๋ฌ ๋ฉ์์งยทํน์๋ฌธ์ ์ ์ก ์ ๊ฐ ์ ์ค | JSON ๊ฐ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ ๋๋ฝ | giipApiSk3์ jsondata ์นํ ๊ธฐ๋ฅ์ผ๋ก ์์ ํ๊ฒ ์ ์ก |
๋ฒ์ : 1.7
์ต์ข
์
๋ฐ์ดํธ: 2026-08-27(ํ
์คํธ ๋์ API: giipfaw ํ๋ก๋์
, pApiGiipIssue*byAK SP๊ตฐ โ ์์ ๋ช
์ํ ๊ฐ ์ค์ธก์ ์ด ๋ ์ง์ ๋ผ์ด๋ธ API๋ก ์ํ)
์์ค ํ์ผ: giipv3/public/help/giip-issue-api.ko.md
v1.7 ๋ณ๊ฒฝ ์ด๋ ฅ (2026-08-27, giip #1484): ์ด์ ์ฒ๋ฆฌ ์ํฌํ๋ก์ฐ(
/gissue-final-review) ์๋ฃ๋ฅผ ์ํด ๋ค์ ํญ๋ชฉ์ ์ถ๊ฐ. โ ์ง์ ์ํ๊ฐ ํ(TESTED/WARN ํฌํจ, 7๊ฐ์ง ์ํ). โก ๋ค์ค ์ํ ์กฐํ โ ์ด์ API๋ ๋จ์ผ ์์ ์ผ์น ํํฐ๋ง ์ง์ (TESTED,REVIEW/TESTED|REVIEW๋ฑ ํ์์ ๋์ํ์ง ์์)ํ์ฌ ๊ฐ๊ฐ ์กฐํ ํ ํด๋ผ์ด์ธํธ์์ ๊ฒฐํฉํ๋ ํจํด. โข ์ฝ๋ฉํธ ์ ๋ ์กฐํ ์๊ฐ์ ์ค๋ช ๊ณผ FINAL-REVIEW ์ํฌํ๋ก์ฐ์์ ์์ ์ ์๋ฃ ๋ณด๊ณ ๋ฅผ "์ฃผ์ฅ"์ผ๋ก, repo/PR/ํ๋ฉด/DB๋ฅผ ์ง์ ๋์กฐํ ๋ ๋ฆฝ ์ฆ๊ฑฐ๋ง ํฉ๊ฒฉ์ผ๋ก ์ธ์ ํ๋ ๊ฒ์ฆ ์์น.
v1.6 ๋ณ๊ฒฝ ์ด๋ ฅ (2026-08-24, giip #1475): AI ์์ด์ ํธ์ฉ ์ ์ฒด ์ ์ฐจ ์น์ ์ถ๊ฐ(๋ถ๋ถ ์ ๋ฐ์ดํธ๏ผ๊ธด content๏ผ ์ฝ๋ฉํธ author ์ ๊ทํ๏ผ๋ฑ๋กโํ์ธโ๋ถ๋ถ ์ ๋ฐ์ดํธโ์ฝ๋ฉํธ End-to-End ์์).
x-api-key๊ฐ ํค๋ ์ด๋ฆ์ด์ง ๋ณ๋์ ์๊ฒฉ์ฆ๋ช ์ข ๋ฅ๊ฐ ์๋์ ๋ช ์.GET /api/giipIssueComments๊ฐ HTTP 200์ ๋ฐํํ๋ค๋ ์ "์๋ ค์ง ๋ฒ๊ทธ" ๊ธฐ๋ก์, ์์ ๋จ(giip #1285, 2026-08-24 ๋ผ์ด๋ธ ์ค์ธก์ผ๋ก HTTP 401 ํ์ธ)์ผ๋ก ์ญ์ .v1.5 ๋ณ๊ฒฝ ์ด๋ ฅ (2026-08-20, giip #1280): ์ธ์ฆ ๊ด๋ จ ๋ด์ฉ์ ๋ํญ ๋ณด๊ฐ. โ JSON ๋ฐ๋
tokenยท์ฟผ๋ฆฌ?token=์ดgiipIssues/giipIssueComments์์ ์ค์ ๋ก๋ ๋์ํ์ง ์์์ ์ฝ๋ ํ์ธ+๋ผ์ด๋ธ ์ค์ธก(4๊ฐ ์๋ํฌ์ธํธ)์ผ๋ก ํ์ ํ๊ณ ์๋ชป๋ ์์ (x-giip-skํค๋ยท?token=์ง์ ์ธ๊ธ ํฌํจ)์ ์ญ์ (์ฟผ๋ฆฌ ๋ฌธ์์ด ๋ฐฉ์์ ๋ณด์์์ผ๋ก๋ ์ง์ ์ค๋จ ๋ช ์). โก SK/์ฌ์ฉ์ ๊ณ ์ ํค/๋ก๊ทธ์ธ ์ธ์ AK 3์ข ๋ฅ๋ฅผ ๋ฐ๊ธ ํ ์ด๋ธ ๊ธฐ์ค์ผ๋ก ์ ๋ฆฌ (tSecretKey/tCorpUser.uSecretKey/tUserLogin.AccToken). โข ์ฐ๊ธฐ ์ ํค๋ฅผ ์์ ํ๊ฒ ๊ฒ์ฆํ๋ ์ ์ฐจ ์ถ๊ฐ. โฃ401์ ์์ธ์ "Auth required(ํค ๋ฏธ๋๋ฌ)"์ "Invalid session(ํค ๋ฌดํจ)"๋ก ๋ถ๋ฅํ๊ณ , csn ๊ถํ ๋ถ์ผ์น๋ 401์ด ๋์ง ์์(๋น ๋ฐฐ์ด/404/์กฐ์ฉํ ํด๋จํ)์ ์ค์ธก์ผ๋ก ๋ช ์. โคGET /api/giipIssueComments๊ฐ ๋ฌดํจํ ํค์๋ HTTP 200์ ๋ฐํํ๋ ์๋ ค์ง ๋ฒ๊ทธ๋ฅผ ๋ฐ๊ฒฌยท๊ธฐ๋ก(ํ์ ์ด์ ๋ฑ๋ก). โฅ ์์ฑ ์์ ๋ฅผ ํ๋์ฝ๋ฉ๋ ํค์์ ํ๊ฒฝ๋ณ์(${GIIP_API_KEY})๋ก ๋ณ๊ฒฝ.
v1.4 ๋ณ๊ฒฝ ์ด๋ ฅ (2026-08-20, giip #1265): SK๋ก
POST /api/giipIssuesํธ์ถ ์401 Invalid session์ ๋ฐ๋๋ค๋ ์ ๋ณด๋ฅผ ์ค์ธก ๊ฒ์ฆ. ๋ผ์ด๋ธ Azure SQL์ ๋ฐฐํฌ๋pApiGiipIssuePutbyAK์ ์๋ ๋ ํฌ ์์ค์ ์์ ํ ๋์ผํ๋ฉฐ SK ํด๋ฐฑ ์ธ์ฆ(lwGetUSNbyat์คํจ ์lwGetUSNbysk)์ด ์ด๋ฏธ ์ ์ ๋ฐฐํฌ๋ผ ์์์ ํ์ธ(๋ฐฐํฌ ๊ฐญ ์๋). ์ค์ ๋ก ํ์ฑ SK๋ก ํธ์ถํ๋ฉด200 Issue created, ๋นํ์ฑํ(์ฌ๋ฐ๊ธ/ํ์ )๋ ์ SK๋ก ํธ์ถํ๋ฉด401 Invalid session์ด ์ฌํ๋จ(2026-08-20 ์ค์ธก: giipfaw ๋ผ์ด๋ธ API์ ๋ ์ผ์ด์ค ๋ชจ๋ ์ง์ ํธ์ถํด ํ์ธ). ์ฆ ์ฝ๋ ๊ฒฐํจ์ด ์๋๋ผ ๋ฌธ์๊ฐ "์ด๋ค SK๊ฐ ์ ํจํ์ง"๋ฅผ ์ค๋ช ํ์ง ์์ ๊ฒ์ด ์์ธ โ ยง์ธ์ฆ ๋ฐ ๋ฌธ์ ํด๊ฒฐ ํ์ SK ํ์ฑ ์ํ ์๊ฑด๊ณผ ์ฌํ์ธ ๊ฒฝ๋ก(/svclist)๋ฅผ ์ถ๊ฐ.v1.3 ๋ณ๊ฒฝ ์ด๋ ฅ (2026-07-09, task 20260708183049): ์ค์ ํ๋ก๋์ API(giipv3 ํ๋ก ํธยทgiipApiSk2ยทSP ์์ค)์ ๋์กฐํ์ฌ ์ ํฉํ. โ Sk2 ์ฐ๊ธฐ ๊ฒฝ๋ก ์ํ ๊ฒฝ๊ณ ์ถ๊ฐ: Sk2
GiipIssuePut์ ๋ด๋ถpApiGiipIssuePutbySK(@sk,@isn,@title,@content,@status,@csn)์ ์ฒด ๋ฎ์ด์ฐ๊ธฐ SP๋ผGiipIssuePut 7890 DONE์ด ์ ๋ชฉยท๋ณธ๋ฌธ์ ํ๊ดดํจ(์๋ต์ ๊ฐ์งRstVal:200). ์ค์ธก ํ์ธ(577ยท578 ์ค์ ํ ๋ณต๊ตฌ). ์์ฑยท์ํ๋ณ๊ฒฝยท์ฝ๋ฉํธ๋ ์ ์ฉ REST ์๋ํฌ์ธํธ๋ก, Sk2๋ ์กฐํยท์ก์ ์ ์ฉ์ผ๋ก ์๋ด. (๊ณผ๊ฑฐ ๋ณด๊ณ ์์ "too many arguments ๋นํธํ" ์ง๋จ์ ๋ถ๋ถ์ ๊ด์ฐฐ์ด์๊ณ , ์ค์ ๋ก๋ SP๊ฐ full-overwrite์ฌ์ ์ํํ ๊ฒ.) โก ์ฑ๊ณต ์ฝ๋๋RstVal = 200(0 ์๋) โ ์๋ต ์์ยท๋ฌธ์ ํด๊ฒฐ ํ ์ ์ . โข ์ด์ ์ ๊ท ๋ฑ๋ก ์ ์ฐจ(POST /api/giipIssues,isn์๋ต ์ ์ ๊ท) ๋ฐ ์์ ํ ์ํ๋ณ๊ฒฝ(PUT /api/giipIssues {isn,status},ISNULL๋ณด์กด) ์ถ๊ฐ.
๊ด๋ จ ๋ฌธ์: