노트

데이터 무결성

Data Integrity

백엔드#db · 연결된 개념 10개

쉽게 말하면

데이터 무결성은 창고 장부에 100개라고 적혀 있으면 실제로도 100개가 있게 지키는 거예요. 없는 손님 앞으로 된 주문이나 음수 나이처럼 말이 안 되는 기록을 아예 못 들어오게 막죠.

비유의 한계 장부 담당 앱이 꼼꼼해도 다른 앱·배치·직접 실행한 SQL은 그 검사를 거치지 않아요. 그래서 마지막 방어선은 앱 검증이 아니라 기본키·외래키·CHECK 같은 DB 제약에 둬요.

데이터 무결성(data integrity)은 저장된 데이터가 정확하고 일관되며 믿을 수 있는 상태로 유지되는 것이다. 재고가 100개로 보이는데 실제로 50개라면 무결성이 깨진 것이다. 관계형 DB는 이를 제약 조건(constraint)으로 강제한다.

네 가지 무결성

  • 개체 무결성(entity integrity): 각 행을 유일하게 식별할 수 있어야 한다. 기본키(primary key)는 NULL이 될 수 없고 중복될 수 없다
  • 참조 무결성(referential integrity): 외래키(foreign key)는 실제로 존재하는 행을 가리켜야 한다. 없는 고객을 가리키는 주문(고아 레코드, orphan record)을 허용하지 않는다
  • 도메인 무결성(domain integrity): 값은 정해진 타입·범위·형식을 따라야 한다. 나이에 음수, 날짜 칸에 문자열은 안 된다
  • 사용자 정의 무결성(user-defined integrity): 위로 표현되지 않는 업무 규칙. 예: 할인율은 0~50%
CREATE TABLE orders (
  id          bigint PRIMARY KEY,                       -- 개체
  customer_id bigint NOT NULL REFERENCES customers(id), -- 참조
  quantity    int    NOT NULL CHECK (quantity > 0),     -- 도메인
  discount    numeric CHECK (discount BETWEEN 0 AND 0.5) -- 업무 규칙
);

어디서 지킬까

애플리케이션 검증(Bean Validation, DRF 시리얼라이저)만으로는 부족하다. 다른 앱, 배치, 직접 실행한 SQL은 그 검증을 거치지 않는다. 마지막 방어선은 DB 제약에 두고, 앱 검증은 친절한 오류 메시지를 위해 쓴다. 유효하지 않은 상태를 아예 표현할 수 없게 만든다는 점에서 값 객체와 같은 생각이다.

ACID와의 관계

무결성은 지키려는 목표이고, ACID는 동시 실행과 장애 속에서도 그 목표를 트랜잭션 단위로 보장하는 수단이다. 중복 저장으로 생기는 갱신 이상(update anomaly)을 구조적으로 줄이는 방법은 정규화다.

출처: PostgreSQL 문서: Constraints

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

  • 권한 있는 데이터(기준 데이터)

    권한 있는 데이터(authoritative data)는 어떤 값이 맞는지 판단할 때 최종 기준으로 삼기로 정한 데이터의 원천이다. 여러 곳에 같은 정보가 있고 값이 서로 다르면 권한 있는 쪽을 따르고, 나머지는 사본으로 다룬다. 데이터 관리에서는 이런 저장 시스템을 기록 시스템(System of Record, SoR)이라 부른다.

  • 낙관적 잠금과 비관적 잠금

    낙관적 잠금(Optimistic Locking)은 충돌이 드물다고 보고 읽을 때 잠그지 않는 동시성 제어 방식이다. 쓸 때 읽어 둔 버전(또는 타임스탬프)과 지금 값을 비교해, 그사이 다른 쪽이 바꿨으면 쓰기를 실패시킨다. 두 사용자가 같은 행을 읽고 차례로 저장해 먼저 저장한 변경이 사라지는 갱신 손실(lost update)을 막는다.

  • 데이터베이스 다중화

    같은 데이터를 여러 DB 서버에 복제해 두는 것. 가장 흔한 형태는 원본을 가진 주(Primary) 서버가 쓰기를 받고, 사본을 받는 부(Replica) 서버들이 읽기를 나눠 맡는 구조다.

  • 멱등성

    멱등성(idempotency)은 같은 연산을 한 번 하든 여러 번 하든 결과가 같다는 성질이다. 네트워크는 실패하고 메시지는 중복되므로, 재시도가 안전하려면 받는 쪽이 멱등해야 한다.

보기 옵션