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๋ฒ ์ก๊ธ๋๋ค๊ฑฐ๋... ํ๋ ๋์ฐํ ์ฌํ ๋ง์ด๋ค.
ํด๊ฒฐ์ฑ : ๋ฉฑ๋ฑ์ฑ ํค
์ด๋ฐ ์์ ๋ฌธ์ ์ํฉ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๊ฐ๋
์ด ๋ฐ๋ก ๋ฉฑ๋ฑ์ฑ ํค๋ค.
์ด๊ฒ๋ ์น ํ์ค์์ ์ ์๋ ๋ถ๋ถ์ด๋ค.
- ํด๋ผ์ด์ธํธ๋ API๋ฅผ ํธ์ถํ ๋ "Idempotency-Key"๋ผ๋ ์ด๋ฆ์ ํค๋๊ฐ์ uuid ๊ฐ์๊ฑธ๋ก ๋๋ค ํค๊ฐ์ ์์ฑํด์ ๋ณด๋ธ๋ค.
- ๋ฌด์ธ๊ฐ ์ฅ์ ์ํฉ์ผ๋ก ์ธํด์ API๊ฐ ์คํจํ์ ๊ฒฝ์ฐ, ๋์ผํ "Idempotency-Key" ๊ฐ์ผ๋ก API๋ฅผ ๋ค์ ์๋ค.
- ์๋ฒ๋ ๋์ผํ "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/