Restful: ๋ฉฑ๋“ฑ์„ฑ ํ‚ค(Idempotency-Key)

๋ฉฑ๋“ฑ์„ฑ(Idempotency)์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ˆ˜ํ•™์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์ธ๋ฐ, ์›น ์‹œ์Šคํ…œ์—์„œ๋„ ์“ด๋‹ค. ๊ฐ™์€ ์—ฐ์‚ฐ์„ ์—ฌ๋Ÿฌ๋ฒˆ ํ•˜๋”๋ผ๋„ ์ƒํƒœ๊ฐ€ ๋‹ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

์ด๋ฅผํ…Œ๋ฉด Restful API์—์„œ GET ๋ฉ”์„œ๋“œ์˜ API๋Š” ์—ฌ๋Ÿฌ๋ฒˆ์„ ์‹คํ–‰ํ•˜๋”๋ผ๋„ ๊ทธ ์‘๋‹ต๊ฐ’์ด๋‚˜ ์ƒํƒœ๊ฐ’์ด ๋‹ฌ๋ผ์ง€์ง€ ์•Š์œผ๋‹ˆ ๋‹น์—ฐํžˆ ๋ฉฑ๋“ฑํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฑด ์ผ๋ถ€ ๊ฐ€๋ณ€์  Method๋“ค์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค.
PUT ๋ฉ”์„œ๋“œ์˜ API๋„ ๊ทธ๋ ‡๋‹ค. ์ด๋ฆ„์„ "John"์œผ๋กœ ์ˆ˜์ •ํ•˜๋Š” PUT API๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด, ํ•œ๋ฒˆ ํ˜ธ์ถœํ•˜๋‚˜ ๋‘๋ฒˆ ํ˜ธ์ถœํ•˜๋‚˜ ๊ฐ™์€ ๋™์ž‘์„ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฉฑ๋“ฑํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฑด ์›น ํ‘œ์ค€์—๋„ ์–ด๋А์ •๋„ ์ •์˜๊ฐ€ ๋˜์–ด์žˆ๋Š” ๋ถ€๋ถ„์ด๋‹ค.

์ฐธ์กฐ https://www.rfc-editor.org/rfc/rfc7231#section-8.1.3,
์ถœ์ฒ˜ https://docs.tosspayments.com/guides/using-api/idempotency-key
DELETE๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•œ๋ฒˆ ์‚ญ์ œํ•˜๋‚˜ ๋‘๋ฒˆ ์‚ญ์ œํ•˜๋‚˜ ๊ฐ™์•„์•ผ ํ•˜๋‹ˆ ๋ฉฑ๋“ฑํ•ด์•ผ ํ•œ๋‹ค.
๋ฐ˜๋Œ€๋กœ POST๋Š” ์‹ ๊ทœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ˆ ํ•œ๋ฒˆ ํ˜ธ์ถœํ–ˆ์„ ๋•Œ๋Š” ํ•˜๋‚˜๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ด๊ณ , ๋‘๋ฒˆ ํ˜ธ์ถœํ•˜๋ฉด ํ•˜๋‚˜๊ฐ€ ๋” ์ƒ๊ฒจ์„œ 2๊ฐœ๊ฐ€ ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉฑ๋“ฑํ•˜์ง€ ์•Š๋‹ค.




๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ

์‚ฌ์‹ค ๊ฐ™์€ API๋ฅผ ๋‘๋ฒˆ ์ด์ƒ ์˜๋Š” ๊ฒฝ์šฐ๋Š” ๊ทธ๋ ‡๊ฒŒ ์ž์ฃผ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค. ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์ด์ƒํ•˜๊ฒŒ ๋งŒ๋“ ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๋ง์ด๋‹ค.

ํ•˜์ง€๋งŒ ์–ด์ฉ”์ˆ˜ ์—†๋Š” ์žฅ์• ์ƒํ™ฉ์ด๋ž€ ๊ฒƒ๋„ ์žˆ๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถˆ์•ˆ์ •ํ•  ๊ฒฝ์šฐ์—๋Š” API๋ฅผ ์ด์„œ API๊ฐ€ ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ ์„ฑ๊ณต ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๊ทธ๊ฑธ ๋ชจ๋ฅด๊ณ  ๋‹ค์‹œ API๋ฅผ ์  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ API๋“ค์ด๋ผ๋ฉด ํฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ, ๋ญ”๊ฐ€ ๋ˆ์ด ์˜ค๊ฐ€๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์‹ฌ๊ฐํ•ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. ๋ˆ์ด 2๋ฒˆ ์†ก๊ธˆ๋œ๋‹ค๊ฑฐ๋‚˜... ํ•˜๋Š” ๋”์ฐํ•œ ์‚ฌํƒœ ๋ง์ด๋‹ค.




ํ•ด๊ฒฐ์ฑ…: ๋ฉฑ๋“ฑ์„ฑ ํ‚ค

์ด๋Ÿฐ ์œ„์˜ ๋ฌธ์ œ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜จ ๊ฐœ๋…์ด ๋ฐ”๋กœ ๋ฉฑ๋“ฑ์„ฑ ํ‚ค๋‹ค.
์ด๊ฒƒ๋„ ์›น ํ‘œ์ค€์—์„œ ์ œ์•ˆ๋œ ๋ถ€๋ถ„์ด๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ๋Š” API๋ฅผ ํ˜ธ์ถœํ• ๋•Œ "Idempotency-Key"๋ผ๋Š” ์ด๋ฆ„์˜ ํ—ค๋”๊ฐ’์— uuid ๊ฐ™์€๊ฑธ๋กœ ๋žœ๋ค ํ‚ค๊ฐ’์„ ์ƒ์„ฑํ•ด์„œ ๋ณด๋‚ธ๋‹ค.
  2. ๋ฌด์–ธ๊ฐ€ ์žฅ์• ์ƒํ™ฉ์œผ๋กœ ์ธํ•ด์„œ API๊ฐ€ ์‹คํŒจํ–ˆ์„ ๊ฒฝ์šฐ, ๋™์ผํ•œ "Idempotency-Key" ๊ฐ’์œผ๋กœ API๋ฅผ ๋‹ค์‹œ ์œ๋‹ค.
  3. ์„œ๋ฒ„๋Š” ๋™์ผํ•œ "Idempotency-Key"์œผ๋กœ ๋“ค์–ด์˜จ ์š”์ฒญ์— ๋Œ€ํ•ด์„œ, ์ฒซ๋ฒˆ์งธ๋กœ ๋“ค์–ด์˜จ API ์š”์ฒญ๋งŒ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ดํ›„์— ๋“ค์–ด์˜จ๊ฑด status 409๋ฅผ ๋˜์ง€๊ฑฐ๋‚˜ ์ด์ „์— ๋“ค์–ด์™”๋˜ ๋ฆฌ์Šคํฐ์Šค๋งŒ ๊ทธ๋Œ€๋กœ ๋Œ๋ ค์ค€๋‹ค.

์„œ๋ฒ„์—์„œ ์ด๊ฑธ ํ•˜๋ ค๋ฉด Idempotency-Key์™€ ์‘๋‹ต๊ฐ’ ์Œ์„ DB๋กœ ์ €์žฅํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ƒฅ ์บ์‹ฑ์ด๋‹ค.
๋ณดํ†ต์€ DynamoDB ๊ฐ™์€ ์ €๋ ดํ•˜๊ณ  ๊ฐ„ํŽธํ•œ Key-Value ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ์ด ๊ฐ„๋‹จํ•  ๊ฒƒ์ด๋‹ค.

์ƒํƒœ์ฝ”๋“œ๋Š” ์ด๋ ‡๊ฒŒ ์“ฐ๋ฉด ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ถœ์ฒ˜: https://docs.tosspayments.com/guides/using-api/idempotency-key



์ฐธ์กฐ
https://greenbytes.de/tech/webdav/draft-ietf-httpapi-idempotency-key-header-latest.html
https://docs.tosspayments.com/guides/using-api/idempotency-key
https://velog.io/@tosspayments/%EB%A9%B1%EB%93%B1%EC%84%B1%EC%9D%B4-%EB%AD%94%EA%B0%80%EC%9A%94
https://www.rfc-editor.org/rfc/rfc7231#section-8.1.3
https://www.berkansasmaz.com/every-programmer-should-know-idempotency/