About idempotent

 이번글에서는 프로그래밍에서 멱등성에 대해 정리하고 실제 상황에서 어떻게 구현해야지 멱등성을 달성할 수 있는지 작성하겠다.

멱등성이란?

 영어로는 idempotent. 사전적 정의로는 "연산을 여러 번 적용하더라도 결과가 최초 실행 결과가 그대로 보존되는 성질을 의미" 이다.

실제 서비스에서 일어날 수 있는 상황에 멱등성을 통해서 해결해보자. 

고객이 아마존이나 쿠팡에서 상품을 구매하려고 한다. 고객은 상품을 구매하기 위해서 결제를 해야 한다. 이 때 결제는 두 번 이상 실행되어서는 절대 안된다. 

1. 일명 "따닥" 으로 고객이 버튼을 빠르게 두 번 클릭하는 상황이 발생할 수 있다.
2. 고객이 첫번째 결제 요청을 하고 실제로 결제가 처리되었지만 네트워크 오류로 응답이 전달되지 못하여 고객이 버튼을 다시 클릭하는 상황이 발생할 수 있다.

 만 원을 결제했는데, 실제 2만원이 결제되는 최악의 상황은 발생하지 않아야 한다. 

데이터베이스 고유 키 제약조건 (unique key constraint) 

1. 결제 요청을 받으면 테이블에 새 레코드를 넣으려고 시도한다.
2-1. 새 레코드 추가에 성공했다면 이전에 처리한 적이 없는 결제 요청이다.
2-2. 새 레코드 추가에 실패했다면 이전에 받은 적이 있는 결제 요청이다. 이러한 중복 요청은 처리하지 않는다.

일회성 토큰 Nonce(Number used Only Once)

UUID 또는 timestamp 와 같은 값을 사용하여 정확히 한 번만 사용할 수 있는 장치를 마련한다. 행위에 대한 혹은 도메인(결제)에 대한 식별자 역할을 한다. 이미 처리된 동일한 Nonce 값이 들어온 경우 중복 요청으로 간주하고 처리하지 않는다. 이 때 한 가지 고려할 점은 이 값을 서버에서 제공하여 일회용 토큰으로써 사용하는 것이다. 클라이언트에서 값을 받는것은 언제든지 위조 될 수 있기 때문이다.


간단한 예제 코드

UUID 일회용 결제 토큰을 Redis 를 활용하여 사용 여부를 관리하여, 중복 결제 처리를 방지한다. 





참고

https://developer.mozilla.org/ko/docs/Glossary/Idempotent

https://stripe.com/docs/api/idempotent_requests

https://developer.paypal.com/api/rest/reference/idempotency/

댓글

이 블로그의 인기 게시물

About JVM Warm up

About Kafka Basic

About ZGC

sneak peek jitpack

Spring Boot Actuator readiness, liveness probes on k8s

About Websocket minimize data size and data transfer cost on cloud

About G1 GC

대학생 코딩 과제 대행 java, python, oracle 네 번째