PRECHECK를 사용하여 CHECK 제약 조건 사전 유효성 검사

PRECHECK를 사용한 CHECK 제약 조건 사전 유효성 검사

Oracle Database 23ai부터는 PRECHECK 키워드를 통해 애플리케이션 레벨에서 유효성 검사를 수행한 후 데이터베이스에 데이터를 삽입할 수 있는 기능을 제공합니다. 이는 데이터베이스에 유효하지 않은 데이터가 유입되는 것을 방지하고, 애플리케이션과 데이터베이스 간의 데이터 무결성을 강화하는 데 유용합니다.

1. PRECHECK란 무엇인가?

PRECHECKCHECK 제약 조건에 대한 새로운 속성으로, 제약 조건이 정의된 열에 삽입될 데이터가 해당 제약 조건을 만족하는지 여부를 클라이언트 측에서 미리 검증할 수 있도록 합니다. 이 기능은 다음과 같은 이점을 제공합니다.

  • 데이터 유효성 검사 시점의 이동: 데이터베이스에 데이터를 저장하기 전에 애플리케이션에서 유효성 검사를 수행하여 잘못된 데이터가 데이터베이스에 저장되는 것을 방지합니다.
  • 향상된 성능: 데이터베이스 서버에 불필요한 왕복 횟수를 줄여 전반적인 성능을 향상시킵니다.
  • 오류 처리 단순화: 데이터 유효성 검사 오류를 애플리케이션에서 직접 처리하므로 오류 처리 로직을 단순화할 수 있습니다.

2. PRECHECK 사용 방법

PRECHECK를 사용하려면 먼저 기존 또는 새로 생성할 테이블에 CHECK 제약 조건을 정의하고 PRECHECK 속성을 활성화해야 합니다. PRECHECK 속성은 ENABLE 또는 DISABLE 값으로 설정할 수 있습니다.

2.1. 테이블 생성 시 PRECHECK 설정

다음은 테이블 생성 시 PRECHECK 속성을 활성화하는 예시입니다.

CREATE TABLE employees (
 employee_id NUMBER PRIMARY KEY,
 salary NUMBER CONSTRAINT emp_salary_check CHECK (salary > 0) PRECHECK
);

위 예시에서 emp_salary_check 제약 조건은 salary 열에 음수 값이 삽입되는 것을 방지하며, PRECHECK 속성을 통해 해당 제약 조건의 유효성 검사를 클라이언트 측에서 수행할 수 있습니다.

2.2. 기존 테이블에 PRECHECK 설정

다음은 기존 테이블에 PRECHECK 속성을 추가하는 예시입니다.

ALTER TABLE employees
MODIFY CONSTRAINT emp_salary_check PRECHECK;

2.3. JSON 스키마를 사용한 PRECHECK

PRECHECK 기능은 JSON 스키마를 사용하여 더욱 복잡한 유효성 검사 규칙을 정의하는 데 활용될 수 있습니다. JSON 스키마는 데이터의 구조와 내용을 정의하는 데 사용되는 표준화된 형식입니다.

CREATE TABLE sensor_readings (
 sensor_id NUMBER PRIMARY KEY,
 reading_time TIMESTAMP WITH LOCAL TIME ZONE,
 reading_value NUMBER,
 metadata VARCHAR2(4000) 
 CONSTRAINT sensor_metadata_check CHECK (metadata IS JSON VALIDATE USING 'sensor_metadata_schema') PRECHECK
);

위 예시에서 sensor_metadata_check 제약 조건은 metadata 열에 저장된 JSON 데이터가 sensor_metadata_schema JSON 스키마를 준수하는지 확인합니다.

3. PRECHECK 활용 예시

3.1. 전화번호 형식 강제

다음은 정규 표현식을 사용하여 전화번호 형식을 강제하는 예시입니다.

CREATE TABLE contacts (
 contact_id NUMBER PRIMARY KEY,
 phone_number VARCHAR2(20) 
 CONSTRAINT phone_number_check 
 CHECK (REGEXP_LIKE(phone_number, '^\(\d{3}\) \d{3}-\d{4}$')) PRECHECK
);

위 예시에서 phone_number_check 제약 조건은 phone_number 열에 저장된 전화번호가 (XXX) XXX-XXXX 형식을 준수하는지 확인합니다.

3.2. 이메일 주소 유효성 검사

다음은 이메일 주소의 형식을 유효성 검사하는 예시입니다.

CREATE TABLE users (
 user_id NUMBER PRIMARY KEY,
 email VARCHAR2(100)
 CONSTRAINT email_check 
 CHECK (REGEXP_LIKE(email, '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$')) PRECHECK
);

위 예시에서 email_check 제약 조건은 email 열에 저장된 이메일 주소가 유효한 형식을 갖는지 확인합니다.

3.3. 데이터 범위 제한

다음은 특정 열의 데이터 범위를 제한하는 예시입니다.

CREATE TABLE products (
 product_id NUMBER PRIMARY KEY,
 price NUMBER
 CONSTRAINT price_check CHECK (price > 0 AND price < 1000) PRECHECK
);

위 예시에서 price_check 제약 조건은 price 열에 저장된 값이 0보다 크고 1000보다 작은지 확인합니다.

4. PRECHECK 사용 시 주의사항

  • 제약 조건 복잡성: PRECHECK는 간단한 유효성 검사에 적합하며, 복잡한 유효성 검사 로직은 애플리케이션 레이어에서 처리하는 것이 좋습니다.
  • 데이터베이스 버전 호환성: PRECHECK 기능은 Oracle Database 23ai부터 지원되므로, 하위 버전과의 호환성을 고려해야 합니다.
  • 보안: PRECHECK는 클라이언트 측에서 수행되므로, 악의적인 사용자가 유효성 검사를 우회할 가능성이 있습니다. 따라서 서버 측에서도 데이터 유효성을 검증하는 것이 중요합니다.

5. 결론

Oracle Database 23ai의 PRECHECK 기능은 데이터 유효성 검사 프로세스를 개선하고 데이터 무결성을 강화하는 데 유용한 도구입니다. 이 기능을 통해 개발자는 애플리케이션 레벨에서 데이터 유효성을 검사하여 데이터베이스의 성능과 안정성을 향상시킬 수 있습니다.

위로 스크롤