[프로그래밍 용어] 멱등성(idempotent)이란?

전산학이나 수학에서 사용하는 용어로 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질, 연산을 여러 번 반복하여도 한 번만 수행된 것과 같은 성질을 의미한다. 함수 f(x)를 예를 들면 다음과 같은 등식이 성립된다. 즉 메서드가 여러 번 실행되어도, 결과는 같으므로 안전하게 사용할 수 있는 성질이기도 하다.

1
f(f(x)) = f(x)

등식으로만 처음 보면 감이 오지 않을 수 있는데 절대값을 구하기 위해 사용하는 abs() 함수가 바로 멱등성을 가지고 있다. 모든 x에 대해 abs(abs(x)) = abs(x)이기 대문이다.

수학적 정의에서 x가 객체의 상태를 나타내고, f가 해당 객체를 변경할 수 있는 연산이라는 점을 고려해보자. 예를 들어, 파이썬의 set이 있고, 이것의 discard 메서드는 set에서 요소를 제거하고, 요소가 존재하지 않으면 아무 작업도 수행하지 않는다. 그러므로

1
my_set.discard(x)

는 동일한 작업을 두 번 수행하는 것과 정확히 동일한 효과가 있다. (참고로 array.pop()은 멱등적이지 않다)

1
2
my_set.discard(x)
my_set.discard(x)

멱등 연산은 작업 수행 요청이 최소 한 번 발생하도록 보장되지만 두 번 이상 발생할 수도 있는 네트워크 프로토콜 설계에 자주 사용된다. 작업이 멱등적이면 작업을 두 번 이상 수행해도 결과는 한 번만 수행된 것과 동일하기 때문에 문제가 없기 때문이다.

멱등은 RESTful 웹 서비스의 맥락에서 많이 언급된다. REST는 HTTP를 최대한 활용하여 프로그램에 웹 콘텐츠에 대한 액세스 권한을 부여하고, 일반적으로 HTTP 요청 및 응답 내에서 원격 프로시저 호출 스타일 서비스를 터널링하는 SOAP 기반 웹 서비스와 대조적으로 설정된다.

REST는 웹 애플리케이션을 리소스(예: Twitter 사용자 또는 Flickr 이미지)로 구성한 다음 POST, PUT, GETDELETE의 HTTP 메서드를 사용하여 해당 리소스를 생성, 업데이트, 읽기 및 삭제한다. 이중 POST를 제외한 나머지 HTTP 메서드를 사용하는 API(GET, PUT, DELETE)들이 멱등성이 유지되어야 한다.

멱등성은 REST에서 중요한 역할을 한다. REST 리소스 표현을 GET하고(예: Flickr에서 jpeg 이미지 가져오기) 작업이 실패하면 작업이 성공할 때까지 GET을 계속해서 반복할 수 있다. 웹 서비스의 경우 이미지를 몇 번 가져왔는지는 중요하지 않다. 마찬가지로 RESTful 웹 서비스를 사용하여 Twitter 계정 정보를 업데이트하는 경우 웹 서비스에서 확인을 받기 위해 필요한 만큼 새 정보를 PUT 할 수 있다. 천 번 PUT 하는 것은 한 번 PUT 하는 것과 같다. 마찬가지로 REST 리소스를 천 번 DELETE하는 것은 한 번 DELETE하는 것과 같다. 따라서 멱등성을 사용하면 통신 오류에 탄력적인 웹 서비스를 훨씬 쉽게 구성할 수 있다.

References

댓글