도메인에 어노테이션 추가

도메인 어노테이션이란 무엇인가?

도메인 어노테이션은 Oracle Database 23ai에서 새롭게 도입된 기능으로, 데이터베이스 스키마 내에 데이터 사용 목적, 속성, 제약 조건과 같은 메타데이터를 중앙 집중식으로 관리할 수 있게 해줍니다. 이를 통해 애플리케이션 개발자는 코드에서 분산된 데이터 정의를 관리하는 대신, 데이터베이스 자체에서 일관된 데이터 정의를 활용할 수 있습니다.

도메인 어노테이션의 장점

  • 데이터 품질 향상: 유효성 검사 규칙 및 제약 조건을 적용하여 잘못된 데이터 입력을 방지하고 데이터 일관성을 유지합니다.
  • 코드 재사용성 증가: 중앙 집중식으로 관리되는 도메인 정의를 여러 애플리케이션에서 공유하여 코드 중복을 줄이고 개발 효율성을 높입니다.
  • 유지보수 용이성 증대: 데이터 정의가 변경될 때, 데이터베이스에서 중앙 집중식으로 관리하므로 애플리케이션 코드를 수정할 필요 없이 변경 사항을 반영할 수 있습니다.
  • 데이터 거버넌스 강화: 데이터 사용 목적 및 속성에 대한 명확한 정보를 제공하여 데이터 거버넌스 및 규정 준수를 지원합니다.

도메인 어노테이션 생성 및 관리

도메인 어노테이션은 CREATE DOMAIN, ALTER DOMAIN, DROP DOMAIN DDL 구문을 사용하여 생성, 수정, 삭제할 수 있습니다. 다음은 몇 가지 예시입니다.

1. 도메인 생성

CREATE DOMAIN 구문을 사용하여 새로운 도메인을 생성합니다.


CREATE DOMAIN HourlyWage AS NUMBER
  DEFAULT 0
  CONSTRAINT valid_wage CHECK (HourlyWage >= 0 AND HourlyWage < 1000)
  ORDER BY HourlyWage
  DISPLAY '$999.99'
  ANNOTATIONS (
 'properties' = '{
  "Sales": "Manufacturing",
  "Industry": "Manufacturing"
 }',
 'descriptions' = 'Hourly wages for different companies.');

2. 도메인에 열 연결

CREATE TABLE 또는 ALTER TABLE 구문을 사용하여 테이블 열에 도메인을 연결합니다.


CREATE TABLE Employees (
 EmployeeID NUMBER,
 EmployeeName VARCHAR2(100),
 HourlyWage HourlyWage DOMAIN
);

-- 기존 테이블에 도메인 연결
ALTER TABLE Employees
MODIFY (HourlyWage HourlyWage DOMAIN);

3. 도메인 수정

ALTER DOMAIN 구문을 사용하여 도메인의 속성을 변경합니다.


ALTER DOMAIN HourlyWage
  MODIFY CONSTRAINT valid_wage CHECK (HourlyWage >= 0 AND HourlyWage < 1200);

4. 도메인 삭제

DROP DOMAIN 구문을 사용하여 더 이상 필요하지 않은 도메인을 삭제합니다.


DROP DOMAIN HourlyWage;

실전 예제: 전화번호 형식 검증

전화번호 형식을 강제하기 위해 정규 표현식을 사용한 도메인을 생성하는 예시입니다.


CREATE DOMAIN PhoneNumber AS VARCHAR2(20)
 CONSTRAINT phone_format CHECK (REGEXP_LIKE(VALUE, '^\d{3}-\d{3}-\d{4}$'))
 ANNOTATIONS ('description' = '전화번호 형식을 999-999-9999로 제한');

CREATE TABLE Contacts (
 ContactID NUMBER,
 ContactName VARCHAR2(100),
 Phone PhoneNumber DOMAIN
);

INSERT INTO Contacts (ContactID, ContactName, Phone) VALUES (1, '홍길동', '123-456-7890'); -- 성공
INSERT INTO Contacts (ContactID, ContactName, Phone) VALUES (2, '김철수', '1234567890'); -- 실패, phone_format 제약 조건 위반

위 코드에서 PhoneNumber 도메인은 Contacts 테이블의 Phone 열에 연결되어 입력되는 데이터의 형식을 검증합니다.

API를 사용한 도메인 정보 조회

데이터 딕셔너리 뷰를 사용하여 도메인 정보를 조회할 수 있습니다.


SELECT domain_name, data_type, constraint_name, constraint_condition
FROM user_domain_constraints
WHERE table_name = 'CONTACTS';

위 쿼리는 CONTACTS 테이블에 연결된 도메인 제약 조건 정보를 반환합니다.

유연한 도메인 활용

유연한 도메인을 사용하여 다양한 조건에 따라 다른 형식을 동적으로 선택할 수 있습니다.


CREATE DOMAIN temperature AS NUMBER
  CONSTRAINT celsius CHECK (VALUE BETWEEN -273.15 AND 1000)
  CONSTRAINT fahrenheit CHECK (VALUE BETWEEN -459.67 AND 1832)
  CONSTRAINT kelvin CHECK (VALUE >= 0);

CREATE DOMAIN unit_type AS VARCHAR2(10);

CREATE TABLE sensor_readings (
  sensor_id NUMBER,
  temperature NUMBER,
  unit_type unit_type DOMAIN, -- 동적으로 단위 유형 선택
  DOMAIN CHECK USING ( -- 단위 유형에 따라 다른 제약 조건 적용
    CASE
      WHEN unit_type = 'C'
      THEN celsius -- 섭씨 제약 조건
      WHEN unit_type = 'F'
      THEN fahrenheit -- 화씨 제약 조건
      WHEN unit_type = 'K'
      THEN kelvin -- 켈빈 제약 조건
      ELSE 'FALSE'
    END = 'TRUE'
  )
);

스키마 어노테이션 활용

데이터베이스 객체에 추가 메타데이터를 스키마 어노테이션을 사용하여 추가할 수 있습니다.

1. 테이블 어노테이션 추가

CREATE TABLE 구문 또는 ALTER TABLE 구문을 사용하여 테이블에 어노테이션을 추가합니다.


CREATE TABLE employees (
  employee_id NUMBER,
  first_name VARCHAR2(50),
  last_name VARCHAR2(50)
)
ANNOTATIONS (
 'description' = '회사 직원 정보를 저장하는 테이블',
 'owner' = 'HR_DEPT'
);

2. 열 어노테이션 추가

CREATE TABLE 또는 ALTER TABLE 구문에서 열 정의의 일부로 어노테이션을 추가합니다.


CREATE TABLE employees (
  employee_id NUMBER ANNOTATIONS ('description' => '직원 고유 식별자'),
  first_name VARCHAR2(50),
  last_name VARCHAR2(50)
);

3. 데이터 딕셔너리 뷰를 사용한 어노테이션 정보 조회


SELECT object_name, object_type, annotation_name, annotation_value
FROM user_annotations
WHERE object_name = 'EMPLOYEES';
위로 스크롤