컴퓨터 과학에서 멱등성은 작업을 여러 번 적용해도 한 번만 적용했을 때와 동일한 최종 효과를 얻을 수 있는 작업의 속성입니다. 동일한 요청을 서버에 5번 보내면 멱등 시스템은 첫 번째 시도가 성공한 후 서버의 결과가 변경되지 않도록 보장합니다.
동일한 결과를 보장하는 것 외에도 멱등 연산의 핵심 특성은 추가 호출로 인해 부작용이 발생하지 않는다는 것입니다. 이는 간헐적인 네트워크 중단 또는 시간 초과로 인해 클라이언트가 동일한 메시지를 두 번 이상 전송할 수 있는 복원력 있는 분산 시스템을 빌드하기 위한 핵심 요구사항입니다.
비유: 엘리베이터의 '위' 버튼을 생각해 보세요. 버튼을 한 번 누르면 엘리베이터가 해당 층으로 호출됩니다. 기다리는 동안 10번 더 눌러도 결과는 마찬가지입니다. 엘리베이터는 한 대만 도착합니다. 버튼을 여러 번 누른다고 해서 엘리베이터가 10대나 오는 것은 아닙니다. 반대로 디지털 장바구니에 항목을 추가하는 것은 일반적으로 멱등성이 아닙니다. '장바구니에 추가' 버튼을 5번 클릭하면 장바구니에 해당 상품이 5개 담기게 됩니다.
제한 시간 초과 또는 연결 중단 후에도 작업 중복(예: 신용카드 이중 청구)을 걱정할 필요 없이 안전하게 요청을 재시도할 수 있습니다.
사용자는 이전 요청이 성공했는지 알기 위해 복잡한 상태 추적을 할 필요가 없습니다. 단순히 '성공할 때까지 재시도'하면 됩니다.
분산 시스템은 로그를 재생하거나 누락된 메시지를 다시 전송하여 데이터 손상 없이 비정상 종료로부터 복구할 수 있습니다.
REST 표준은 다양한 유형의 웹 요청이 어떻게 동작해야 하는지 정의합니다. 일부 HTTP 메서드는 설계상 자연스럽게 '안전'하거나 멱등성을 갖습니다. 즉, 사양에서는 반복되더라도 예측 가능한 방식으로 동작할 것으로 기대합니다. 일부는 새로운 데이터를 생성하도록 설계되었으며 재시도 시 안전하게 작동하도록 특별히 주의해야 합니다.
RFC 9110에 따르면 여러 표준 메서드는 본질적으로 멱등성을 갖습니다. 이러한 작업을 반복해도 초기 요청 이후의 서버 상태가 변경되지 않아야 합니다.
일부 메서드는 기본 작업이 새로운 것을 만들거나 기존 레코드의 일부를 수정하는 방식으로 데이터를 변경하는 것이므로 비멱등적입니다.
멱등성은 빌드하는 시스템에서 종종 필요합니다. 어떤 경우에는 자동으로 처리되지만, 다른 경우에는 개발자가 직접 조치를 취해야 합니다.
가장 유명한 예는 '이중 청구' 문제입니다. 사용자가 항공편을 결제하는 동안 브라우저가 멈추면 '결제'를 다시 클릭할 수 있습니다. 멱등 키를 사용하는 결제 API는 두 번째 클릭을 재시도로 인식합니다. 이를 통해 고객의 은행 계좌를 보호하고 중복 거래에 대한 환불을 처리하는 운영 비용을 절감할 수 있습니다.
Terraform 및 Ansible과 같은 도구는 멱등성에 의존합니다. '10GB 스토리지 버킷 만들기' 스크립트를 실행하면 도구가 클라우드의 현재 상태를 확인합니다.
최신 웹 API는 개발자가 더 강력한 통합을 빌드할 수 있도록 멱등 키 헤더(현재 표준화된 IETF 초안)를 구현하는 경우가 많습니다.
'업서트'(업데이트 또는 삽입)는 고전적인 멱등 데이터베이스 작업입니다. 단순한 '삽입' 대신, 업서트에서는 '이 레코드가 있으면 업데이트하고, 없으면 생성합니다.'라고 말합니다.
Google Cloud는 개발자가 이러한 패턴을 더 쉽게 구현할 수 있도록 여러 도구를 제공합니다. 관리형 플랫폼을 기반으로 빌드하면 데이터를 안전하게 유지하기 위해 작성해야 하는 '상용구' 코드의 양이 줄어듭니다.