노트

데이터 무결성

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)이다.

  • 데이터베이스 다중화

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

  • 멀티테넌시 데이터 격리

    멀티테넌시(multi-tenancy)는 하나의 서비스가 여러 고객(테넌트, tenant)의 데이터를 함께 다루는 구조다. 핵심 설계 질문은 테넌트 사이의 데이터를 얼마나 강하게 떼어 놓을 것인가이고, 한쪽 끝은 공유 DB, 반대쪽 끝은 테넌트 전용 DB다.

  • DB 인덱스와 트레이드오프

    DB 인덱스는 특정 컬럼 값으로 행을 빨리 찾도록 테이블 옆에 따로 유지하는 보조 자료구조(auxiliary data structure)다. 관계형 DB의 기본 인덱스는 정렬된 균형 트리(B-tree 계열)라서, 전체를 훑지 않고 트리를 따라 내려가 원하는 행에 닿는다.

  • 저장소 역할 분담 (DB·캐시·큐·검색)

    서버 애플리케이션 옆에는 거의 늘 관계형 DB, 인메모리 캐시, 메시지 브로커(message broker), 검색 엔진이 붙는다. 하나로 다 하지 않는 이유는 데이터의 성격(영구성·속도·전달·검색)마다 잘하는 도구가 다르기 때문이다.

보기 옵션