💡 핵심 인사이트
도메인 무결성은 릴레이션의 아주 작은 칸(셀) 하나하나를 지키는 방어벽입니다.
**"테이블에 값을 입력할 때, 해당 속성(열)에 허용된 형식, 데이터 타입, 크기, 그리고 비즈니스 범위(도메인)에 속하는 합법적인 원자값만 들어가야 한다"**는 규칙입니다.
Ⅰ. 도메인 무결성의 개념
앞서 [64. 도메인] 챕터에서 배웠듯, 도메인은 속성이 가질 수 있는 합법적인 값들의 '집합'입니다. 데이터베이스에 데이터를 집어넣거나(INSERT), 수정할 때(UPDATE) 이 선언된 집합의 범위를 벗어나는 엉뚱한 쓰레기 값이 들어오는 것을 방지하여 컬럼 단위의 품질을 보장하는 것이 도메인 무결성입니다.
Ⅱ. 도메인 무결성의 3가지 방어 체계
실제 RDBMS(Oracle, MySQL)에서 도메인 무결성을 강제하는 물리적인 도구들은 다음과 같습니다.
1. 데이터 타입과 크기 (Data Type & Size)
가장 기본적이고 원초적인 방어막입니다. 테이블 생성(CREATE) 시 컬럼의 본질을 규정합니다.
나이 INT: 정수만 허용. 사용자가 "서른살"이라는 문자열을 넣으려 하면Type Mismatch에러로 튕겨냅니다.이름 VARCHAR(10): 10글자가 넘는 긴 이름("김수한무거북이와두루미...")을 넣으면 글자 수 제한으로 데이터를 잘라내거나 에러를 냅니다.
2. NOT NULL 제약조건
기본 키(PK)가 아니더라도, 회원가입 시 "이 항목은 무조건 적어야 해!"라고 강제하는 필수 입력 컬럼(비밀번호 등)에 설정합니다. 이 컬럼에 값이 비어있는(NULL) 행위 자체를 도메인 이탈로 봅니다.
3. CHECK 제약조건 (비즈니스 로직 방어)
데이터 타입은 맞지만 비즈니스 상식에 어긋나는 값을 막는 디테일한 그물망입니다.
- 범위 검사:
성적 INT CHECK (성적 >= 0 AND 성적 <= 100). 숫자 타입이지만 마이너스(-50) 점수가 들어오는 것을 막아줍니다. - 도메인 목록 검사:
성별 VARCHAR(10) CHECK (성별 IN ('M', 'F')). 문자 타입이지만 오직 'M'과 'F' 두 글자만 입력되도록 강제합니다. - 포맷 검사: 전화번호 컬럼에 반드시
010-으로 시작하도록 정규식(Regex)을 걸어 검사합니다.
(※ MySQL 구버전 등 일부 DBMS 엔진은 CHECK 제약조건을 파싱만 하고 무시하는 경우도 있었으나, 현대의 엔진들은 이를 엄격하게 지켜냅니다.)
Ⅲ. 무결성의 요약 (어디를 지키는가?)
지금까지 배운 3대 무결성이 각각 테이블의 어느 위치를 사수하는지 헷갈리지 않게 정리해야 합니다.
- 개체 무결성 (PK): 테이블의 행(Row) 전체를 지킵니다. (이 행이 유령이냐 진짜냐?)
- 참조 무결성 (FK): 테이블과 테이블 **사이의 선(관계)**을 지킵니다. (족보가 꼬이지 않았냐?)
- 도메인 무결성 (Type/Check): 테이블의 세로 열(Column)과 각각의 셀(Cell) 하나하나를 깐깐하게 지킵니다. (이 칸에 들어갈 자격이 있느냐?)
📢 섹션 요약 비유: 도메인 무결성은 수영장의 **'유아용 풀장 입장 제한선'**과 같습니다. "수영복을 입고(데이터 타입), 키 130cm 이하이며(CHECK 범위), 보호자를 동반할 것(NOT NULL)"이라는 깐깐한 허용 집합(도메인)을 문 앞에 붙여놓고, 어른이 억지로 다이빙하려 하면 안전 요원이 휘슬을 불며 즉각 쫓아내는 철통 방어 시스템입니다.