CAP 정리 — P는 고르는 게 아니라 주어진다
CAP 정리는 셋 중 둘을 고르는 문제가 아니라, 네트워크 파티션이 났을 때 일관성과 가용성 중 무엇을 살릴지 고르는 문제다. P가 왜 전제인지, CA/CP/AP의 실제 의미와 PACELC까지 정리한다.
결론 먼저
CAP 정리는 흔히 “일관성(Consistency), 가용성(Availability), 분할 내성(Partition Tolerance) 셋 중 둘을 고른다”로 소개된다. 하지만 실제 선택은 그렇게 자유롭지 않다.
핵심은 이렇다. 네트워크 파티션이 발생한 상황에서 C와 A 중 하나를 포기해야 한다. P는 설계자가 고르는 옵션이 아니라 분산 환경이 강제하는 전제이기 때문이다. 그래서 진짜 선택지는 CP와 AP 둘로 좁혀지고, CA는 이론적으로만 의미가 있다.
즉 CAP는 “셋 중 둘”이 아니라 “파티션이 났을 때 C를 살릴까 A를 살릴까”의 문제다.
세 속성의 정확한 의미
Eric Brewer가 2000년에 제시하고 이후 정식으로 증명된 이론이다. 분산 시스템이 가질 수 있는 세 가지 보장을 말한다.
일관성(Consistency) — 모든 노드가 같은 시점에 동일한 데이터를 본다. 어느 노드에 읽기를 보내든 가장 최신 쓰기 결과를 반환하거나, 아니면 오류를 반환한다.
가용성(Availability) — 모든 요청이 응답을 받는다. 단, 그 응답이 최신 데이터라는 보장은 없다.
분할 내성(Partition Tolerance) — 노드 간 네트워크가 끊기거나 지연(파티션, partition)되어도 시스템이 계속 동작한다.
A와 P는 층위가 다르다
혼동하기 쉽지만 A와 P는 보는 대상이 다르다.
- A는 클라이언트와 시스템 사이의 약속 — 사용자가 요청을 보냈을 때 답을 받느냐.
- P는 시스템 내부 노드들 사이의 문제 — 서버들끼리 통신이 끊겼을 때 버티느냐.
콜센터에 비유하면, A는 “전화하면 누군가 받는다”이고, P는 “본사와 지사 사이 전화선이 끊겨도 지사가 영업을 계속한다”이다. 별개의 얘기다.
왜 셋 중 둘만 되는가 — 그리고 왜 P는 못 버리는가
핵심 주장은 이 세 가지를 동시에 만족시킬 수 없다는 것이다. 정확히는, 네트워크 파티션이 발생한 상황에서 C와 A 중 하나를 포기해야 한다.
노드가 두 그룹으로 나뉘어 통신이 끊긴 상태를 그려보자. 한쪽 그룹에 읽기/쓰기 요청이 들어온다. 이 노드는 다른 그룹의 최신 상태를 알 수 없다. 선택지는 둘뿐이다 — 최신이 아닐 수 있는 데이터라도 응답하거나(A), 확신이 없으니 거부하거나(C). 둘 다는 불가능하다.
여기서 흔한 오해가 “그럼 P를 빼면 되지 않나”다. 성립하지 않는다. 분산 시스템에서 네트워크 장애는 의도적으로 나누는 게 아니라 원치 않게 발생하는 단절이다. 언제든 일어나므로 P는 반드시 가져가야 한다. 즉 P는 설계자가 고르는 옵션이 아니라 환경이 강제하는 전제다. 그래서 실제 선택은 CP와 AP로 좁혀지고, CA는 이론적으로만 의미가 있다.
CA / CP / AP
CA — 일관성 + 가용성 (분할 내성 포기) 파티션이 절대 없다고 가정한다. 모든 노드가 항상 통신 가능하면 C와 A를 둘 다 누릴 수 있다. 하지만 분산 환경에서 네트워크 단절은 반드시 일어나므로, CA는 사실상 파티션이라는 사건 자체가 존재할 수 없는 단일 노드 시스템에서만 성립한다. 단일 서버 위의 전통적 RDBMS가 여기 해당한다.
CP — 일관성 + 분할 내성 (가용성 포기) 파티션이 나면 최신임을 보장할 수 없는 노드는 요청을 거부하거나 오류를 반환한다. “틀린 답을 주느니 답을 안 주겠다”는 입장이다. 데이터 정합성이 절대적으로 중요한 시스템에 맞는다. 예 — etcd, ZooKeeper, HBase, MongoDB(기본 설정).
AP — 가용성 + 분할 내성 (일관성 포기) 파티션이 나도 모든 노드가 계속 응답한다. 대신 끊긴 동안 다른 노드의 최신 쓰기를 못 봤을 수 있어 오래된 데이터를 반환할 수 있다. 파티션이 복구되면 나중에 데이터를 맞춰간다(최종 일관성, eventual consistency). 예 — Cassandra, DynamoDB, Riak.
함정 정리
CAP의 C ≠ ACID의 C. CAP의 C는 선형화 가능성(linearizability)에 가깝고, ACID의 C는 무결성 제약 조건을 뜻한다. 같은 글자지만 가리키는 대상이 다르다.
“partition”이라는 단어의 이중 의미. CAP의 P는 네트워크 파티션(노드 간 통신이 끊긴 장애 모드)만 가리킨다. RDBMS의 테이블 파티셔닝(range/hash)이나 샤딩은 데이터 파티셔닝(설계 기법)으로, 완전히 다른 개념이다. 단일 노드에서 테이블을 아무리 쪼개도 “노드 간 단절”이라는 사건이 없으므로 CAP 관점에서는 여전히 CA다. P가 의미를 가지려면 데이터가 여러 노드에 흩어져 있어야 한다.
CAP의 빈틈과 PACELC
CAP는 “파티션이 없는 평상시”에 대해서는 아무 말도 하지 않는다. 평상시에는 C와 A를 모두 누릴 수 있다. 이 한계를 메우려고 나온 게 PACELC 정리다 — “파티션(P)이면 A 또는 C, 그렇지(Else) 않으면 지연시간(Latency) 또는 일관성(Consistency)”. 평상시의 지연-일관성 트레이드오프까지 포함해 더 완전한 그림을 준다.
정리하면, CAP는 파티션이라는 예외 상황에서의 C/A 선택을 말하고, PACELC는 거기에 평상시의 지연/일관성 선택을 더한다. 두 정리 모두 P를 자유로운 선택지가 아니라 주어진 전제로 놓는다는 점이 출발점이다.