💡 핵심 인사이트
무결성(Integrity)이란 데이터베이스에 저장된 데이터가 어떠한 결함이나 모순 없이, 현실 세계의 '참(True)'된 의미와 100% 일치하는 정확하고 일관된 상태를 유지하는 것을 뜻합니다.
이를 억지로 지키기 위해 DBA가 테이블에 설정해 놓는 지뢰밭 같은 강제 방어막을 '무결성 제약조건'이라고 합니다.
Ⅰ. 무결성 (Integrity)의 본질
데이터베이스는 쓰레기가 들어가면 쓰레기가 나옵니다(GIGO).
개발자가 앱에서 나이를 입력받을 때 실수로 문자인 -500을 DB에 밀어 넣으려 한다면? DB 엔진이 이를 그대로 저장해 버리면 그 순간부터 DB의 통계와 신뢰성은 붕괴(오염)됩니다.
이런 불상사를 막기 위해 DBMS는 개발자의 실수를 믿지 않고, DB 내부에 직접 문지기(제약조건)를 세웁니다. 사용자나 애플리케이션이 데이터를 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)하려 할 때 이 조건에 어긋나면 무자비하게 에러를 뿜어내며 튕겨버리는 것이 무결성 관리의 핵심입니다.
Ⅱ. 무결성 제약조건의 4대 분류 (시험의 핵심)
무엇을 지키느냐에 따라 크게 4가지 종류로 나뉘며, 다음 챕터들에서 하나씩 상세히 다루게 됩니다.
- 개체 무결성 (Entity Integrity)
- 주체: 기본 키 (Primary Key)
- 룰: 기본 키는 절대로 비어있을 수 없고(NOT NULL), 남과 똑같은 값을 가질 수 없다(UNIQUE). 각 행(개체)의 신원을 보장하기 위함입니다.
- 참조 무결성 (Referential Integrity)
- 주체: 외래 키 (Foreign Key)
- 룰: 자식 테이블의 외래 키는 반드시 부모 테이블에 실존하는 기본 키 값을 참조해야 하며, 부모 몰래 고아가 되는 조작을 금지합니다. 두 테이블 간의 관계(선)를 지킵니다.
- 도메인 무결성 (Domain Integrity)
- 주체: 일반 속성 (Column / Attribute)
- 룰: 특정 컬럼에 들어올 데이터는 미리 정의된 형식, 타입, 범위(예: 나이는 0 이상 숫자)를 벗어나서는 안 됩니다.
- 고객/사용자 정의 무결성 (User-defined Integrity)
- 주체: 비즈니스 룰 (Business Rule)
- 룰: 앞의 3가지 범용적인 수학적 규칙 외에, 기업의 특수한 업무 정책에 따라 DBA가
CHECK나 데이터베이스 트리거(Trigger)를 통해 커스텀하게 만들어둔 규칙입니다. (예: "우리 회사 직원의 월급은 기본급을 초과할 수 없다.")
Ⅲ. 무결성의 실무적 제약 (Trade-off)
- 보안 vs 성능: 무결성 제약조건이 테이블에 많을수록 데이터는 눈부시게 깨끗해집니다. 하지만 데이터를 한 줄(Row) 넣을 때마다 DB 엔진이 PK가 중복인지, FK가 존재하는지, 제약조건을 다 검사해야 하므로 삽입/수정(DML) 속도가 눈에 띄게 느려지는 치명적 단점이 생깁니다.
- 실무의 타협: 그래서 대규모 데이터 웨어하우스(DW)나 실시간 빅데이터 로깅 시스템에서는 속도를 위해 DB 단의 FK 등 무결성 제약조건을 의도적으로 아예 해제해 버리고, 앞단 애플리케이션(Spring) 코드 로직에서 데이터 정합성을 검증하는 식의 아키텍처를 취하기도 합니다.
📢 섹션 요약 비유: 무결성 제약조건은 고급 클럽 입구의 **'절대 타협 불가 가드(Guard) 4인방'**입니다. 1번 가드(개체 무결성)는 "민증 없는 놈, 남의 민증 가져온 놈 출입 금지", 2번 가드(참조 무결성)는 "VIP 회원이 초대하지 않은 손님 출입 금지", 3번 가드(도메인 무결성)는 "드레스 코드 위반자 금지"를 외치며 수질(데이터의 질)을 완벽하게 관리합니다.