์นํ ํตํฉ ๋๋ฒ๊น : ์๋ช , ์ฌ์๋, ์ฌ์, ์ด๋ฒคํธ ๋ก๊ทธ
์๋ช ์ ํ์คํํ๊ณ ์ฌ์๋๋ฅผ ์์ ํ๊ฒ ์ฒ๋ฆฌํ๋ฉฐ ์ฌ์ ๊ธฐ๋ฅ๊ณผ ๊ฒ์ํ๊ธฐ ์ฌ์ด ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ๊ฐ์ถฐ ์นํ ํตํฉ์ ํจ์จ์ ์ผ๋ก ๋๋ฒ๊น ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.

์ ์นํ ํตํฉ์ด ๋ธ๋๋ฐ์ค๊ฐ ๋๋๊ฐ
์นํ ์ ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฌด์ธ๊ฐ ๋ฐ์ํ์ ๋ ๋น์ ์ ์ฑ์ ํธ์ถํ๋ ๊ฒ๋ฟ์ ๋๋ค. ๊ฒฐ์ ์ ๊ณต์๊ฐ "๊ฒฐ์ ์ฑ๊ณต"์ ์๋ฆฌ๊ฑฐ๋, ํผ ๋๊ตฌ๊ฐ "์ ์ ์ถ"์ ๋ณด๋ด๊ฑฐ๋, 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, ๊ทธ๋ฆฌ๊ณ ์๋ณธ ๋ฐ๋์ ์งง์ ํด์(๋ณธ๋ฌธ ์์ฒด๋ ์๋).
์ค๋ณต ๋ถ์์ฉ ์๋ ์ฌ์๋์ ๋ฉฑ๋ฑ์ฑ
์ฌ์๋๋ ์ ์์ ๋๋ค. ๊ณต๊ธ์๋ ํ์์์, ๋คํธ์ํฌ ๋ฌธ์ , 5xx ์๋ต ์ ์ฌ์๋ํฉ๋๋ค. ์์คํ ์ด ์์ ์ ์๋ฃํ๋๋ผ๋ ๊ณต๊ธ์๋ ์๋ต์ ๋ฐ์ง ๋ชปํ๋ค๋ฉด ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ๋ค์ ๋ณด๋ผ ์ ์์ต๋๋ค.
์ด๋ค ์๋ต์ด "์ฌ์๋"๋ฅผ ์๋ฏธํ๋์ง ๋ฏธ๋ฆฌ ๊ฒฐ์ ํ์ธ์. ๋ง์ ํ์ ๋ค์ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค:
- 2xx: ์๋ฝ, ์ฌ์๋ ์ค์ง
- 4xx: ๊ตฌ์ฑ ๋๋ ์์ฒญ ๋ฌธ์ , ๋ณดํต ์ฌ์๋ ์ค์ง
- 408/429/5xx: ์ผ์์ ์คํจ ๋๋ ์๋ ์ ํ, ์ฌ์๋
๋ฉฑ๋ฑ์ฑ(idempotency)์ ๊ฐ์ ์ด๋ฒคํธ๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฒ๋ฆฌํด๋ ๋ถ์์ฉ์ด ๋ฐ๋ณต๋์ง ์๋๋ก ํฉ๋๋ค(๋ ๋ฒ ์ฒญ๊ตฌ๋๊ฑฐ๋ ์ฃผ๋ฌธ์ด ์ค๋ณต ์์ฑ๋๊ฑฐ๋ ์ด๋ฉ์ผ์ด ๋ ๋ฒ ์ ์ก๋๋ ๊ฒ ๋ฐฉ์ง). ์นํ ์ ์ ์ด๋ ํ ๋ฒ ์ด์ ๋ณด์ฅ๋๋ ์ ๋ฌ(at-least-once)์ผ๋ก ๋ค๋ฃจ์ธ์.
์ค์ฉ์ ์ธ ํจํด์ ๋ค์ด์จ ์ด๋ฒคํธ์ ๊ณ ์ ID์ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ณต ์ ๋ฌ ์:
- ์ฑ๊ณต์ด์๋ค๋ฉด 2xx๋ฅผ ๋ฐํํ๊ณ ์๋ฌด ์์ ๋ ํ์ง ์์
- ์คํจํ๋ค๋ฉด ๋ด๋ถ ์ฒ๋ฆฌ๋ฅผ ์ฌ์๋ํ๊ฑฐ๋ ์ฌ์๋๊ฐ ๊ฐ๋ฅํ ์ํ๋ฅผ ๋ฐํ
- ์งํ ์ค์ด๋ฉด ๋ณ๋ ฌ ์์ ์ ํผํ๊ณ ์งง์ "accepted" ์๋ต์ ๋ฐํ
๋ด๋ถ ์ฌ์๋์ ๊ฒฝ์ฐ ์ง์ ๋ฐฑ์คํ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ํ์๋ฅผ ์ ํํ์ธ์. ์ ํ์ ๋๊ธฐ๋ฉด ๋ง์ง๋ง ์ค๋ฅ์ ํจ๊ป "๊ฒํ ํ์" ์ํ๋ก ์ฎ๊ธฐ์ธ์. AppMaster์์๋ ์ด๋ฒคํธ ID์ ์ํ๋ฅผ ์ ์ฅํ๋ ์์ ํ ์ด๋ธ๊ณผ ์ฌ์๋๋ฅผ ์์ฝํ๊ณ ๋ฐ๋ณต ์คํจ๋ฅผ ๋ผ์ฐํ ํ๋ Business Process๋ก ์ด ํจํด์ ๊น๋ํ๊ฒ ๊ตฌํํ ์ ์์ต๋๋ค.
์ง์ํ์ด ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ํด๊ฒฐํ ์ ์๊ฒ ํ๋ ์ฌ์ ๋๊ตฌ
์ฌ์๋๋ ์๋์ด๊ณ ์ฌ์์ ์๋์ ์ ๋๋ค.
์ฌ์ ๋๊ตฌ๋ "๋ณด๋ธ ๊ฒ ๊ฐ๋ค"๋ ์ํ๋ฅผ ์ ํํ ๋์ผํ ํ์ด๋ก๋๋ก ๋ค์ ํ ์คํธํ ์ ์๊ฒ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ ํ๋ ค๋ฉด ๋ ๊ฐ์ง๊ฐ ์ถฉ์กฑ๋์ด์ผ ํฉ๋๋ค: ๋ฉฑ๋ฑ์ฑ๊ณผ ๊ฐ์ฌ ์ถ์ ์ ๋๋ค. ๋ฉฑ๋ฑ์ฑ์ ์ด์ค ์ฒญ๊ตฌ, ์ด์ค ๋ฐฐ์ก, ์ด์ค ์ด๋ฉ์ผ์ ๋ฐฉ์งํ๊ณ , ๊ฐ์ฌ ์ถ์ ์ ๋๊ฐ ๋ฌด์์ ์ฌ์ํ๋์ง์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
๋จ์ผ ์ด๋ฒคํธ ์ฌ์ vs ๊ธฐ๊ฐ ๊ธฐ๋ฐ ์ฌ์
๋จ์ผ ์ด๋ฒคํธ ์ฌ์์ ์ผ๋ฐ์ ์ธ ์ง์ ์ฌ๋ก์ ๋๋ค: ํ ๊ณ ๊ฐ์ ์คํจํ ์ด๋ฒคํธ ํ๋๋ฅผ ์์ ํ ์ฌ์ ์ก. ๊ธฐ๊ฐ ๊ธฐ๋ฐ ์ฌ์์ ์ฌ๊ณ ๋์์ฉ์ ๋๋ค: ๊ณต๊ธ์ ์ฅ์ ๊ฐ ํน์ ์๊ฐ๋์ ์์๊ณ ๊ทธ ๋์ ์คํจํ ๋ชจ๋ ๊ฒ์ ๋ค์ ๋ณด๋ด์ผ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
์ ํ ์กฐ๊ฑด์ ๋จ์ํ๊ฒ ์ ์งํ์ธ์: ์ด๋ฒคํธ ํ์ , ์๊ฐ ๋ฒ์, ์ํ(์คํจ, ํ์์์, ์ ๋ฌ๋์์ง๋ง ๋ฏธํ์ธ)๋ฅผ ๊ธฐ์ค์ผ๋ก ํํฐ๋งํ๊ณ ๋จ์ผ ์ด๋ฒคํธ๋ ๋ฐฐ์น๋ฅผ ์ฌ์ํ์ธ์.
์ฌ๊ณ ๋ฐฉ์ง๋ฅผ ์ํ ๊ฐ๋๋ ์ผ
์ฌ์์ ๊ฐ๋ ฅํ์ง๋ง ์ํํ์ง ์์์ผ ํฉ๋๋ค. ๋ช ๊ฐ์ง ์์ ์ฅ์น:
- ์ญํ ๊ธฐ๋ฐ ์ ๊ทผ ์ ์ด
- ๋ชฉ์ ์ง๋ณ ์๋ ์ ํ
- ์ฌ์ ์ฌ์ ๋ฅผ ์ ์ฅํ๋ ํ์ ๋ฉ๋ชจ
- ๋๋ ์ฌ์์ ๋ํ ์ ํ์ ์น์ธ
- ์ ์ก ์์ด ๊ฒ์ฆ๋ง ํ๋ ๋๋ผ์ด๋ฐ ๋ชจ๋
์ฌ์ ํ์๋ ์๋ณธ ์ด๋ฒคํธ ์์ ๊ฒฐ๊ณผ๋ฅผ ํ์ํ์ธ์: ์ฑ๊ณต, ์ฌ์ ํ ์คํจ(์ต์ ์ค๋ฅ ํฌํจ), ๋๋ ๋ฉฑ๋ฑ์ฑ์ผ๋ก ๊ฐ์ง๋ ๋ฌด์(์ค๋ณต).
์ฌ๊ณ ์ ์ ์ฉํ ์ด๋ฒคํธ ๋ก๊ทธ
์นํ ์ด ์ฌ๊ณ ์ค์ ๊นจ์ง๋ฉด ๋ช ๋ถ ๋ด์ ๋ต์ ์ป์ด์ผ ํฉ๋๋ค. ์ข์ ๋ก๊ทธ๋ ๋ช ํํ ์ด์ผ๊ธฐ๋ฅผ ํฉ๋๋ค: ๋ฌด์์ด ๋์ฐฉํ๋์ง, ๋ฌด์์ ํ๋์ง, ์ด๋์ ๋ฉ์ท๋์ง.
์์ ํ ์๋ณธ ์์ฒญ์ ๊ทธ๋๋ก ์ ์ฅํ์ธ์: ํ์์คํฌํ, ๊ฒฝ๋ก, ๋ฉ์๋, ํค๋, ์๋ณธ ๋ฐ๋. ๊ณต๊ธ์๊ฐ ํ๋๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋ ํ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ชป ์ฝ์ ๋ ์๋ณธ ํ์ด๋ก๋๊ฐ ๊ทผ๊ฑฐ๊ฐ ๋ฉ๋๋ค. ์ ์ฅํ๊ธฐ ์ ์ ๋ฏผ๊ฐํ ๊ฐ์ ๋ง์คํนํ์ธ์(Authorization ํค๋, ํ ํฐ, ํ์ํ์ง ์์ ๊ฐ์ธ/๊ฒฐ์ ๋ฐ์ดํฐ).
์๋ณธ ๋ฐ์ดํฐ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ํ์ฑ๋ ๊ฒ์์ฉ ๋ทฐ๋ ์ ์ฅํ์ธ์: ์ด๋ฒคํธ ํ์ , ์ธ๋ถ ์ด๋ฒคํธ ID, ๊ณ ๊ฐ/๊ณ์ ์๋ณ์, ๊ด๋ จ ๊ฐ์ฒด ID(invoice_id, order_id), ๋ด๋ถ ์๊ด ID. ์ด ๋๋ถ์ ์ง์ํ์ "๊ณ ๊ฐ 8142์ ๋ชจ๋ ์ด๋ฒคํธ"๋ฅผ ํ์ด๋ก๋๋ฅผ ์ด์ง ์๊ณ ์ฐพ์ ์ ์์ต๋๋ค.
์ฒ๋ฆฌ ์ค์๋ ์ผ๊ด๋ ๋ฌธ๊ตฌ๋ก ์งง์ ๋จ๊ณ ํ์๋ผ์ธ์ ์ ์งํ์ธ์. ์: "validated signature", "mapped fields", "checked idempotency", "updated records", "queued follow-ups".
๋ณด์ ๊ธฐ๊ฐ(retention)์ ์ค์ํฉ๋๋ค. ์ค์ ์ง์ฐ๊ณผ ๋ถ์์ ์ปค๋ฒํ ๋งํผ ์ถฉ๋ถํ ๋ณด๊ดํ๋ ์๊ตฌ ๋ณด๊ด์ ํผํ์ธ์. ์๋ณธ ํ์ด๋ก๋๋ฅผ ๋จผ์ ์ญ์ ํ๊ฑฐ๋ ์ต๋ช ํํ๊ณ ๊ฐ๋ฒผ์ด ๋ฉํ๋ฐ์ดํฐ๋ ๋ ์ค๋ ๋ณด๊ดํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
๋จ๊ณ๋ณ: ๋๋ฒ๊ทธ ๊ฐ๋ฅํ ์นํ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
์์ ๊ธฐ๋ฅผ ๋ช ํํ ์ฒดํฌํฌ์ธํธ๊ฐ ์๋ ์์ ํ์ดํ๋ผ์ธ์ฒ๋ผ ๊ตฌ์ถํ์ธ์. ๋ชจ๋ ์์ฒญ์ ์ ์ฅ๋ ์ด๋ฒคํธ๊ฐ ๋๊ณ , ๋ชจ๋ ์ฒ๋ฆฌ ์๋๋ ํ๋์ ์ดํฌํ ํํธ๊ฐ ๋๋ฉฐ, ๋ชจ๋ ์คํจ๋ ๊ฒ์ ๊ฐ๋ฅํด์ผ ํฉ๋๋ค.
์์ ํ์ดํ๋ผ์ธ
HTTP ์๋ํฌ์ธํธ๋ฅผ ์์ง(intake) ์ฉ๋๋ก๋ง ์ทจ๊ธํ์ธ์. ์ด๊ธฐ์ ์ต์ํ์ ์์ ๋ง ํ๊ณ ์ฒ๋ฆฌ๋ฅผ ์์ปค๋ก ์ฎ๊ฒจ ํ์์์์ด ๋ฏธ์คํฐ๋ฆฌํ ๋์์ ๋ง๋ค์ง ์๋๋ก ํ์ธ์.
- ํค๋, ์๋ณธ ๋ฐ๋, ์์ ํ์์คํฌํ, ๊ณต๊ธ์ ์บก์ฒ
- ์๋ช ๊ฒ์ฆ(๋๋ ๋ช ํํ "๊ฒ์ฆ ์คํจ" ์ํ ์ ์ฅ)
- ์์ ์ ์ธ ์ด๋ฒคํธ ID๋ก ํค๋ฅผ ์ก์ ์ฒ๋ฆฌ ํ์ ๋ฑ๋ก
- ์์ปค์์ ๋ฉฑ๋ฑ์ฑ ๊ฒ์ฌ์ ๋น์ฆ๋์ค ์ก์ ์ผ๋ก ์ฒ๋ฆฌ
- ์ต์ข ๊ฒฐ๊ณผ(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"๋ฅผ ํ์ฉํ๊ฒ ๋๋ฉด ๋ฐฑ๋ก๊ทธ๋ฅผ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ฌ์ ๋๊ตฌ๋ ๋ค์๊ณผ ๊ฐ์ ๋น ๋ฅธ ์์ ์ผ๋ก ๋ฐ๋๋๋ค:
- event_id๋ก ์ด๋ฒคํธ ์ฐพ๊ธฐ
- ์คํจ ์ฌ์ ๊ฐ ํด๊ฒฐ๋์๋์ง ํ์ธ
- ์ด๋ฒคํธ ์ฌ์
- ๋ฉฑ๋ฑ์ฑ ํ์ธ: ์ฃผ๋ฌธ์ ํ ๋ฒ๋ง ์์ฑ๋๊ณ ์์์ฆ์ ํ ๋ฒ๋ง ์ ์ก๋จ
- ์ฌ์ ๊ฒฐ๊ณผ์ ํ์์คํฌํ๋ฅผ ํฐ์ผ์ ์ถ๊ฐ
์์ฃผ ํ๋ ์ค์์ ํผํ๋ ๋ฐฉ๋ฒ
๋๋ถ๋ถ์ ์นํ ๋ฌธ์ ๋ ์์คํ ์ด ์ต์ข ์ค๋ฅ๋ง ๊ธฐ๋กํ๊ธฐ ๋๋ฌธ์ ๋ฏธ์คํฐ๋ฆฌํ๊ฒ ๋๊ปด์ง๋๋ค. ๋ชจ๋ ์ ๋ฌ์ ์๊ท๋ชจ ์ฌ๊ณ ๋ณด๊ณ ์์ฒ๋ผ ๋ค๋ฃจ์ธ์: ๋ฌด์์ด ๋์ฐฉํ๋์ง, ๋ฌด์์ ๊ฒฐ์ ํ๋์ง, ๊ทธ ํ์ ๋ฌด์จ ์ผ์ด ์์๋์ง.
์์ฃผ ๋ฐ๋ณต๋๋ ๋ช ๊ฐ์ง ์ค์:
- ์์ ์์ ์ฌ์๋๊น์ง ์ ์ฒด ๋ผ์ดํ์ฌ์ดํด(received, verified, queued, processed, failed, retried)์ ๊ธฐ๋กํ์ง ์๊ณ ์์ธ๋ง ๋ก๊น
- ๋ง์คํน ์์ด ์ ์ฒด ํ์ด๋ก๋์ ํค๋๋ฅผ ์ ์ฅํด ์ํฌ๋ฆฟ์ด๋ ๊ฐ์ธ ๋ฐ์ดํฐ๋ฅผ ์บก์ฒํจ
- ์ฌ์๋๋ฅผ ์ ์ด๋ฒคํธ์ฒ๋ผ ์ฒ๋ฆฌํด ์ค๋ณต ์ฒญ๊ตฌ๋ ์ค๋ณต ๋ฉ์์ง๊ฐ ๋ฐ์
- ์ด๋ฒคํธ๊ฐ ์์ ํ๊ฒ ์ ์ฅ๋๊ธฐ ์ ์ 200 OK๋ฅผ ๋ฐํํด ๋์๋ณด๋์๋ ๋ น์์ด์ง๋ง ์ค์ ์์ ์ ์ฌ๋ผ์ง
์ค์ฉ์ ์ธ ์์ ์ฑ :
- ์ต์ํ์ ๊ฒ์ ๊ฐ๋ฅํ ์์ฒญ ๋ ์ฝ๋์ ์ํ ๋ณ๊ฒฝ์ ์ ์ฅ
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฏผ๊ฐ ํ๋๋ฅผ ๋ง์คํนํ๊ณ ์๋ณธ ํ์ด๋ก๋ ์ ๊ทผ์ ์ ํ
- ๋ฉฑ๋ฑ์ฑ์ ์ฝ๋๋ฟ ์๋๋ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ค์์ ๊ฐ์
- ์ด๋ฒคํธ๊ฐ ์์ ํ๊ฒ ์ ์ฅ๋ ํ์๋ง ์์ ์ ํ์ธ
- ์ฌ์์ ์ผํ์ฑ ์คํฌ๋ฆฝํธ๊ฐ ์๋๋ผ ์ง์๋๋ ์ํฌํ๋ก๋ก ๊ตฌ์ถ
AppMaster๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด ๊ตฌ์ฑ ์์๋ค์ ์์ฐ์ค๋ฝ๊ฒ ํ๋ซํผ์ ๋ง์๋จ์ด์ง๋๋ค: Data Designer์ ์ด๋ฒคํธ ํ ์ด๋ธ, ๊ฒ์ฆ ๋ฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ์ค์ฌ์ผ๋ก ์ฒ๋ฆฌํ๋ Business Process, ๊ฒ์ ๋ฐ ์ฌ์์ ์ํ ๊ด๋ฆฌ์ UI ๋ฑ.
๋น ๋ฅธ ์ฒดํฌ๋ฆฌ์คํธ ๋ฐ ๋ค์ ๋จ๊ณ
๋งค๋ฒ ๊ฐ์ ๊ธฐ๋ณธ์ ๋ชฉํ๋ก ํ์ธ์:
- ๋ชจ๋ ์ด๋ฒคํธ์ ๊ณ ์ ํ event_id๊ฐ ์๊ณ ์๋ณธ ํ์ด๋ก๋๋ฅผ ์์ ํ ๊ทธ๋๋ก ์ ์ฅ
- ๋ชจ๋ ์์ฒญ์์ ์๋ช ๊ฒ์ฆ์ ์คํํ๊ณ ์คํจ ์ ๋ช ํํ ์ด์ ํฌํจ
- ์ฌ์๋๋ ์์ธก ๊ฐ๋ฅํ๊ณ ํธ๋ค๋ฌ๋ ๋ฉฑ๋ฑ์ฑ ๋ณด์ฅ
- ์ฌ์์ ๊ถํ ์๋ ์ญํ ๋ก ์ ํ๋๊ณ ๊ฐ์ฌ ์ถ์ ์ ๋จ๊น
- ๋ก๊ทธ๋ event_id, provider id, ์ํ, ์๊ฐ์ผ๋ก ๊ฒ์ ๊ฐ๋ฅํ๋ฉฐ ์งง์ "๋ฌด์จ ์ผ์ด ์์๋" ์์ฝ ํฌํจ
์ด ์ค ํ๋๋ง ๋น ์ ธ๋ ํตํฉ์ ์ฌ์ ํ ๋ธ๋๋ฐ์ค๊ฐ ๋ ์ ์์ต๋๋ค. ์๋ณธ ํ์ด๋ก๋๋ฅผ ์ ์ฅํ์ง ์์ผ๋ฉด ๊ณต๊ธ์๊ฐ ๋ณด๋ธ ๊ฒ์ ์ฆ๋ช ํ ์ ์์ต๋๋ค. ์๋ช ์คํจ๊ฐ ๊ตฌ์ฒด์ ์ด์ง ์์ผ๋ฉด ๋๊ตฌ ํ์ธ์ง ๋ ผ์ํ๋ ๋ฐ ๋ช ์๊ฐ์ ํ๋นํฉ๋๋ค.
๋น ๋ฅด๊ฒ ๋ชจ๋ ๊ตฌ์ฑ์์๋ฅผ ์์์ ์ผ๋ก ์ฝ๋ฉํ์ง ์๊ณ ๋ ์ด๋ฐ ์์คํ ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด AppMaster๊ฐ ๋ฐ์ดํฐ ๋ชจ๋ธ, ์ฒ๋ฆฌ ํ๋ฆ, ๊ด๋ฆฌ์ UI๋ฅผ ํ๊ณณ์์ ์กฐ๋ฆฝํ๋ ๋ฐ ๋์์ ์ค ์ ์์ต๋๋ค.


