데이터베이스 도메인으로 애트리뷰트 값의 범위 설계하기
데이터베이스 도메인의 의미와 유형, 무결성·정규화·ER 모델링에서의 역할 및 설계 시 고려사항을 정리합니다.
2026-08-14 · 최초 발행 2025-08-10
데이터 타입보다 좁은 값의 경계
도메인은 하나의 애트리뷰트가 취할 수 있는 같은 타입의 모든 원자값 집합이다. 데이터베이스에서는 애트리뷰트에 허용되는 값의 범위를 정하는 데 쓰이며, 모든 값은 같은 데이터 타입을 공유하고 원자적이어야 한다.
따라서 도메인은 단순히 INTEGER나 VARCHAR를 고르는 문제로 끝나지 않는다. 특정 값만 허용하도록 범위를 정하고, 업무 규칙을 데이터 수준에서 적용하는 설계 단위다.
도메인에는 다음 성질이 따른다.
- 각 값은 더 이상 분해할 수 없는 원자값이다.
- 하나의 도메인 안에서는 데이터 타입이 일관돼야 한다.
- 애트리뷰트가 허용할 값의 범위를 명확히 제한한다.
- 데이터 타입을 넘어 비즈니스 규칙을 데이터베이스 레벨에서 강제할 수 있다.
값의 집합을 표현하는 방식
기본 도메인은 데이터베이스 시스템이 제공하는 데이터 타입이다. INTEGER, CHAR, VARCHAR, DATE, BOOLEAN 등이 여기에 속한다.
사용자 정의 도메인은 기본 도메인에 제약조건을 덧붙여 만든다. 예를 들어 CREATE DOMAIN EMAIL AS VARCHAR(100) CHECK (VALUE LIKE '%@%.%');처럼 이메일 값에 대한 조건을 포함할 수 있다.
값을 미리 열거하는 방식도 있다. 성별 도메인을 {'남성', '여성', '기타'}로 정하는 열거형 도메인이 그 예다. 범위 도메인은 최소값과 최대값으로 값 공간을 제한한다. 나이 도메인을 {0 ~ 150}으로 정의하는 경우가 이에 해당한다.
도메인 정의를 테이블에 적용하는 예
도메인 선언은 값의 형식과 제약을 한곳에 두고, 테이블에서는 그 이름을 사용하도록 만든다.
-- 이메일 도메인 정의
CREATE DOMAIN EMAIL AS VARCHAR(100)
CHECK (VALUE LIKE '%@%.%');
-- 나이 도메인 정의
CREATE DOMAIN AGE AS INTEGER
CHECK (VALUE BETWEEN 0 AND 150);
-- 성별 도메인 정의
CREATE DOMAIN GENDER AS CHAR(1)
CHECK (VALUE IN ('M', 'F', 'O'));
-- 테이블에 도메인 적용
CREATE TABLE EMPLOYEE (
emp_id INTEGER PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email EMAIL NOT NULL,
age AGE,
gender GENDER
);
이 방식은 애트리뷰트마다 같은 조건을 반복해서 적는 대신, EMAIL, AGE, GENDER처럼 의미를 드러내는 도메인으로 규칙을 연결한다.
무결성 규칙을 데이터 레벨에 둔다
도메인 무결성은 정의된 값의 집합 밖에 데이터가 들어오는 것을 막는다. 그 결과 모든 데이터가 정해진 도메인 안에 존재하게 되고, 허용되지 않은 값의 입력을 사전에 차단할 수 있다.
업무 규칙도 애플리케이션 코드가 아닌 데이터베이스 레벨에서 적용할 수 있다. 같은 도메인은 여러 애트리뷰트에 적용할 수 있으므로, 검증 규칙의 재사용성도 높아진다.
설계할 때 확인할 범위와 제약
도메인을 정하기 전에 데이터가 표현하려는 실제 개념과 제약조건을 먼저 파악해야 한다. 고객 전화번호라면 국가 코드를 포함해야 하는지처럼, 업무 요구가 값의 범위를 결정한다.
데이터 특성에 맞는 타입도 함께 선택한다. 금액에는 DECIMAL, 텍스트에는 VARCHAR, 날짜에는 DATE를 사용한다. 이후 CHECK 제약조건, DEFAULT 값, NOT NULL 등의 조건을 도메인에 어떻게 적용할지 정한다.
처음부터 지나치게 제한적인 도메인을 만들면 이후 업무 요구가 바뀌었을 때 확장하기 어렵다. 스키마가 변할 가능성까지 고려해 값의 경계를 설계해야 한다.
ER 모델과 정규화에서의 위치
ER 모델링에서 도메인은 엔티티 타입의 애트리뷰트가 가질 수 있는 값의 범위다. 예를 들어 직원의 이메일, 나이, 성별과 주문 상태는 각각 서로 다른 도메인으로 정의할 수 있다.
정규화 과정에서도 도메인은 기준이 된다. 제1정규형(1NF)은 모든 애트리뷰트 값이 원자적이어야 한다는 점에서 도메인의 원자성과 연결된다. 제2정규형(2NF)에서는 부분 함수적 종속성을 제거해 각 도메인의 독립성을 보장하고, 제3정규형(3NF)에서는 이행적 종속성을 제거해 도메인 간 직접적 관계만 유지한다.
업무 데이터에 맞춘 도메인 선언
금융 시스템에서는 계좌 잔액을 음수가 아닌 값으로 제한하는 도메인을 둘 수 있다.
CREATE DOMAIN ACCOUNT_BALANCE AS DECIMAL(15,2)
CHECK (VALUE >= 0);
CREATE TABLE ACCOUNT (
account_id VARCHAR(20) PRIMARY KEY,
customer_id INTEGER NOT NULL,
balance ACCOUNT_BALANCE DEFAULT 0.00,
last_transaction_date DATE
);
의료 시스템에서는 혈액형처럼 허용값이 정해진 데이터를 열거 조건으로 표현할 수 있다.
CREATE DOMAIN BLOOD_TYPE AS VARCHAR(3)
CHECK (VALUE IN ('A+', 'A-', 'B+', 'B-', 'AB+', 'AB-', 'O+', 'O-'));
CREATE TABLE PATIENT (
patient_id INTEGER PRIMARY KEY,
name VARCHAR(100) NOT NULL,
blood_type BLOOD_TYPE,
admission_date DATE
);
재사용 가능한 검증 규칙의 효과
같은 제약조건을 여러 테이블에 반복 정의하지 않아도 되므로 코드 중복이 줄어든다. 도메인 정의를 변경하면 해당 도메인을 쓰는 모든 애트리뷰트에 적용할 수 있어 유지보수도 수월하다.
일관된 데이터 검증 규칙은 데이터 품질을 보장하며, 도메인 이름과 정의 자체가 데이터 모델의 의미를 전달하는 문서 역할도 한다.
복합 도메인은 여러 기본 도메인을 조합한다. 주소 도메인은 우편번호 도메인, 기본주소 도메인, 상세주소 도메인의 조합으로 구성할 수 있다.
서브 도메인은 기존 도메인의 부분집합이다. 성인_나이 도메인은 나이 도메인 가운데 {18 ~ 150}을 대상으로 한다. 서로 다른 도메인 사이의 값 변환 규칙도 정의할 수 있으며, 섭씨온도 도메인과 화씨온도 도메인 간 변환이 예가 된다.