๐Ÿ†• Webhook ๊ณตํ†ต ๊ทœ๊ฒฉ

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

๊ทธ๋ฆฌํŒ…์€ ์ฑ„์šฉ ๊ณผ์ •์˜ ์ฃผ์š” ์ด๋ฒคํŠธ๋ฅผ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ์›นํ›…์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • ์ „๋‹ฌ ๋ฐฉ์‹ 2๊ฐ€์ง€

    • Pull (Event Feed API): ์ƒ์‹œ ์ˆ˜์‹  ์„œ๋ฒ„ ์—†์ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์กฐํšŒ - ๋ฐฐ์น˜

    • Push (Webhook): ๋“ฑ๋กํ•œ endpoint๋กœ ๊ทธ๋ฆฌํŒ…์ด HTTP POST - ์‹ค์‹œ๊ฐ„, ์ˆ˜์‹  ์„œ๋ฒ„ ํ•„์š”

  • ๋‘ ๋ฐฉ์‹์€ ๊ฐ™์€ ์ด๋ฒคํŠธ ์ €์žฅ์†Œ๋ฅผ ๋ณด๋ฏ€๋กœ eventId๋„ ๋ณธ๋ฌธ๋„ ์™„์ „ํžˆ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด Push๋กœ ๋†“์นœ ์ด๋ฒคํŠธ๋ฅผ Pull๋กœ ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Business ํ”Œ๋žœ ์ „์šฉ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ํ”Œ๋žœ์ด ํ•ด์ง€ยท๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ๋˜๋ฉด ์ „์†ก์ด ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  ์›นํ›… payload๋Š” ์•„๋ž˜ ๊ณตํ†ต ๋ด‰ํˆฌ๋กœ ๊ฐ์‹ธ์ง‘๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๋ณ„ ์ƒ์„ธ๋Š” data์— ๋‹ด๊น๋‹ˆ๋‹ค.

ํ•„๋“œ

ํƒ€์ž…

ํ•„์ˆ˜ ์—ฌ๋ถ€

์„ค๋ช…

eventId

String

ํ•„์ˆ˜

์ด๋ฒคํŠธ ๊ณ ์œ  ์‹๋ณ„์ž(UUID). ์žฌ์‹œ๋„ ์‹œ์—๋„ ๋™์ผ โ€” ์ค‘๋ณต ์ˆ˜์‹  ์ œ๊ฑฐ(dedupe) ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์„ธ์š”

eventType

Enum

ํ•„์ˆ˜

์ด๋ฒคํŠธ ์ข…๋ฅ˜ (์•„๋ž˜ ๋ชฉ๋ก 8์ข… ์ค‘ ํ•˜๋‚˜, ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐœ์†ก์˜ WEBHOOK_TEST)

occurredAt

String

ํ•„์ˆ˜

์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ๊ฐ. ํ•ญ์ƒ UTC๋กœ ๋ณด๋‚ด๋ฉฐ Z๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค (์˜ˆ: 2026-07-24T01:15:30Z). ๋กœ์ปฌ ์‹œ๊ฐ„๋Œ€๊ฐ€ ํ•„์š”ํ•˜๋ฉด ์ˆ˜์‹  ์ธก์—์„œ ๋ณ€ํ™˜ํ•˜์„ธ์š”

workspaceId

Integer

ํ•„์ˆ˜

์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ณ ์œ  id ๊ฐ’์ž…๋‹ˆ๋‹ค

data

Object

ํ•„์ˆ˜

์ด๋ฒคํŠธ๋ณ„ ์ƒ์„ธ payload (๊ฐ ์ด๋ฒคํŠธ ๋ฌธ์„œ ์ฐธ์กฐ)

๊ณตํ†ต ์˜ˆ์‹œ

JSON

์•Œ ์ˆ˜ ์—†๋Š” eventType์€ ๋ฌด์‹œํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์„ธ์š”.

ํ…Œ์ŠคํŠธ ๋ฐœ์†ก(WEBHOOK_TEST)๊ณผ ์•ž์œผ๋กœ ์ถ”๊ฐ€๋  ์ด๋ฒคํŠธ๊ฐ€ ๊ฐ™์€ endpoint๋กœ ๋„์ฐฉํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ฅด๋Š” ์ข…๋ฅ˜๋ฅผ ์˜ค๋ฅ˜๋กœ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ƒˆ ์ด๋ฒคํŠธ๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ์ˆ˜์‹ ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

data์˜ ํ•„๋“œ๋Š” ๊ฐ’์ด ์—†์œผ๋ฉด ํ‚ค ์ž์ฒด๊ฐ€ ๋น ์ง‘๋‹ˆ๋‹ค. ํ•ญ์ƒ ์กด์žฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ง€ ๋ง๊ณ  ์—†์„ ๋•Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜์„ธ์š”.

Open API ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•ด์ฃผ์„ธ์š”.

๋“ฑ๋กํ•œ endpoint๋กœ POST ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

ํ—ค๋”

๊ฐ’

์„ค๋ช…

Content-Type

application/json

X-Greeting-Event-Id

์ด๋ฒคํŠธ ๊ณ ์œ  id

๋ณธ๋ฌธ์˜ eventId์™€ ๊ฐ™์€ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ค‘๋ณต ์ œ๊ฑฐ์šฉ

X-Greeting-Signature

sha256 <hex>

HMAC-SHA256 ์„œ๋ช… (์•„๋ž˜ ์ฐธ์กฐ)

๊ทœ์น™

๋‚ด์šฉ

์„ฑ๊ณต = HTTP 2xx

๊ทธ ์™ธ ์‘๋‹ตยทํƒ€์ž„์•„์›ƒยท๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜๋Š” ๋ชจ๋‘ ์‹คํŒจ๋กœ ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค

10์ดˆ ์•ˆ์— ์‘๋‹ต

10์ดˆ ๋‚ด์— ์‘๋‹ต์ด ์—†์œผ๋ฉด ์‹คํŒจ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค

๋จผ์ € ๋ฐ›๊ณ , ๋‚˜์ค‘์— ์ฒ˜๋ฆฌ

๋ฌด๊ฑฐ์šด ์ž‘์—…(์™ธ๋ถ€ API ํ˜ธ์ถœ, DB ๋Œ€๋Ÿ‰ ๊ฐฑ์‹  ๋“ฑ)์€ ํ์— ๋„ฃ๊ณ  ์ฆ‰์‹œ 2xx๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”. ์ฒ˜๋ฆฌ๋ฅผ ๋๋‚ธ ๋’ค ์‘๋‹ตํ•˜๋ฉด ๋ถˆํ•„์š”ํ•œ ์žฌ์‹œ๋„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค

์‹คํŒจ ์‹œ ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„๋กœ ์ตœ๋Œ€ 7ํšŒ(๋ˆ„์  ์•ฝ 15์‹œ๊ฐ„) ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

์‹œ๋„

1ํšŒ

2ํšŒ

3ํšŒ

4ํšŒ

5ํšŒ

6ํšŒ

7ํšŒ

์ง์ „ ์‹คํŒจ ํ›„ ๋Œ€๊ธฐ

์ฆ‰์‹œ

1๋ถ„

15๋ถ„

1์‹œ๊ฐ„

2์‹œ๊ฐ„

4์‹œ๊ฐ„

8์‹œ๊ฐ„

์‘๋‹ต ์ฝ”๋“œ์— ๋”ฐ๋ผ ๋™์ž‘์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์‘๋‹ต

๋™์ž‘

์ด์œ 

2xx

์„ฑ๊ณต, ์ข…๋ฃŒ

โ€”

400 401 403 404 405 410 422

2ํšŒ์—์„œ ์กฐ๊ธฐ ์ข…๋ฃŒ

๋‹ค์‹œ ๋ณด๋‚ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์€ ์ˆ˜์‹  URLยท์ธ์ฆยท๊ตฌํ˜„ ์„ค์ • ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์„ค์ •์„ ํ™•์ธํ•˜์„ธ์š”

408 429 5xx, ๋ฌด์‘๋‹ตยทํƒ€์ž„์•„์›ƒ

์ „์ฒด 7ํšŒ ์ผ์ •๋Œ€๋กœ ์žฌ์‹œ๋„

์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ํ’€๋ฆด ์ˆ˜ ์žˆ๋Š” ์ผ์‹œ์  ์žฅ์• ๋กœ ๋ด…๋‹ˆ๋‹ค

์—ฐ์† ์‹คํŒจ๊ฐ€ 7ํšŒ์— ์ด๋ฅด๋ฉด ํ•ด๋‹น ์›นํ›…์ด ์ž๋™์œผ๋กœ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

  • ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ค์ •์—์„œ ์ค‘๋‹จ ์ƒํƒœ์™€ ์ตœ๊ทผ ์‹คํŒจ ์›์ธ(์‘๋‹ต ์ฝ”๋“œยท์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€ยท์‹œ๊ฐ)์„ ํ™•์ธํ•˜๊ณ , ์›์ธ ํ•ด๊ฒฐ ํ›„ ์žฌํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•œ ๋ฒˆ์ด๋ผ๋„ ์„ฑ๊ณตํ•˜๋ฉด ์—ฐ์† ์‹คํŒจ ์นด์šดํŠธ๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

  • ํ”Œ๋žœ ์ œํ•œ์œผ๋กœ ์ค‘๋‹จ๋œ ์›นํ›…์€ ํ™”๋ฉด์—์„œ ์žฌํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, Business ํ”Œ๋žœ์œผ๋กœ ์ „ํ™˜ํ•˜๋ฉด ์ž๋™ ๋ณต๊ตฌ๋ฉ๋‹ˆ๋‹ค.

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

๊ฐ™์€ ์ง€์›์ž์˜ ์ด๋ฒคํŠธ๋Š” ๋ฐœ์ƒ ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.

  • ์•ž์„  ์ด๋ฒคํŠธ ์ „๋‹ฌ์ด ์‹คํŒจํ•˜๋ฉด ์žฌ์‹œ๋„๊ฐ€ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ทธ ์ง€์›์ž์˜ ๋‹ค์Œ ์ด๋ฒคํŠธ๋Š” ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ง€์›์ž์—๋Š” ์˜ํ–ฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

  • ๋‹จ, ์žฌ์‹œ๋„๊ฐ€ ๋ชจ๋‘ ์†Œ์ง„๋˜๋ฉด ๋‹ค์Œ ์ด๋ฒคํŠธ๋กœ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ ๊ทธ ์‹œ์ ์—๋Š” ์ˆœ์„œ๊ฐ€ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ™์€ ์ด๋ฒคํŠธ๊ฐ€ ๋‘ ๋ฒˆ ์ด์ƒ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ˆ˜์‹  ์ธก 2xx๊ฐ€ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋กœ ๊ทธ๋ฆฌํŒ…์— ๋‹ฟ์ง€ ๋ชปํ•˜๋ฉด ์žฌ์ „์†ก๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. eventId๋กœ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜์„ธ์š”.

Plaintext
if seen.exists(event["eventId"]):
    return "", 200          # ์ด๋ฏธ ์ฒ˜๋ฆฌํ•จ โ€” ์„ฑ๊ณต์œผ๋กœ ์‘๋‹ต
seen.put(event["eventId"])  # ์ฒ˜๋ฆฌ ํ›„ ๊ธฐ๋ก
process(event)

๋ฐœ์ƒ ํ›„ 24์‹œ๊ฐ„์ด ์ง€๋‚œ ์ด๋ฒคํŠธ๋Š” Push๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ ์ƒํƒœ๊ฐ€ ๋’ค๋Šฆ๊ฒŒ ๋„์ฐฉํ•˜๋ฉด ์ˆ˜์‹  ์ธก ์ž๋™ํ™”๊ฐ€ ๊ณผ๊ฑฐ ์ƒํƒœ๋กœ ๋˜๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ์ด๋ฒคํŠธ๋Š” Pull(Event Feed)๋กœ๋Š” ๊ทธ๋Œ€๋กœ ์กฐํšŒ๋ฉ๋‹ˆ๋‹ค.

ํ•ฉ๊ฒฉ ์ฒ˜๋ฆฌ ์‹œ APPLICANT_PROCESS_MOVED(movedType: PASS)์™€ APPLICANT_PASSED๊ฐ€ ํ•จ๊ป˜ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

ํ•ฉ๊ฒฉ ์ทจ์†Œ๋„ APPLICANT_PROCESS_MOVED(movedType: PASS_CANCELED) + APPLICANT_PASS_REVOKED 2๊ฑด์ž…๋‹ˆ๋‹ค.

์ค‘๋ณต์ด ์•„๋‹ˆ๋ผ ๋ณ„๊ฐœ ์ด๋ฒคํŠธ์ด๋ฏ€๋กœ ๋‘ ์ข…๋ฅ˜๋ฅผ ๋ชจ๋‘ ๊ตฌ๋…ํ•œ ๊ฒฝ์šฐ ๊ฐ๊ฐ ์ฒ˜๋ฆฌํ•˜์„ธ์š”. ํ•œ ๋ฒˆ๋งŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๊ตฌ๋…ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ „์†ก ์œ„ยท๋ณ€์กฐ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก, ์›นํ›… ๊ตฌ๋…๋งˆ๋‹ค ์„œ๋ช… secret์ด ๋ฐœ๊ธ‰๋˜๊ณ  ๋ชจ๋“  ์š”์ฒญ์— ์„œ๋ช…์ด ์ฒจ๋ถ€๋ฉ๋‹ˆ๋‹ค.

๊ฒ€์ฆ์€ ์„ ํƒ์ด๋ฏ€๋กœ ๋ถˆํ•„์š”์‹œ ์ธ์ฆ์„ ๋ฌด์‹œํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ—ค๋” ํ˜•์‹: X-Greeting-Signature: sha256 <hex_digest> - sha256๊ณผ hex ์‚ฌ์ด๋Š” ๊ณต๋ฐฑ์ž…๋‹ˆ๋‹ค.

  • ๊ณ„์‚ฐ์‹: HMAC_SHA256(secret, ์š”์ฒญ raw body)๋ฅผ ์†Œ๋ฌธ์ž hex๋กœ

  • ๋ฐ˜๋“œ์‹œ ํŒŒ์‹ฑ ์ „ raw body ๋ฐ”์ดํŠธ๋กœ ๊ฒ€์ฆํ•˜์„ธ์š”. ํŒŒ์‹ฑ ํ›„ ์žฌ์ง๋ ฌํ™”ํ•˜๋ฉด ๊ณต๋ฐฑยทํ•„๋“œ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ ธ ์„œ๋ช…์ด ์ผ์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • secret์€ whsec_๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์›นํ›…๋งˆ๋‹ค ์„œ๋กœ ๋‹ค๋ฅธ secret์ด ๋ฐœ๊ธ‰๋˜๋ฏ€๋กœ, ์ˆ˜์‹  URL์ด ๊ฐ™๋”๋ผ๋„ ๊ฐ๊ฐ์˜ secret์œผ๋กœ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜์‚ฌ์ฝ”๋“œ

Groovy

Node.js (Express)

JavaScript

Python (Flask)

Python

Java (Spring Boot)

Java

secret์€ ์›นํ›… ์ƒ์„ฑยท์žฌ๋ฐœ๊ธ‰ ์‹œ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์ „์ฒด๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, ์ดํ›„์—๋Š” ๋งˆ์Šคํ‚น๋œ ๊ฐ’๋งŒ ์กฐํšŒ๋ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๊ณณ(ํ™˜๊ฒฝ๋ณ€์ˆ˜ยท๋น„๋ฐ€ ์ €์žฅ์†Œ)์— ๋ณด๊ด€ํ•˜์„ธ์š”.์žฌ๋ฐœ๊ธ‰ ์‹œ ์ด์ „ secret์€ ์ฆ‰์‹œ ๋ฌดํšจํ™”๋˜๋ฏ€๋กœ, ์ˆ˜์‹  ์„œ๋ฒ„์˜ secret์„ ๊ต์ฒดํ•˜๊ธฐ ์ „๊นŒ์ง€ ์„œ๋ช… ๊ฒ€์ฆ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์ค‘๋‹จ์œผ๋กœ ๊ต์ฒดํ•˜๋ ค๋ฉด ๋‘ ๊ฐ’์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•˜๋„๋ก ์ˆ˜์‹  ์„œ๋ฒ„๋ฅผ ๋จผ์ € ๋ฐฐํฌํ•œ ๋’ค ์žฌ๋ฐœ๊ธ‰ํ•˜๊ณ , ์ดํ›„ ์˜› ๊ฐ’์„ ์ œ๊ฑฐํ•˜์„ธ์š”.

์„ค์ • ํ™”๋ฉด์—์„œ ํ…Œ์ŠคํŠธ ๋ฐœ์†ก์„ ๋ˆŒ๋Ÿฌ ์ˆ˜์‹  URL ์—ฐ๊ฒฐ๊ณผ ์„œ๋ช… ๊ฒ€์ฆ์„ ์ฆ‰์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‘๋‹ต ์ฝ”๋“œ๊ฐ€ ๊ทธ ์ž๋ฆฌ์—์„œ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ

๋‚ด์šฉ

eventType

WEBHOOK_TEST โ€” 8์ข… ์ด๋ฒคํŠธ์™€ ๊ตฌ๋ถ„๋˜๋Š” ์ „์šฉ ๊ฐ’์ž…๋‹ˆ๋‹ค

์„œ๋ช…

์‹ค์ œ ๋ฐœ์†ก๊ณผ ๋™์ผํ•˜๊ฒŒ ์ฒจ๋ถ€๋ฉ๋‹ˆ๋‹ค (์„œ๋ช… ๊ฒ€์ฆ ๋กœ์ง์„ ๊ทธ๋Œ€๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค)

๋ฐ์ดํ„ฐ

์ง€์›์žยทํ‰๊ฐ€ ์‹๋ณ„์ž๋ฅผ ๋‹ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐํšŒ API๋กœ ์ด์–ด์งˆ ๊ฐ’์ด ์—†์Šต๋‹ˆ๋‹ค

์ด๋ ฅ

์ด๋ฒคํŠธ๋กœ ์ ์žฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค โ€” Pull(Event Feed)์—์„œ ์กฐํšŒ๋˜์ง€ ์•Š๊ณ  ์žฌ์‹œ๋„ยท์‹คํŒจ ์ง‘๊ณ„์—๋„ ์žกํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค

๋น„ํ™œ์„ฑ ์›นํ›…

๊บผ์ ธ ์žˆ๊ฑฐ๋‚˜ ์ค‘๋‹จ๋œ ์›นํ›…๋„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ณ ์นœ ๋’ค ํ™•์ธํ•˜๋Š” ์šฉ๋„)

์„ค์ • ๋ฐ˜์˜

์„ค์ • ๋ณ€๊ฒฝ์ด ๋ฐ˜์˜๋˜๊ธฐ๊นŒ์ง€ ์ตœ๋Œ€ 30์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์ง€๋งŒ, ํ…Œ์ŠคํŠธ ๋ฐœ์†ก์€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์ „์†ก๋ฉ๋‹ˆ๋‹ค

์˜ˆ์‹œ

JSON

ํ…Œ์ŠคํŠธ ๋ฐœ์†ก์€ ์—ฐ๊ฒฐยท์„œ๋ช… ํ™•์ธ์šฉ์ž…๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ๋ณ„ payload ํŒŒ์‹ฑ๊นŒ์ง€ ๊ฒ€์ฆํ•˜๋ ค๋ฉด ๊ฐœ๋ฐœ์šฉ ๊ณต๊ณ ์— ์‹ค์ œ ์ง€์›์ž๋ฅผ ๋“ฑ๋กํ•ด ์‹ค์ œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„๋ณด์„ธ์š”.

  • ์›Œํฌ์ŠคํŽ˜์ด์Šค ์„ค์ • > ์›นํ›… ํŽ˜์ด์ง€์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  • ๊ตฌ๋… 1๊ฑด = ์ด๋ฆ„ + ์ˆ˜์‹  URL + secret + ๊ตฌ๋…ํ•  ์ด๋ฒคํŠธ ์ง‘ํ•ฉ. ํ•˜๋‚˜์˜ URL๋กœ ์—ฌ๋Ÿฌ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๊ณ , ์ˆ˜์‹  ์ธก์—์„œ eventType์œผ๋กœ ๋ถ„๊ธฐํ•ฉ๋‹ˆ๋‹ค.

  • ์ˆ˜์‹  URL์€ https๋งŒ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์›Œํฌ์ŠคํŽ˜์ด์Šค๋‹น ์ตœ๋Œ€ 5๊ฐœ๊นŒ์ง€ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.

  • ์›นํ›…๋งˆ๋‹ค on/off ํ† ๊ธ€๋กœ ์ผœ๊ณ  ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ™์€ ์ด๋ฒคํŠธ๋ฅผ ์—ฌ๋Ÿฌ ์›นํ›…์ด ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(fan-out). ๊ฐ ์›นํ›…์€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐœ์†กยท์žฌ์‹œ๋„ยท์ˆœ์„œ ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค.

  • ์„ค์ • ๋ณ€๊ฒฝ์€ ๋ฐ˜์˜๊นŒ์ง€ ์ตœ๋Œ€ 30์ดˆ๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Pull(Event Feed)๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์‹  URL ๋“ฑ๋ก ์—†์ด read:events ์Šค์ฝ”ํ”„ Open API ํ‚ค๋งŒ์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ • ํŽ˜์ด์ง€์—์„œ ํ˜„์žฌ ์ˆ˜์ง‘ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ด€๋ฆฌ ๊ถŒํ•œ: ์›Œํฌ์ŠคํŽ˜์ด์Šค์˜ ์™ธ๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค ๊ด€๋ฆฌ ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ œ๊ณต ์—ญํ•  ์ค‘ ์†Œ์œ ์žยท๊ด€๋ฆฌ์ž๊ฐ€ ์ด ๊ถŒํ•œ์„ ๊ฐ€์ง€๋ฉฐ, ์ผ๋ฐ˜ ๋ฉค๋ฒ„์—๊ฒŒ๋Š” ์—†์Šต๋‹ˆ๋‹ค. Open API ํ‚ค ๊ด€๋ฆฌ์™€ ๊ฐ™์€ ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์€ "์›นํ›… 1๊ฐœ์— ์ „์ฒด ์ด๋ฒคํŠธ"๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์šฉ๋„๊ฐ€ ํ™•์‹คํžˆ ๋‹ค๋ฅผ ๋•Œ๋งŒ ๋‚˜๋ˆ„์„ธ์š”(์˜ˆ: ํ•ฉ๊ฒฉ โ†’ ์ธ์‚ฌ์‹œ์Šคํ…œ, ์ง€์›์ž ๋“ฑ๋ก โ†’ ์Šฌ๋ž™).์ง์„ ์ด๋ฃจ๋Š” ์ด๋ฒคํŠธ๋Š” ๊ฐ™์€ ์›นํ›…์— ๋ฌถ์œผ์„ธ์š”. ํ•ฉ๊ฒฉ(APPLICANT_PASSED)๊ณผ ํ•ฉ๊ฒฉ ์ทจ์†Œ(APPLICANT_PASS_REVOKED), ๋ถˆํ•ฉ๊ฒฉ(APPLICANT_REJECTED)๊ณผ ๋ถˆํ•ฉ๊ฒฉ ์ทจ์†Œ(APPLICANT_REJECTION_REVOKED)๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ์›นํ›…์œผ๋กœ ๊ฐˆ๋ผ ๋†“์œผ๋ฉด, ํ•œ์ชฝ๋งŒ ์‹คํŒจํ–ˆ์„ ๋•Œ ์ˆ˜์‹  ์‹œ์Šคํ…œ์˜ ์ง€์›์ž ์ƒํƒœ๊ฐ€ ์‹ค์ œ์™€ ์–ด๊ธ‹๋‚ฉ๋‹ˆ๋‹ค.

์ƒํ™ฉ

๊ฒฐ๊ณผ

Business โ†’ ํ•˜์œ„ ํ”Œ๋žœ / ํ•ด์ง€

๋ชจ๋“  ์›นํ›…์ด ์ž๋™ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.์„ค์ • ์ž์ฒด๋Š” ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค

ํ•˜์œ„ ํ”Œ๋žœ โ†’ Business

์ž๋™์œผ๋กœ ์žฌ๊ฐœ๋ฉ๋‹ˆ๋‹ค. ์ค‘๋‹จ ์ „์— ์ผœ์ ธ ์žˆ๋˜ ์›นํ›…๋งŒ ๋‹ค์‹œ ์ผœ์ง‘๋‹ˆ๋‹ค

์‹ ๊ทœ ์›นํ›… ๋„์ž… ์ „์— ๋“ฑ๋ก๋œ ํ•ฉ๊ฒฉ์ž ์›นํ›…์€ ๋‹น๋ถ„๊ฐ„ ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, ์„ค์ • ํ™”๋ฉด์—์„œ ์ถ”๊ฐ€ยท์ˆ˜์ •์€ ์ œ๊ณต๋˜์ง€ ์•Š๊ณ  ์‚ญ์ œ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ช…ยท์žฌ์‹œ๋„ยท์ƒํƒœ ๊ด€๋ฆฌ๊ฐ€ ์—†๊ณ  payload ํ˜•์‹๋„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

  • ์ƒˆ ์›นํ›…(APPLICANT_PASSED)์œผ๋กœ ์ „ํ™˜ํ•œ ๋’ค ์ด์ „ ๋ฐฉ์‹ ์›นํ›…์„ ์‚ญ์ œํ•˜์„ธ์š”. ๋‘ ๋ฐฉ์‹์ด ๋™์‹œ์— ๋™์ž‘ํ•˜๋ฉด ํ•ฉ๊ฒฉ ์•Œ๋ฆผ์„ ์ค‘๋ณต ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ์‹์€ eventId๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š์•„ ์ž๋™์œผ๋กœ ๊ฑธ๋Ÿฌ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ

๊ฐ’

์š”๊ธˆ์ œ

Business ํ”Œ๋žœ ์ „์šฉ

์›Œํฌ์ŠคํŽ˜์ด์Šค๋‹น ์›นํ›… ์ˆ˜

์ตœ๋Œ€ 5๊ฐœ

์ˆ˜์‹  URL

https ์ „์šฉ

์ˆ˜์‹  ์„œ๋ฒ„ ์‘๋‹ต ์ œํ•œ ์‹œ๊ฐ„

10์ดˆ

์„ฑ๊ณต ํŒ์ •

HTTP 2xx

์žฌ์‹œ๋„

์ตœ๋Œ€ 7ํšŒ (์•ฝ 15์‹œ๊ฐ„). ์žฌ์‹œ๋„ ๋ฌด์˜๋ฏธํ•œ 4xx๋Š” 2ํšŒ

์ž๋™ ๋น„ํ™œ์„ฑํ™”

์—ฐ์† 7ํšŒ ์‹คํŒจ

Push ์‹œํšจ

๋ฐœ์ƒ ํ›„ 24์‹œ๊ฐ„ (์ดˆ๊ณผ ์‹œ Pull๋กœ๋งŒ ์ œ๊ณต)

์ด๋ฒคํŠธ ๋ณด๊ด€ ๊ธฐ๊ฐ„

7์ผ

Event Feed ํŽ˜์ด์ง€ ํฌ๊ธฐ

๊ธฐ๋ณธ 50, ์ตœ๋Œ€ 100

์„ค์ • ๋ฐ˜์˜ ์ง€์—ฐ

์ตœ๋Œ€ 30์ดˆ (ํ…Œ์ŠคํŠธ ๋ฐœ์†ก์€ ์ฆ‰์‹œ)

์ „๋‹ฌ ๋ณด์žฅ

at-least-once (์ค‘๋ณต ๊ฐ€๋Šฅ, eventId๋กœ ์ œ๊ฑฐ)

์ˆœ์„œ ๋ณด์žฅ

๊ฐ™์€ ์ง€์›์ž ๋‹จ์œ„

๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ ์†Œ๊ธ‰ ์ œ๊ณต

์ง€์›ํ•˜์ง€ ์•Š์Œ (์„ค์ • ์‹œ์  ์ดํ›„๋งŒ)