멱등성이란 무엇인가요?

컴퓨터 과학에서 멱등성은 작업을 여러 번 적용해도 한 번만 적용했을 때와 동일한 최종 효과를 얻을 수 있는 작업의 속성입니다. 동일한 요청을 서버에 5번 보내면 멱등 시스템은 첫 번째 시도가 성공한 후 서버의 결과가 변경되지 않도록 보장합니다.

동일한 결과를 보장하는 것 외에도 멱등 연산의 핵심 특성은 추가 호출로 인해 부작용이 발생하지 않는다는 것입니다. 이는 간헐적인 네트워크 중단 또는 시간 초과로 인해 클라이언트가 동일한 메시지를 두 번 이상 전송할 수 있는 복원력 있는 분산 시스템을 빌드하기 위한 핵심 요구사항입니다.

비유: 엘리베이터의 '위' 버튼을 생각해 보세요. 버튼을 한 번 누르면 엘리베이터가 해당 층으로 호출됩니다. 기다리는 동안 10번 더 눌러도 결과는 마찬가지입니다. 엘리베이터는 한 대만 도착합니다. 버튼을 여러 번 누른다고 해서 엘리베이터가 10대나 오는 것은 아닙니다. 반대로 디지털 장바구니에 항목을 추가하는 것은 일반적으로 멱등성이 아닙니다. '장바구니에 추가' 버튼을 5번 클릭하면 장바구니에 해당 상품이 5개 담기게 됩니다.

멱등 시스템의 주요 이점

제한 시간 초과 또는 연결 중단 후에도 작업 중복(예: 신용카드 이중 청구)을 걱정할 필요 없이 안전하게 요청을 재시도할 수 있습니다.

사용자는 이전 요청이 성공했는지 알기 위해 복잡한 상태 추적을 할 필요가 없습니다. 단순히 '성공할 때까지 재시도'하면 됩니다.

분산 시스템은 로그를 재생하거나 누락된 메시지를 다시 전송하여 데이터 손상 없이 비정상 종료로부터 복구할 수 있습니다.

멱등성 HTTP 메서드와 비멱등성 HTTP 메서드 비교

REST 표준은 다양한 유형의 웹 요청이 어떻게 동작해야 하는지 정의합니다. 일부 HTTP 메서드는 설계상 자연스럽게 '안전'하거나 멱등성을 갖습니다. 즉, 사양에서는 반복되더라도 예측 가능한 방식으로 동작할 것으로 기대합니다. 일부는 새로운 데이터를 생성하도록 설계되었으며 재시도 시 안전하게 작동하도록 특별히 주의해야 합니다.

멱등적 메서드(GET, PUT, DELETE)

RFC 9110에 따르면 여러 표준 메서드는 본질적으로 멱등성을 갖습니다. 이러한 작업을 반복해도 초기 요청 이후의 서버 상태가 변경되지 않아야 합니다.

  • GET: 이 메서드는 데이터를 검색합니다. 서버에서 아무것도 변경하지 않으므로 백만 번 호출해도 리소스는 동일하게 유지됩니다.
  • PUT: 이 메서드는 리소스를 완전히 대체합니다. 사용자의 이메일을 'user@example.com'으로 세 번 업데이트하면 최종 상태는 여전히 이메일이 'user@example.com'인 것입니다.
  • DELETE: 리소스를 삭제합니다. '주문 #123'을 삭제한 다음 다시 삭제하려고 하면 주문이 삭제된 상태로 유지됩니다. 결과(주문이 사라짐)는 동일하게 유지됩니다.

멱등성이 없는 메서드(POST, PATCH)

일부 메서드는 기본 작업이 새로운 것을 만들거나 기존 레코드의 일부를 수정하는 방식으로 데이터를 변경하는 것이므로 비멱등적입니다.

  • POST: 개발자는 POST를 사용하여 새 리소스를 만듭니다. 멱등성 로직이 없으면 동일한 POST 요청('결제 제출' 등)을 두 번 전송하면 일반적으로 두 개의 별도 레코드가 생성되고 고객에게 두 번 청구됩니다.
  • PATCH: 이 메서드는 부분 업데이트를 적용합니다. 멱등성으로 만들 수 있지만, '잔액에 5를 더한다'와 같은 상대적 변경을 반복하면 호출될 때마다 최종 값이 달라지기 때문에 기본적으로 멱등성이 아닌 경우가 많습니다.

멱등 API를 구현하는 방법

  1. 고유한 키 생성: 클라이언트가 고유한 문자열(예: UUID)을 생성하여 커스텀 HTTP 헤더에 포함합니다.
  2. 가로채기 및 검증: 서버는 Memorystore와 같은 고속 데이터 스토어를 확인하여 해당 키가 최근에 처리되었는지 확인합니다.
  3. 상태 처리: 키가 새로운 경우 요청을 처리하고 결과를 저장합니다. 중복된 경우 비즈니스 로직을 다시 실행하지 않고 저장된 결과를 즉시 반환합니다.

멱등성의 일반적인 사용 사례

멱등성은 빌드하는 시스템에서 종종 필요합니다. 어떤 경우에는 자동으로 처리되지만, 다른 경우에는 개발자가 직접 조치를 취해야 합니다.

가장 유명한 예는 '이중 청구' 문제입니다. 사용자가 항공편을 결제하는 동안 브라우저가 멈추면 '결제'를 다시 클릭할 수 있습니다. 멱등 키를 사용하는 결제 API는 두 번째 클릭을 재시도로 인식합니다. 이를 통해 고객의 은행 계좌를 보호하고 중복 거래에 대한 환불을 처리하는 운영 비용을 절감할 수 있습니다.

  • 개발자 조치 필요: API 요청에 멱등 키(대개 UUID)를 구현하여 두 번째 클릭이 재시도로 인식되도록 하고 고객의 은행 계좌를 보호해야 합니다.

Terraform 및 Ansible과 같은 도구는 멱등성에 의존합니다. '10GB 스토리지 버킷 만들기' 스크립트를 실행하면 도구가 클라우드의 현재 상태를 확인합니다.

  • 자동 처리: IaC 도구 자체에서 멱등성을 관리하므로 개발자는 중복 리소스를 방지하기 위해 추가 로직을 작성할 필요가 없습니다.

최신 웹 API는 개발자가 더 강력한 통합을 빌드할 수 있도록 멱등 키 헤더(현재 표준화된 IETF 초안)를 구현하는 경우가 많습니다.

  • 개발자 조치 필요: 백엔드를 빌드할 때 이러한 키를 가로채고, 이전 시도를 확인하고, 캐시된 응답을 반환하는 로직을 구현해야 합니다.

'업서트'(업데이트 또는 삽입)는 고전적인 멱등 데이터베이스 작업입니다. 단순한 '삽입' 대신, 업서트에서는 '이 레코드가 있으면 업데이트하고, 없으면 생성합니다.'라고 말합니다.

  • 자동 처리: 이 로직은 데이터베이스 엔진에서 기본적으로 처리되므로 스크립트가 몇 번 실행되든 레코드가 올바른 상태로 수렴됩니다.

Google Cloud로 비즈니스 문제 해결

신규 고객에게는 Google Cloud에서 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
Google Cloud 영업 전문가와 고유한 문제에 대해 자세히 논의해 보세요.

Google Cloud에서 안정적인 마이크로서비스 빌드하기

Google Cloud는 개발자가 이러한 패턴을 더 쉽게 구현할 수 있도록 여러 도구를 제공합니다. 관리형 플랫폼을 기반으로 빌드하면 데이터를 안전하게 유지하기 위해 작성해야 하는 '상용구' 코드의 양이 줄어듭니다.

  • Cloud Run: Cloud Run을 사용하여 Pub/Sub의 이벤트를 처리할 때 Pub/Sub는 기본적으로 메시지를 두 번 이상 전송할 수 있다는 점을 기억하세요. AI 에이전트 또는 데이터 파이프라인이 동일한 이벤트를 두 번 처리하지 않도록 하려면 Cloud Run 서비스에 멱등성 코드를 작성해야 합니다.
  • Pub/Sub 관련 참고사항: 기본값은 푸시 기반 전송이지만 풀 기반 구독에는 1회만 전송이 제공됩니다. 이 두 가지 유형을 알고 있으면 서비스에 적합한 수준의 복잡성을 선택하는 데 도움이 됩니다.

빌드할 준비가 되셨나요?

지금 바로 Cloud Run에 복원력 있고 멱등성 있는 서비스를 배포하는 방법을 알아보세요.

Google Cloud