1. Question

멱등성(Idempotence)이란?

2. Answer

멱등성이란 같은 연산을 여러 번 적용해도 결과가 달라지지 않는 성질을 말한다. 예를 들어, 어떤 API를 여러 번 호출하더라도, 첫 번째 호출 이후의 결과가 변하지 않아야 멱등하다고 할 수 있다.

A. Java에서의 멱등성

Java에서 멱등성은 주로 메서드 설계에 적용된다. 예를 들어, abs() 메서드는 멱등 메서드이다. 첫 번째 abs() 호출 후에 다시 abs()를 호출해도 결과가 같기 때문이다.

int result = Math.abs(-10); // result is 10
result = Math.abs(result);  // result is still 10

B. Spring에서의 멱등성

Spring Framework는 특히 REST API를 설계할 때 멱등성이 중요하다. RESTful API에서는 다음 HTTP 메서드들이 멱등하다고 간주된다.

  • GET: 데이터를 조회하는 데 사용된다. 같은 GET 요청을 여러 번 해도 동일한 데이터를 조회해야 한다.

  • PUT: 지정된 리소스의 전체를 교체하는 데 사용된다. 동일한 PUT 요청을 여러 번 수행해도 결과는 같아야 한다.

  • DELETE: 지정된 리소스를 삭제하는 데 사용된다. 첫 번째 요청에서 리소스를 삭제한 후 같은 DELETE 요청이 영향을 주지 않아야 한다.

POST 메서드는 기본적으로 멱등하지 않다. 예를 들어, 같은 POST 요청을 여러 번 보내면 데이터가 중복 생성될 수 있다.

C. 멱등성을 확보하는 방법

  • HTTP 메서드 활용: GET, PUT, DELETE와 같이 자체적으로 멱등성을 가진 메서드 사용을 권장한다.

  • 상태 검사 로직 추가: POST 요청에 멱등성을 부여하기 위해, 서버에서는 요청을 처리하기 전에 상태를 검사하여 중복 처리를 방지할 수 있다.

  • 토큰 사용: 중복 요청을 방지하기 위해 요청 토큰을 발급하고, 서버에서는 이 토큰을 체크하여 이미 처리된 요청은 무시하도록 할 수 있다.

3. Detail

Spring에서 POST 요청의 멱등성을 확보하기 위한 구체적인 기술적 방법은 아래와 같다.

  • 요청 식별자 사용: 클라이언트는 각 POST 요청에 대해 고유한 요청 식별자(Idempotency Key)를 HTTP 헤더에 포함시켜 전송한다. 서버는 이 키를 확인하여 이미 처리된 요청인지 판단하고, 처리된 요청이면 같은 응답을 다시 반환한다. 이 방법은 주로 결제 시스템 등에서 중복 결제를 방지하기 위해 사용된다.

  • 상태 검사 로직 추가: 서버는 요청을 받을 때, 해당 요청이 실행될 특정 조건(예: 데이터베이스 내 정보)을 검사한다. 이미 조건을 만족하는 요청이 수행된 경우에는 요청을 새로 수행하지 않고, 기존 결과를 반환하거나 적절한 메시지를 응답한다. 예를 들어, 사용자 프로필 업데이트 요청에서 프로필 정보가 변경되지 않았다면 실제 데이터베이스 업데이트를 수행하지 않고, 변경 없음을 알리는 응답을 반환할 수 있다.

  • 트랜잭션과 록 사용: 데이터베이스의 트랜잭션과 lock을 활용하여 요청 처리 중에는 해당 데이터에 대한 다른 요청들이 대기하도록 한다. 이를 통해 요청 간의 간섭을 막고, 일관된 상태를 유지할 수 있다. 게시판에 글을 등록할 때, 같은 사용자가 동시에 같은 내용의 글을 등록하려고 하는 경우를 방지할 수 있다.

  • 세마포어(Semaphore) 또는 레이트 리밋팅 사용: 서버에서는 세마포어나 레이트 리밋팅 기법을 사용하여 일정 시간 동안에 받을 수 있는 요청의 수를 제한한다. 이는 네트워크 지연 등의 이유로 동일한 요청이 여러 번 들어올 경우에 유용하다. API 사용량이 많은 서비스에서 부하를 조절하거나 스팸 요청을 필터링하는 데 사용된다.

4. Reference

None

댓글남기기