2025๋…„ 8์›” 22์ผยท5๋ถ„ ์ฝ๊ธฐ

์›นํ›… ํ†ตํ•ฉ ๋””๋ฒ„๊น…: ์„œ๋ช…, ์žฌ์‹œ๋„, ์žฌ์ƒ, ์ด๋ฒคํŠธ ๋กœ๊ทธ

์„œ๋ช…์„ ํ‘œ์ค€ํ™”ํ•˜๊ณ  ์žฌ์‹œ๋„๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์žฌ์ƒ ๊ธฐ๋Šฅ๊ณผ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‰ฌ์šด ์ด๋ฒคํŠธ ๋กœ๊ทธ๋ฅผ ๊ฐ–์ถฐ ์›นํ›… ํ†ตํ•ฉ์„ ํšจ์œจ์ ์œผ๋กœ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์„ธ์š”.

์›นํ›… ํ†ตํ•ฉ ๋””๋ฒ„๊น…: ์„œ๋ช…, ์žฌ์‹œ๋„, ์žฌ์ƒ, ์ด๋ฒคํŠธ ๋กœ๊ทธ

์™œ ์›นํ›… ํ†ตํ•ฉ์ด ๋ธ”๋ž™๋ฐ•์Šค๊ฐ€ ๋˜๋Š”๊ฐ€

์›นํ›…์€ ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฌด์–ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋‹น์‹ ์˜ ์•ฑ์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ฒฐ์ œ ์ œ๊ณต์ž๊ฐ€ "๊ฒฐ์ œ ์„ฑ๊ณต"์„ ์•Œ๋ฆฌ๊ฑฐ๋‚˜, ํผ ๋„๊ตฌ๊ฐ€ "์ƒˆ ์ œ์ถœ"์„ ๋ณด๋‚ด๊ฑฐ๋‚˜, CRM์ด "๊ฑฐ๋ž˜ ์—…๋ฐ์ดํŠธ"๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํ•ด ๋ณด์ด์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์—ด์–ด๋ณผ ํ™”๋ฉด๋„, ๋ช…ํ™•ํ•œ ์ด๋ ฅ๋„, ์•ˆ์ „ํ•˜๊ฒŒ ์žฌ์ „์†กํ•  ๋ฐฉ๋ฒ•๋„ ์—†๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ซ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์›นํ›… ๋ฌธ์ œ๋Š” ํŠนํžˆ ๋‹ต๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์š”์ฒญ์ด ๋„์ฐฉํ•˜๊ฑฐ๋‚˜(๋˜๋Š” ๋„์ฐฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜), ์‹œ์Šคํ…œ์ด ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜(๋˜๋Š” ์‹คํŒจํ•˜๊ฑฐ๋‚˜). ์ฒซ ์‹ ํ˜ธ๋Š” ์ข…์ข… "๊ณ ๊ฐ์ด ๊ฒฐ์ œํ•  ์ˆ˜ ์—†๋‹ค"๊ฑฐ๋‚˜ "์ƒํƒœ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์•˜๋‹ค"๋Š” ๋ชจํ˜ธํ•œ ํ‹ฐ์ผ“์ž…๋‹ˆ๋‹ค. ๊ณต๊ธ‰์ž๊ฐ€ ์žฌ์‹œ๋„ํ•˜๋ฉด ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ํŽ˜์ด๋กœ๋“œ ํ•„๋“œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์ผ๋ถ€ ๊ณ„์ •์—์„œ๋งŒ ํŒŒ์„œ๊ฐ€ ๊นจ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”ํ•œ ์ฆ์ƒ:

  • ์ „์†ก๋˜์ง€ ์•Š์•˜๋Š”์ง€ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋Š” "์‚ฌ๋ผ์ง„" ์ด๋ฒคํŠธ
  • ์ค‘๋ณต ์ „๋‹ฌ๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ(์ฒญ๊ตฌ์„œ ๋‘ ๊ฑด, ์ด๋ฉ”์ผ ๋‘ ํ†ต, ์ƒํƒœ ๋ณ€๊ฒฝ ๋‘ ๋ฒˆ)
  • ์ผ๋ถ€์—์„œ๋งŒ ์‹คํŒจํ•˜๋Š” ํŽ˜์ด๋กœ๋“œ ๋ณ€๊ฒฝ(์ƒˆ ํ•„๋“œ, ๋ˆ„๋ฝ ํ•„๋“œ, ์ž˜๋ชป๋œ ํƒ€์ž…)
  • ํ•œ ํ™˜๊ฒฝ์—์„œ๋Š” ํ†ต๊ณผํ•˜๊ณ  ๋‹ค๋ฅธ ํ™˜๊ฒฝ์—์„œ๋Š” ์‹คํŒจํ•˜๋Š” ์„œ๋ช… ๊ฒ€์‚ฌ

๋””๋ฒ„๊ทธ ๊ฐ€๋Šฅํ•œ ์›นํ›… ๊ตฌ์„ฑ์€ ์ถ”์ธก์˜ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์ถ”์  ๊ฐ€๋Šฅํ•˜๊ณ (๋ชจ๋“  ์ „๋‹ฌ๊ณผ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ), ์žฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉฐ(๊ณผ๊ฑฐ ์ด๋ฒคํŠธ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์žฌ์ƒํ•  ์ˆ˜ ์žˆ์Œ), ๊ฒ€์ฆ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ง„์œ„์™€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ์Œ). ๋ˆ„๊ตฐ๊ฐ€ "์ด ์ด๋ฒคํŠธ์— ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋‚˜?"๋ผ๊ณ  ๋ฌผ์œผ๋ฉด ๋ช‡ ๋ถ„ ์•ˆ์— ์ฆ๊ฑฐ๋กœ ๋‹ตํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

AppMaster ๊ฐ™์€ ํ”Œ๋žซํผ ์œ„์— ์•ฑ์„ ๋งŒ๋“ค๋ฉด ์ด ์‚ฌ๊ณ ๋ฐฉ์‹์€ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ์  ๋กœ์ง์€ ๋นจ๋ฆฌ ๋ฐ”๋€Œ์ง€๋งŒ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์ด ๋ธ”๋ž™๋ฐ•์Šค๊ฐ€ ๋˜์ง€ ์•Š๋„๋ก ๋ช…ํ™•ํ•œ ์ด๋ฒคํŠธ ์ด๋ ฅ๊ณผ ์•ˆ์ „ํ•œ ์žฌ์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์›นํ›…์„ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ์ตœ์†Œ ๋ฐ์ดํ„ฐ

์••๋ฐ• ์†์—์„œ ๋””๋ฒ„๊น…ํ•  ๋•Œ ๋งค๋ฒˆ ๊ฐ™์€ ๊ธฐ๋ณธ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค: ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์žฌ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ก. ๊ทธ๊ฒŒ ์—†๋‹ค๋ฉด ๋ชจ๋“  ์›นํ›…์€ ๊ฐœ๋ณ„ ๋ฏธ์Šคํ„ฐ๋ฆฌ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์—์„œ ํ•˜๋‚˜์˜ ์›นํ›… "์ด๋ฒคํŠธ"๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜์„ธ์š”. ์˜์ˆ˜์ฆ์ฒ˜๋Ÿผ ๋‹ค๋ฃจ์„ธ์š”: ๋“ค์–ด์˜จ ํ•˜๋‚˜์˜ ์š”์ฒญ์€ ์ฒ˜๋ฆฌ ์‹œ์ ๊ณผ ๊ด€๊ณ„์—†์ด ํ•˜๋‚˜์˜ ์ €์žฅ๋œ ์ด๋ฒคํŠธ์ž…๋‹ˆ๋‹ค.

์ตœ์†Œํ•œ ๋‹ค์Œ์„ ์ €์žฅํ•˜์„ธ์š”:

  • Event ID: ๊ณต๊ธ‰์ž์˜ ID๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฑธ ์‚ฌ์šฉํ•˜๊ณ , ์—†์œผ๋ฉด ์ƒ์„ฑํ•˜์„ธ์š”.
  • ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์‹  ๋ฐ์ดํ„ฐ: ์–ธ์ œ ๋ฐ›์•˜๋Š”์ง€์™€ ๋ˆ„๊ฐ€ ๋ณด๋ƒˆ๋Š”์ง€(๊ณต๊ธ‰์ž ์ด๋ฆ„, ์—”๋“œํฌ์ธํŠธ, ํ•„์š”ํ•˜๋ฉด IP). received_at์„ ํŽ˜์ด๋กœ๋“œ ๋‚ด๋ถ€์˜ ํƒ€์ž„์Šคํƒฌํ”„์™€ ๋ถ„๋ฆฌํ•ด์„œ ๋ณด๊ด€ํ•˜์„ธ์š”.
  • ์ฒ˜๋ฆฌ ์ƒํƒœ์™€ ์ด์œ : ์ž‘์€ ์ƒํƒœ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์„ธ์š”(received, verified, handled, failed) ะธ ๊ฐ„๋‹จํ•œ ์‹คํŒจ ์ด์œ ๋ฅผ ์ €์žฅํ•˜์„ธ์š”.
  • ์›๋ณธ ์š”์ฒญ๊ณผ ํŒŒ์‹ฑ๋œ ๋ทฐ: ๊ฐ์‚ฌ์™€ ์„œ๋ช… ๊ฒ€์ฆ์„ ์œ„ํ•ด ์ˆ˜์‹ ๋œ ์›๋ณธ ๋ฐ”๋””์™€ ํ—ค๋”๋ฅผ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•˜๊ณ , ๊ฒ€์ƒ‰๊ณผ ์ง€์›์„ ์œ„ํ•œ ํŒŒ์‹ฑ๋œ JSON ๋ทฐ๋„ ํ•จ๊ป˜ ์ €์žฅํ•˜์„ธ์š”.
  • ์ƒ๊ด€ ํ‚ค: ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜๋‚˜ ๋‘ ๊ฐœ์˜ ํ•„๋“œ(order_id, invoice_id, user_id, ticket_id).

์˜ˆ: ๊ฒฐ์ œ ์ œ๊ณต์ž๊ฐ€ "payment_succeeded"๋ฅผ ๋ณด๋ƒˆ๋Š”๋ฐ ๊ณ ๊ฐ์—๊ฒŒ๋Š” ์—ฌ์ „ํžˆ ๋ฏธ๊ฒฐ์ œ๋กœ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋กœ๊ทธ์— ์›๋ณธ ์š”์ฒญ์ด ์žˆ์œผ๋ฉด ์„œ๋ช…์„ ํ™•์ธํ•˜๊ณ  ์ •ํ™•ํ•œ ๊ธˆ์•ก๊ณผ ํ†ตํ™”๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. invoice_id๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ง€์›ํŒ€์€ ๊ทธ ์ธ๋ณด์ด์Šค๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ฐพ์•„ ์ด๋ฒคํŠธ๊ฐ€ "failed"์— ๋ฉˆ์ถฐ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—”์ง€๋‹ˆ์–ด๋ง์— ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ์‚ฌ์œ ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AppMaster์—์„œ๋Š” ์‹ค์šฉ์ ์ธ ์ ‘๊ทผ๋ฒ•์œผ๋กœ Data Designer์— "WebhookEvent" ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ๊ฐ ๋‹จ๊ณ„๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” Business Process๋ฅผ ๋‘๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๊ตฌ๊ฐ€ ์š”์ ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ๊ด€๋œ ๊ธฐ๋ก์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ๊ฐ€ ์ฝ๊ธฐ ์‰ฝ๋„๋ก ์ด๋ฒคํŠธ ๊ตฌ์กฐ ํ‘œ์ค€ํ™”ํ•˜๊ธฐ

๊ฐ ๊ณต๊ธ‰์ž๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด๋กœ๋“œ ํ˜•ํƒœ๋ฅผ ๋ณด๋‚ด๋ฉด ๋กœ๊ทธ๋Š” ํ•ญ์ƒ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค. ์•ˆ์ •์ ์ธ ์ด๋ฒคํŠธ "๋ด‰ํˆฌ(envelope)"๋ฅผ ๋งŒ๋“ค๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€” ๋•Œ๋„ ๊ฐ™์€ ํ•„๋“œ๋ฅผ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ์–ด ๋””๋ฒ„๊น… ์†๋„๊ฐ€ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ๋ด‰ํˆฌ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  • id (๊ณ ์œ  ์ด๋ฒคํŠธ id)
  • type (invoice.paid ๊ฐ™์€ ๋ช…ํ™•ํ•œ ์ด๋ฒคํŠธ ์ด๋ฆ„)
  • created_at (์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ ์‹œ์ , ์ˆ˜์‹  ์‹œ์  ์•„๋‹˜)
  • data (๋น„์ฆˆ๋‹ˆ์Šค ํŽ˜์ด๋กœ๋“œ)
  • version (v1 ๋“ฑ)

์•„๋ž˜๋Š” ๊ทธ๋Œ€๋กœ ๋กœ๊ทธ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ž…๋‹ˆ๋‹ค:

{
  "id": "evt_01H...",
  "type": "payment.failed",
  "created_at": "2026-01-25T10:12:30Z",
  "version": "v1",
  "correlation": {"order_id": "A-10492", "customer_id": "C-883"},
  "data": {"amount": 4990, "currency": "USD", "reason": "insufficient_funds"}
}

ํ•˜๋‚˜์˜ ๋„ค์ด๋ฐ ์Šคํƒ€์ผ(snake_case ๋˜๋Š” camelCase)์„ ์„ ํƒํ•˜๊ณ  ์ง€ํ‚ค์„ธ์š”. ํƒ€์ž…์—๋„ ์—„๊ฒฉํ•˜์„ธ์š”: amount๋ฅผ ๋•Œ๋กœ๋Š” ๋ฌธ์ž์—ด, ๋•Œ๋กœ๋Š” ์ˆซ์ž๋กœ ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”.

๋ฒ„์ „ ๊ด€๋ฆฌ๋Š” ์•ˆ์ „๋ง์ž…๋‹ˆ๋‹ค. ํ•„๋“œ๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•  ๋•Œ๋Š” v2๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  v1์„ ์ž ์‹œ ์œ ์ง€ํ•˜์„ธ์š”. ์ง€์› ์‚ฌ๊ณ ๋ฅผ ์ค„์ด๊ณ  ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ผ๊ด€๋˜๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ์„œ๋ช… ๊ฒ€์ฆ

์„œ๋ช…์€ ์›นํ›… ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์—ด๋ฆฐ ๋ฌธ์ด ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์Šต๋‹ˆ๋‹ค. ๊ฒ€์ฆ์ด ์—†์œผ๋ฉด URL์„ ์•Œ๊ฒŒ ๋œ ๋ˆ„๊ตฌ๋‚˜ ๊ฐ€์งœ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ณ , ๊ณต๊ฒฉ์ž๋Š” ์‹ค์ œ ์š”์ฒญ์„ ๋ณ€์กฐํ•˜๋ ค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ํ”ํ•œ ํŒจํ„ด์€ ๊ณต์œ  ์‹œํฌ๋ฆฟ์œผ๋กœ HMAC ์„œ๋ช…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐœ์‹ ์ž๋Š” ์›๋ณธ ์š”์ฒญ ๋ฐ”๋””(๊ฐ€์žฅ ์ข‹์Œ) ๋˜๋Š” ์ •๊ทœํ™”๋œ ๋ฌธ์ž์—ด์— ์„œ๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜์‹ ์ž๋Š” HMAC์„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ๋งŽ์€ ๊ณต๊ธ‰์ž๊ฐ€ ์žฌ์ „์†ก ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์„œ๋ช…์— ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ ๋ฃจํ‹ด์€ ๋‹จ์ˆœํ•˜๊ณ  ์ผ๊ด€์ ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:

  • ์ˆ˜์‹ ํ•œ ์›๋ณธ ๋ฐ”๋””๋ฅผ ์ •ํ™•ํžˆ ์ฝ๊ธฐ(ํŒŒ์‹ฑ ์ „)
  • ๊ณต๊ธ‰์ž์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์‹œํฌ๋ฆฟ์œผ๋กœ ์„œ๋ช…์„ ์žฌ๊ณ„์‚ฐ
  • ์ƒ์ˆ˜ ์‹œ๊ฐ„ ๋น„๊ต ํ•จ์ˆ˜๋กœ ๋น„๊ต
  • ์˜ค๋ž˜๋œ ํƒ€์ž„์Šคํƒฌํ”„๋Š” ๊ฑฐ๋ถ€(๋ช‡ ๋ถ„ ์ •๋„์˜ ์งง์€ ์œˆ๋„์šฐ ์‚ฌ์šฉ)
  • ์‹คํŒจ ์‹œ ๋‹ซ๊ธฐ: ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ ํ˜•์‹์ด ์ž˜๋ชป๋˜๋ฉด ๋ฌดํšจ๋กœ ์ฒ˜๋ฆฌ

ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“œ์„ธ์š”. ๊ฒ€์ฆ์„ ์ž‘์€ ํ•จ์ˆ˜์— ๋„ฃ๊ณ  ์ •์ƒ/๋น„์ •์ƒ ์ƒ˜ํ”Œ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”. ํ”ํ•œ ์‹œ๊ฐ„ ๋‚ญ๋น„๋Š” ํŒŒ์‹ฑ๋œ JSON์— ์„œ๋ช…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์›๋ณธ ๋ฐ”์ดํŠธ์— ์„œ๋ช…ํ•ด์•ผ ํ•จ).

์‹œํฌ๋ฆฟ ํšŒ์ „์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ณ„ํšํ•˜์„ธ์š”. ์ „ํ™˜ ์ค‘์—๋Š” ๋‘ ๊ฐœ์˜ ํ™œ์„ฑ ์‹œํฌ๋ฆฟ์„ ์ง€์›ํ•˜์„ธ์š”: ์ตœ์‹  ์‹œํฌ๋ฆฟ์„ ๋จผ์ € ์‹œ๋„ํ•˜๊ณ  ์ด์ „ ์‹œํฌ๋ฆฟ์œผ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ ์‹คํŒจ ์‹œ์—๋Š” ๋””๋ฒ„๊น…์— ์ถฉ๋ถ„ํ•˜์ง€๋งŒ ์‹œํฌ๋ฆฟ์„ ์œ ์ถœํ•˜์ง€ ์•Š๋Š” ์ˆ˜์ค€์œผ๋กœ ๊ธฐ๋กํ•˜์„ธ์š”: ๊ณต๊ธ‰์ž ์ด๋ฆ„, ํƒ€์ž„์Šคํƒฌํ”„(๋„ˆ๋ฌด ์˜ค๋ž˜๋˜์—ˆ๋Š”์ง€ ์—ฌ๋ถ€ ํฌํ•จ), ์„œ๋ช… ๋ฒ„์ „, ์š”์ฒญ/์ƒ๊ด€ ID, ๊ทธ๋ฆฌ๊ณ  ์›๋ณธ ๋ฐ”๋””์˜ ์งง์€ ํ•ด์‹œ(๋ณธ๋ฌธ ์ž์ฒด๋Š” ์•„๋‹˜).

์ค‘๋ณต ๋ถ€์ž‘์šฉ ์—†๋Š” ์žฌ์‹œ๋„์™€ ๋ฉฑ๋“ฑ์„ฑ

Verify Webhook Signatures Consistently
Add an HMAC verification step to your flow before you parse JSON or write data.
Try AppMaster

์žฌ์‹œ๋„๋Š” ์ •์ƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ธ‰์ž๋Š” ํƒ€์ž„์•„์›ƒ, ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ, 5xx ์‘๋‹ต ์‹œ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ์ž‘์—…์„ ์™„๋ฃŒํ–ˆ๋”๋ผ๋„ ๊ณต๊ธ‰์ž๋Š” ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค์‹œ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด๋–ค ์‘๋‹ต์ด "์žฌ์‹œ๋„"๋ฅผ ์˜๋ฏธํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ ๊ฒฐ์ •ํ•˜์„ธ์š”. ๋งŽ์€ ํŒ€์€ ๋‹ค์Œ ๊ทœ์น™์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • 2xx: ์ˆ˜๋ฝ, ์žฌ์‹œ๋„ ์ค‘์ง€
  • 4xx: ๊ตฌ์„ฑ ๋˜๋Š” ์š”์ฒญ ๋ฌธ์ œ, ๋ณดํ†ต ์žฌ์‹œ๋„ ์ค‘์ง€
  • 408/429/5xx: ์ผ์‹œ์  ์‹คํŒจ ๋˜๋Š” ์†๋„ ์ œํ•œ, ์žฌ์‹œ๋„

๋ฉฑ๋“ฑ์„ฑ(idempotency)์€ ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ์ฒ˜๋ฆฌํ•ด๋„ ๋ถ€์ž‘์šฉ์ด ๋ฐ˜๋ณต๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค(๋‘ ๋ฒˆ ์ฒญ๊ตฌ๋˜๊ฑฐ๋‚˜ ์ฃผ๋ฌธ์ด ์ค‘๋ณต ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์ด๋ฉ”์ผ์ด ๋‘ ๋ฒˆ ์ „์†ก๋˜๋Š” ๊ฒƒ ๋ฐฉ์ง€). ์›นํ›…์„ ์ ์–ด๋„ ํ•œ ๋ฒˆ ์ด์ƒ ๋ณด์žฅ๋˜๋Š” ์ „๋‹ฌ(at-least-once)์œผ๋กœ ๋‹ค๋ฃจ์„ธ์š”.

์‹ค์šฉ์ ์ธ ํŒจํ„ด์€ ๋“ค์–ด์˜จ ์ด๋ฒคํŠธ์˜ ๊ณ ์œ  ID์™€ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ์ „๋‹ฌ ์‹œ:

  • ์„ฑ๊ณต์ด์—ˆ๋‹ค๋ฉด 2xx๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์•„๋ฌด ์ž‘์—…๋„ ํ•˜์ง€ ์•Š์Œ
  • ์‹คํŒจํ–ˆ๋‹ค๋ฉด ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ๋ฅผ ์žฌ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ์žฌ์‹œ๋„๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋ฅผ ๋ฐ˜ํ™˜
  • ์ง„ํ–‰ ์ค‘์ด๋ฉด ๋ณ‘๋ ฌ ์ž‘์—…์„ ํ”ผํ•˜๊ณ  ์งง์€ "accepted" ์‘๋‹ต์„ ๋ฐ˜ํ™˜

๋‚ด๋ถ€ ์žฌ์‹œ๋„์˜ ๊ฒฝ์šฐ ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹œ๋„ ํšŸ์ˆ˜๋ฅผ ์ œํ•œํ•˜์„ธ์š”. ์ œํ•œ์„ ๋„˜๊ธฐ๋ฉด ๋งˆ์ง€๋ง‰ ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ "๊ฒ€ํ†  ํ•„์š”" ์ƒํƒœ๋กœ ์˜ฎ๊ธฐ์„ธ์š”. AppMaster์—์„œ๋Š” ์ด๋ฒคํŠธ ID์™€ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž‘์€ ํ…Œ์ด๋ธ”๊ณผ ์žฌ์‹œ๋„๋ฅผ ์˜ˆ์•ฝํ•˜๊ณ  ๋ฐ˜๋ณต ์‹คํŒจ๋ฅผ ๋ผ์šฐํŒ…ํ•˜๋Š” Business Process๋กœ ์ด ํŒจํ„ด์„ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ง€์›ํŒ€์ด ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ์žฌ์ƒ ๋„๊ตฌ

์žฌ์‹œ๋„๋Š” ์ž๋™์ด๊ณ  ์žฌ์ƒ์€ ์˜๋„์ ์ž…๋‹ˆ๋‹ค.

์žฌ์ƒ ๋„๊ตฌ๋Š” "๋ณด๋‚ธ ๊ฒƒ ๊ฐ™๋‹ค"๋Š” ์ƒํƒœ๋ฅผ ์ •ํ™•ํžˆ ๋™์ผํ•œ ํŽ˜์ด๋กœ๋“œ๋กœ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•ˆ์ „ํ•˜๋ ค๋ฉด ๋‘ ๊ฐ€์ง€๊ฐ€ ์ถฉ์กฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ๋ฉฑ๋“ฑ์„ฑ๊ณผ ๊ฐ์‚ฌ ์ถ”์ ์ž…๋‹ˆ๋‹ค. ๋ฉฑ๋“ฑ์„ฑ์€ ์ด์ค‘ ์ฒญ๊ตฌ, ์ด์ค‘ ๋ฐฐ์†ก, ์ด์ค‘ ์ด๋ฉ”์ผ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๊ฐ์‚ฌ ์ถ”์ ์€ ๋ˆ„๊ฐ€ ๋ฌด์—‡์„ ์žฌ์ƒํ–ˆ๋Š”์ง€์™€ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋‹จ์ผ ์ด๋ฒคํŠธ ์žฌ์ƒ vs ๊ธฐ๊ฐ„ ๊ธฐ๋ฐ˜ ์žฌ์ƒ

๋‹จ์ผ ์ด๋ฒคํŠธ ์žฌ์ƒ์€ ์ผ๋ฐ˜์ ์ธ ์ง€์› ์‚ฌ๋ก€์ž…๋‹ˆ๋‹ค: ํ•œ ๊ณ ๊ฐ์˜ ์‹คํŒจํ•œ ์ด๋ฒคํŠธ ํ•˜๋‚˜๋ฅผ ์ˆ˜์ • ํ›„ ์žฌ์ „์†ก. ๊ธฐ๊ฐ„ ๊ธฐ๋ฐ˜ ์žฌ์ƒ์€ ์‚ฌ๊ณ  ๋Œ€์‘์šฉ์ž…๋‹ˆ๋‹ค: ๊ณต๊ธ‰์ž ์žฅ์• ๊ฐ€ ํŠน์ • ์‹œ๊ฐ„๋Œ€์— ์žˆ์—ˆ๊ณ  ๊ทธ ๋™์•ˆ ์‹คํŒจํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ๋ณด๋‚ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ ์กฐ๊ฑด์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”: ์ด๋ฒคํŠธ ํƒ€์ž…, ์‹œ๊ฐ„ ๋ฒ”์œ„, ์ƒํƒœ(์‹คํŒจ, ํƒ€์ž„์•„์›ƒ, ์ „๋‹ฌ๋˜์—ˆ์ง€๋งŒ ๋ฏธํ™•์ธ)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•„ํ„ฐ๋งํ•˜๊ณ  ๋‹จ์ผ ์ด๋ฒคํŠธ๋‚˜ ๋ฐฐ์น˜๋ฅผ ์žฌ์ƒํ•˜์„ธ์š”.

์‚ฌ๊ณ  ๋ฐฉ์ง€๋ฅผ ์œ„ํ•œ ๊ฐ€๋“œ๋ ˆ์ผ

์žฌ์ƒ์€ ๊ฐ•๋ ฅํ•˜์ง€๋งŒ ์œ„ํ—˜ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์•ˆ์ „ ์žฅ์น˜:

  • ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด
  • ๋ชฉ์ ์ง€๋ณ„ ์†๋„ ์ œํ•œ
  • ์žฌ์ƒ ์‚ฌ์œ ๋ฅผ ์ €์žฅํ•˜๋Š” ํ•„์ˆ˜ ๋ฉ”๋ชจ
  • ๋Œ€๋Ÿ‰ ์žฌ์ƒ์— ๋Œ€ํ•œ ์„ ํƒ์  ์Šน์ธ
  • ์ „์†ก ์—†์ด ๊ฒ€์ฆ๋งŒ ํ•˜๋Š” ๋“œ๋ผ์ด๋Ÿฐ ๋ชจ๋“œ

์žฌ์ƒ ํ›„์—๋Š” ์›๋ณธ ์ด๋ฒคํŠธ ์˜†์— ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•˜์„ธ์š”: ์„ฑ๊ณต, ์—ฌ์ „ํžˆ ์‹คํŒจ(์ตœ์‹  ์˜ค๋ฅ˜ ํฌํ•จ), ๋˜๋Š” ๋ฉฑ๋“ฑ์„ฑ์œผ๋กœ ๊ฐ์ง€๋œ ๋ฌด์‹œ(์ค‘๋ณต).

์‚ฌ๊ณ  ์‹œ ์œ ์šฉํ•œ ์ด๋ฒคํŠธ ๋กœ๊ทธ

Reduce Tech Debt in Integrations
Change logic fast and regenerate clean Go, Vue, and mobile code as your integrations evolve.
Try AppMaster

์›นํ›…์ด ์‚ฌ๊ณ  ์ค‘์— ๊นจ์ง€๋ฉด ๋ช‡ ๋ถ„ ๋‚ด์— ๋‹ต์„ ์–ป์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ๋กœ๊ทธ๋Š” ๋ช…ํ™•ํ•œ ์ด์•ผ๊ธฐ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค: ๋ฌด์—‡์ด ๋„์ฐฉํ–ˆ๋Š”์ง€, ๋ฌด์—‡์„ ํ–ˆ๋Š”์ง€, ์–ด๋””์„œ ๋ฉˆ์ท„๋Š”์ง€.

์ˆ˜์‹ ํ•œ ์›๋ณธ ์š”์ฒญ์„ ๊ทธ๋Œ€๋กœ ์ €์žฅํ•˜์„ธ์š”: ํƒ€์ž„์Šคํƒฌํ”„, ๊ฒฝ๋กœ, ๋ฉ”์„œ๋“œ, ํ—ค๋”, ์›๋ณธ ๋ฐ”๋””. ๊ณต๊ธ‰์ž๊ฐ€ ํ•„๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ํŒŒ์„œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜๋ชป ์ฝ์„ ๋•Œ ์›๋ณธ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ๊ทผ๊ฑฐ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ €์žฅํ•˜๊ธฐ ์ „์— ๋ฏผ๊ฐํ•œ ๊ฐ’์„ ๋งˆ์Šคํ‚นํ•˜์„ธ์š”(Authorization ํ—ค๋”, ํ† ํฐ, ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐœ์ธ/๊ฒฐ์ œ ๋ฐ์ดํ„ฐ).

์›๋ณธ ๋ฐ์ดํ„ฐ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŒŒ์‹ฑ๋œ ๊ฒ€์ƒ‰์šฉ ๋ทฐ๋„ ์ €์žฅํ•˜์„ธ์š”: ์ด๋ฒคํŠธ ํƒ€์ž…, ์™ธ๋ถ€ ์ด๋ฒคํŠธ ID, ๊ณ ๊ฐ/๊ณ„์ • ์‹๋ณ„์ž, ๊ด€๋ จ ๊ฐ์ฒด ID(invoice_id, order_id), ๋‚ด๋ถ€ ์ƒ๊ด€ ID. ์ด ๋•๋ถ„์— ์ง€์›ํŒ€์€ "๊ณ ๊ฐ 8142์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ"๋ฅผ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์—ด์ง€ ์•Š๊ณ  ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜๋ฆฌ ์ค‘์—๋Š” ์ผ๊ด€๋œ ๋ฌธ๊ตฌ๋กœ ์งง์€ ๋‹จ๊ณ„ ํƒ€์ž„๋ผ์ธ์„ ์œ ์ง€ํ•˜์„ธ์š”. ์˜ˆ: "validated signature", "mapped fields", "checked idempotency", "updated records", "queued follow-ups".

๋ณด์œ  ๊ธฐ๊ฐ„(retention)์€ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์ง€์—ฐ๊ณผ ๋ถ„์Ÿ์„ ์ปค๋ฒ„ํ•  ๋งŒํผ ์ถฉ๋ถ„ํžˆ ๋ณด๊ด€ํ•˜๋˜ ์˜๊ตฌ ๋ณด๊ด€์€ ํ”ผํ•˜์„ธ์š”. ์›๋ณธ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋จผ์ € ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์ต๋ช…ํ™”ํ•˜๊ณ  ๊ฐ€๋ฒผ์šด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋” ์˜ค๋ž˜ ๋ณด๊ด€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์„ธ์š”.

๋‹จ๊ณ„๋ณ„: ๋””๋ฒ„๊ทธ ๊ฐ€๋Šฅํ•œ ์›นํ›… ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•

Give Support Safe Replay Tools
Build a support page to find one event, replay it, and record what happened.
Get Started

์ˆ˜์‹ ๊ธฐ๋ฅผ ๋ช…ํ™•ํ•œ ์ฒดํฌํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” ์ž‘์€ ํŒŒ์ดํ”„๋ผ์ธ์ฒ˜๋Ÿผ ๊ตฌ์ถ•ํ•˜์„ธ์š”. ๋ชจ๋“  ์š”์ฒญ์€ ์ €์žฅ๋œ ์ด๋ฒคํŠธ๊ฐ€ ๋˜๊ณ , ๋ชจ๋“  ์ฒ˜๋ฆฌ ์‹œ๋„๋Š” ํ•˜๋‚˜์˜ ์–ดํƒฌํ…€ํ”„ํŠธ๊ฐ€ ๋˜๋ฉฐ, ๋ชจ๋“  ์‹คํŒจ๋Š” ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์‹  ํŒŒ์ดํ”„๋ผ์ธ

HTTP ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ˆ˜์ง‘(intake) ์šฉ๋„๋กœ๋งŒ ์ทจ๊ธ‰ํ•˜์„ธ์š”. ์ดˆ๊ธฐ์— ์ตœ์†Œํ•œ์˜ ์ž‘์—…๋งŒ ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋ฅผ ์›Œ์ปค๋กœ ์˜ฎ๊ฒจ ํƒ€์ž„์•„์›ƒ์ด ๋ฏธ์Šคํ„ฐ๋ฆฌํ•œ ๋™์ž‘์„ ๋งŒ๋“ค์ง€ ์•Š๋„๋ก ํ•˜์„ธ์š”.

  1. ํ—ค๋”, ์›๋ณธ ๋ฐ”๋””, ์ˆ˜์‹  ํƒ€์ž„์Šคํƒฌํ”„, ๊ณต๊ธ‰์ž ์บก์ฒ˜
  2. ์„œ๋ช… ๊ฒ€์ฆ(๋˜๋Š” ๋ช…ํ™•ํ•œ "๊ฒ€์ฆ ์‹คํŒจ" ์ƒํƒœ ์ €์žฅ)
  3. ์•ˆ์ •์ ์ธ ์ด๋ฒคํŠธ ID๋กœ ํ‚ค๋ฅผ ์žก์•„ ์ฒ˜๋ฆฌ ํ์— ๋“ฑ๋ก
  4. ์›Œ์ปค์—์„œ ๋ฉฑ๋“ฑ์„ฑ ๊ฒ€์‚ฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ์•ก์…˜์œผ๋กœ ์ฒ˜๋ฆฌ
  5. ์ตœ์ข… ๊ฒฐ๊ณผ(success/failure)์™€ ๋„์›€์ด ๋˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ ๊ธฐ๋ก

์‹ค๋ฌด์—์„œ๋Š” ์›นํ›… ์ด๋ฒคํŠธ๋‹น ํ•œ ํ–‰, ์ฒ˜๋ฆฌ ์‹œ๋„๋‹น ํ•œ ํ–‰์˜ ๋‘ ๊ฐ€์ง€ ํ•ต์‹ฌ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฒฌ๊ณ ํ•œ ์ด๋ฒคํŠธ ๋ชจ๋ธ ์˜ˆ: event_id, provider, received_at, signature_status, payload_hash, payload_json(๋˜๋Š” raw payload), current_status, last_error, next_retry_at. ์‹œ๋„ ๊ธฐ๋ก์€ attempt_number, started_at, finished_at, http_status(ํ•ด๋‹น ์‹œ), error_code, error_text ๋“ฑ์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋ฉด ๊ฐ„๋‹จํ•œ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด ์ง€์›ํŒ€์ด ์ด๋ฒคํŠธ ID, ๊ณ ๊ฐ ID, ์‹œ๊ฐ„ ๋ฒ”์œ„๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์ƒํƒœ๋ณ„๋กœ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์„ธ์š”. ๋‹จ์ˆœํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ์œ ์ง€ํ•˜์„ธ์š”.

ํŒจํ„ด ๊ธฐ๋ฐ˜ ์•Œ๋ฆผ์„ ์„ค์ •ํ•˜์„ธ์š”. ์˜ˆ: "๊ณต๊ธ‰์ž๊ฐ€ 5๋ถ„ ๋™์•ˆ 10ํšŒ ์‹คํŒจ" ๋˜๋Š” "์ด๋ฒคํŠธ๊ฐ€ failed์— ๋ฉˆ์ถค" ๊ฐ™์€ ํŒจํ„ด.

๋ฐœ์‹  ์ธก ๊ธฐ๋Œ€์‚ฌํ•ญ

๋ฐœ์‹  ์ชฝ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์„ธ ๊ฐ€์ง€๋ฅผ ํ‘œ์ค€ํ™”ํ•˜์„ธ์š”: ํ•ญ์ƒ ์ด๋ฒคํŠธ ID ํฌํ•จ, ํ•ญ์ƒ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด๋กœ๋“œ ์„œ๋ช…, ์žฌ์‹œ๋„ ์ •์ฑ…์„ ๋ช…ํ™•ํ•œ ์–ธ์–ด๋กœ ๊ณต๊ฐœ. ํŒŒํŠธ๋„ˆ๊ฐ€ "๋ณด๋ƒˆ๋‹ค"๊ณ  ์ฃผ์žฅํ•  ๋•Œ ๋‹น์‹ ์˜ ์‹œ์Šคํ…œ์— ์•„๋ฌด ๊ฒƒ๋„ ์—†๋‹ค๊ณ  ํ•  ๋ถˆํ•„์š”ํ•œ ์†Œ๋ชจ๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

์˜ˆ: ๊ฒฐ์ œ ์›นํ›…์ด 'failed'์—์„œ 'fixed'๊นŒ์ง€ ์žฌ์ƒ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๋Š” ํ๋ฆ„

ํ”ํ•œ ํŒจํ„ด์€ Stripe ์›นํ›…์ด ์ฃผ๋ฌธ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ์˜์ˆ˜์ฆ์„ ์ด๋ฉ”์ผ/SMS๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ด๋ฒคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ๊ณ ๊ฐ์ด ์ฒญ๊ตฌ๋˜์—ˆ๋Š”์ง€, ์ฃผ๋ฌธ์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€, ์˜์ˆ˜์ฆ์ด ๋ฐœ์†ก๋˜์—ˆ๋Š”์ง€ ์•„๋ฌด๋„ ๋ชจ๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ˜„์‹ค์ ์ธ ์‹คํŒจ ์˜ˆ: Stripe ์„œ๋ช… ์‹œํฌ๋ฆฟ์„ ํšŒ์ „์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋ถ„ ๋™์•ˆ ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์—ฌ์ „ํžˆ ์ด์ „ ์‹œํฌ๋ฆฟ์œผ๋กœ ๊ฒ€์ฆํ•˜๋ ค ํ•ด์„œ Stripe๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋‚ด์ง€๋งŒ ์„œ๋ฒ„๋Š” 401/400์œผ๋กœ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹œ๋ณด๋“œ์—๋Š” "webhook failed"๋ผ๊ณ  ๋œจ๊ณ  ์•ฑ ๋กœ๊ทธ์—๋Š” ๋‹จ์ง€ "invalid signature"๋งŒ ๋‚จ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ๋กœ๊ทธ๋Š” ์›์ธ์„ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค. ์‹คํŒจํ•œ ์ด๋ฒคํŠธ์˜ ๋ ˆ์ฝ”๋“œ๋Š” ์•ˆ์ •์  ์ด๋ฒคํŠธ ID์™€ ํ•จ๊ป˜ ๋ถˆ์ผ์น˜๋ฅผ ์ขํž ์ˆ˜ ์žˆ๋Š” ์ถฉ๋ถ„ํ•œ ๊ฒ€์ฆ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค: ์„œ๋ช… ๋ฒ„์ „, ์„œ๋ช… ํƒ€์ž„์Šคํƒฌํ”„, ๊ฒ€์ฆ ๊ฒฐ๊ณผ, ๋ช…ํ™•ํ•œ ๊ฑฐ๋ถ€ ์‚ฌ์œ (์ž˜๋ชป๋œ ์‹œํฌ๋ฆฟ vs ํƒ€์ž„์Šคํƒฌํ”„ ๋“œ๋ฆฌํ”„ํŠธ). ํšŒ์ „ ์ค‘์—๋Š” ์–ด๋–ค ์‹œํฌ๋ฆฟ์ด ์‹œ๋„๋˜์—ˆ๋Š”์ง€(์˜ˆ: "current" vs "previous")๋ฅผ ๋…ธ์ถœํ•˜๊ณ  ์›๋ณธ ์‹œํฌ๋ฆฟ์€ ๊ธฐ๋กํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์‹œํฌ๋ฆฟ์ด ์ˆ˜์ •๋˜์–ด ์งง์€ ๊ธฐ๊ฐ„ ๋™์•ˆ "current"์™€ "previous"๋ฅผ ํ—ˆ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฐฑ๋กœ๊ทธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์žฌ์ƒ ๋„๊ตฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋น ๋ฅธ ์ž‘์—…์œผ๋กœ ๋ฐ”๋€๋‹ˆ๋‹ค:

  1. event_id๋กœ ์ด๋ฒคํŠธ ์ฐพ๊ธฐ
  2. ์‹คํŒจ ์‚ฌ์œ ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ
  3. ์ด๋ฒคํŠธ ์žฌ์ƒ
  4. ๋ฉฑ๋“ฑ์„ฑ ํ™•์ธ: ์ฃผ๋ฌธ์€ ํ•œ ๋ฒˆ๋งŒ ์ƒ์„ฑ๋˜๊ณ  ์˜์ˆ˜์ฆ์€ ํ•œ ๋ฒˆ๋งŒ ์ „์†ก๋จ
  5. ์žฌ์ƒ ๊ฒฐ๊ณผ์™€ ํƒ€์ž„์Šคํƒฌํ”„๋ฅผ ํ‹ฐ์ผ“์— ์ถ”๊ฐ€

์ž์ฃผ ํ•˜๋Š” ์‹ค์ˆ˜์™€ ํ”ผํ•˜๋Š” ๋ฐฉ๋ฒ•

Handle Retries Without Duplicates
Deduplicate by event ID and keep retries from creating double invoices, emails, or updates.
Build Now

๋Œ€๋ถ€๋ถ„์˜ ์›นํ›… ๋ฌธ์ œ๋Š” ์‹œ์Šคํ…œ์ด ์ตœ์ข… ์˜ค๋ฅ˜๋งŒ ๊ธฐ๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฏธ์Šคํ„ฐ๋ฆฌํ•˜๊ฒŒ ๋А๊ปด์ง‘๋‹ˆ๋‹ค. ๋ชจ๋“  ์ „๋‹ฌ์„ ์†Œ๊ทœ๋ชจ ์‚ฌ๊ณ  ๋ณด๊ณ ์„œ์ฒ˜๋Ÿผ ๋‹ค๋ฃจ์„ธ์š”: ๋ฌด์—‡์ด ๋„์ฐฉํ–ˆ๋Š”์ง€, ๋ฌด์—‡์„ ๊ฒฐ์ •ํ–ˆ๋Š”์ง€, ๊ทธ ํ›„์— ๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋Š”์ง€.

์ž์ฃผ ๋ฐ˜๋ณต๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์‹ค์ˆ˜:

  • ์ˆ˜์‹ ์—์„œ ์žฌ์‹œ๋„๊นŒ์ง€ ์ „์ฒด ๋ผ์ดํ”„์‚ฌ์ดํด(received, verified, queued, processed, failed, retried)์„ ๊ธฐ๋กํ•˜์ง€ ์•Š๊ณ  ์˜ˆ์™ธ๋งŒ ๋กœ๊น…
  • ๋งˆ์Šคํ‚น ์—†์ด ์ „์ฒด ํŽ˜์ด๋กœ๋“œ์™€ ํ—ค๋”๋ฅผ ์ €์žฅํ•ด ์‹œํฌ๋ฆฟ์ด๋‚˜ ๊ฐœ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์บก์ฒ˜ํ•จ
  • ์žฌ์‹œ๋„๋ฅผ ์ƒˆ ์ด๋ฒคํŠธ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•ด ์ค‘๋ณต ์ฒญ๊ตฌ๋‚˜ ์ค‘๋ณต ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœ์ƒ
  • ์ด๋ฒคํŠธ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋˜๊ธฐ ์ „์— 200 OK๋ฅผ ๋ฐ˜ํ™˜ํ•ด ๋Œ€์‹œ๋ณด๋“œ์—๋Š” ๋…น์ƒ‰์ด์ง€๋งŒ ์‹ค์ œ ์ž‘์—…์€ ์‚ฌ๋ผ์ง

์‹ค์šฉ์ ์ธ ์ˆ˜์ •์ฑ…:

  • ์ตœ์†Œํ•œ์˜ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•œ ์š”์ฒญ ๋ ˆ์ฝ”๋“œ์™€ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ์ €์žฅ
  • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏผ๊ฐ ํ•„๋“œ๋ฅผ ๋งˆ์Šคํ‚นํ•˜๊ณ  ์›๋ณธ ํŽ˜์ด๋กœ๋“œ ์ ‘๊ทผ์„ ์ œํ•œ
  • ๋ฉฑ๋“ฑ์„ฑ์„ ์ฝ”๋“œ๋ฟ ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€์—์„œ ๊ฐ•์ œ
  • ์ด๋ฒคํŠธ๊ฐ€ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋œ ํ›„์—๋งŒ ์ˆ˜์‹ ์„ ํ™•์ธ
  • ์žฌ์ƒ์„ ์ผํšŒ์„ฑ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์ง€์›๋˜๋Š” ์›Œํฌํ”Œ๋กœ๋กœ ๊ตฌ์ถ•

AppMaster๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด ๊ตฌ์„ฑ ์š”์†Œ๋“ค์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ”Œ๋žซํผ์— ๋งž์•„๋–จ์–ด์ง‘๋‹ˆ๋‹ค: Data Designer์˜ ์ด๋ฒคํŠธ ํ…Œ์ด๋ธ”, ๊ฒ€์ฆ ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ƒํƒœ ์ค‘์‹ฌ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” Business Process, ๊ฒ€์ƒ‰ ๋ฐ ์žฌ์ƒ์„ ์œ„ํ•œ ๊ด€๋ฆฌ์ž UI ๋“ฑ.

๋น ๋ฅธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ ๋ฐ ๋‹ค์Œ ๋‹จ๊ณ„

๋งค๋ฒˆ ๊ฐ™์€ ๊ธฐ๋ณธ์„ ๋ชฉํ‘œ๋กœ ํ•˜์„ธ์š”:

  • ๋ชจ๋“  ์ด๋ฒคํŠธ์— ๊ณ ์œ ํ•œ event_id๊ฐ€ ์žˆ๊ณ  ์›๋ณธ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ˆ˜์‹ ํ•œ ๊ทธ๋Œ€๋กœ ์ €์žฅ
  • ๋ชจ๋“  ์š”์ฒญ์—์„œ ์„œ๋ช… ๊ฒ€์ฆ์„ ์‹คํ–‰ํ•˜๊ณ  ์‹คํŒจ ์‹œ ๋ช…ํ™•ํ•œ ์ด์œ  ํฌํ•จ
  • ์žฌ์‹œ๋„๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ํ•ธ๋“ค๋Ÿฌ๋Š” ๋ฉฑ๋“ฑ์„ฑ ๋ณด์žฅ
  • ์žฌ์ƒ์€ ๊ถŒํ•œ ์žˆ๋Š” ์—ญํ• ๋กœ ์ œํ•œ๋˜๊ณ  ๊ฐ์‚ฌ ์ถ”์ ์„ ๋‚จ๊น€
  • ๋กœ๊ทธ๋Š” event_id, provider id, ์ƒํƒœ, ์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์งง์€ "๋ฌด์Šจ ์ผ์ด ์žˆ์—ˆ๋‚˜" ์š”์•ฝ ํฌํ•จ

์ด ์ค‘ ํ•˜๋‚˜๋งŒ ๋น ์ ธ๋„ ํ†ตํ•ฉ์€ ์—ฌ์ „ํžˆ ๋ธ”๋ž™๋ฐ•์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๋ณธ ํŽ˜์ด๋กœ๋“œ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์œผ๋ฉด ๊ณต๊ธ‰์ž๊ฐ€ ๋ณด๋‚ธ ๊ฒƒ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋ช… ์‹คํŒจ๊ฐ€ ๊ตฌ์ฒด์ ์ด์ง€ ์•Š์œผ๋ฉด ๋ˆ„๊ตฌ ํƒ“์ธ์ง€ ๋…ผ์Ÿํ•˜๋Š” ๋ฐ ๋ช‡ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ•ฉ๋‹ˆ๋‹ค.

๋น ๋ฅด๊ฒŒ ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์ˆ˜์ž‘์—…์œผ๋กœ ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ด๋Ÿฐ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด AppMaster๊ฐ€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ, ์ฒ˜๋ฆฌ ํ๋ฆ„, ๊ด€๋ฆฌ์ž UI๋ฅผ ํ•œ๊ณณ์—์„œ ์กฐ๋ฆฝํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‰ฌ์šด ์‹œ์ž‘
๋ฉ‹์ง„๋งŒ๋“ค๊ธฐ

๋ฌด๋ฃŒ ์š”๊ธˆ์ œ๋กœ AppMaster๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์„ธ์š”.
์ค€๋น„๊ฐ€ ๋˜๋ฉด ์ ์ ˆํ•œ ๊ตฌ๋…์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๋‹ค
์›นํ›… ํ†ตํ•ฉ ๋””๋ฒ„๊น…: ์„œ๋ช…, ์žฌ์‹œ๋„, ์žฌ์ƒ, ์ด๋ฒคํŠธ ๋กœ๊ทธ | AppMaster