giip
SES Proposal
13 min read

์ด์Šˆ ๊ด€๋ฆฌ 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 ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ํ™”๋ฉด)๋™์ผ
๋กœ๊ทธ์ธ ์„ธ์…˜ AKtUserLogin.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 }
  • ์ฝ”๋ฉ˜ํŠธ ๋“ฑ๋ก: POST /api/giipIssueComments
    • Body: { "isn":7890, "content":"์ฒ˜๋ฆฌ ์™„๋ฃŒ", "author":"api-tester", "issuetype":"comment" } โ†’ { "success":true }
    • ์ฝ”๋ฉ˜ํŠธ ์กฐํšŒ: GET /api/giipIssueComments?isn=7890 โ†’ { "comments":[...] }

์ „๋‹ฌ ๋ฐฉ์‹ ์š”์•ฝ (์‹ค์ธก, 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 ์ฐธ์กฐ). ์ „์šฉ REST PUT์„ ์“ฐ์„ธ์š”.

๊ธด 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 ์˜ˆ์‹œ์„ฑ๊ณต ์‘๋‹ต
๋ชฉ๋ก ์กฐํšŒstatusGiipIssueList READYdata(์ด์Šˆ ๋ฐฐ์—ด)
์ƒ์„ธ ์กฐํšŒisnGiipIssueGet 7890data[0](์ด์Šˆ 1๊ฑด)
์›๊ฒฉ ์‹คํ–‰isnGiipIssueDispatch 7890data[0].RstVal = 200

๐Ÿšซ GiipIssuePut์„ Sk2๋กœ ์ƒํƒœ๋ณ€๊ฒฝ์— ์“ฐ์ง€ ๋งˆ์„ธ์š” (๋ฐ์ดํ„ฐ ํŒŒ๊ดด ์œ„ํ—˜). Sk2 GiipIssuePut์€ ๋‚ด๋ถ€ SP pApiGiipIssuePutbySK(@sk, @isn, @title, @content, @status, @csn)์— ๋งคํ•‘๋˜๋Š” ์ „์ฒด ๋ฎ์–ด์“ฐ๊ธฐ(full overwrite) ์ž…๋‹ˆ๋‹ค(coalesce ์—†์Œ). GiipIssuePut 7890 DONE๋กœ ๋ถ€๋ฅด๋ฉด ๋‘ ๋ฒˆ์งธ ๊ฐ’ DONE์ด @title๋กœ, ์„ธ ๋ฒˆ์งธ(jsondata)๊ฐ€ @content๋กœ ๋“ค์–ด๊ฐ€ ์ œ๋ชฉยท๋ณธ๋ฌธ์ด ํŒŒ๊ดด๋ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์€ RstVal:200(๊ฐ€์งœ ์„ฑ๊ณต)์œผ๋กœ ๋‚˜์˜ค์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์˜ค์†๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(์‹ค์ธก: 2026-07-09, task 20260708183049). ์ƒํƒœ๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ”๊พธ๋ ค๋ฉด ์ „์šฉ REST PUT /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์ด ๋˜๋Š” ๊ตฌ์ฒด์  ์›์ธ:

  1. ํ‚ค ๊ฐ’์— ์˜คํƒ€๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์กด์žฌํ•˜์ง€ ์•Š์Œ(์–ด๋–ค AK/SK ํ…Œ์ด๋ธ”์—๋„ ๋งค์นญ๋˜์ง€ ์•Š์Œ)
  2. ์œ ํšจํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ SK๊ฐ€ ์žฌ๋ฐœ๊ธ‰/ํšŒ์ „์œผ๋กœ ๋น„ํ™œ์„ฑํ™”๋จ(SKStatus=0) โ€” giip #1265์—์„œ ์‹ค์ธก
  3. ๋กœ๊ทธ์ธ ์„ธ์…˜ 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 ์‹คํ–‰ ์˜ค๋ฅ˜ ๋˜๋Š” ์ž˜๋ชป๋œ isnProc_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 ๋ณด์กด) ์ถ”๊ฐ€.


๊ด€๋ จ ๋ฌธ์„œ: