PRECHECK를 사용한 CHECK 제약 조건 사전 유효성 검사
Oracle Database 23ai부터는 PRECHECK
키워드를 통해 애플리케이션 레벨에서 유효성 검사를 수행한 후 데이터베이스에 데이터를 삽입할 수 있는 기능을 제공합니다. 이는 데이터베이스에 유효하지 않은 데이터가 유입되는 것을 방지하고, 애플리케이션과 데이터베이스 간의 데이터 무결성을 강화하는 데 유용합니다.
1. PRECHECK란 무엇인가?
PRECHECK
는 CHECK
제약 조건에 대한 새로운 속성으로, 제약 조건이 정의된 열에 삽입될 데이터가 해당 제약 조건을 만족하는지 여부를 클라이언트 측에서 미리 검증할 수 있도록 합니다. 이 기능은 다음과 같은 이점을 제공합니다.
- 데이터 유효성 검사 시점의 이동: 데이터베이스에 데이터를 저장하기 전에 애플리케이션에서 유효성 검사를 수행하여 잘못된 데이터가 데이터베이스에 저장되는 것을 방지합니다.
- 향상된 성능: 데이터베이스 서버에 불필요한 왕복 횟수를 줄여 전반적인 성능을 향상시킵니다.
- 오류 처리 단순화: 데이터 유효성 검사 오류를 애플리케이션에서 직접 처리하므로 오류 처리 로직을 단순화할 수 있습니다.
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
기능은 데이터 유효성 검사 프로세스를 개선하고 데이터 무결성을 강화하는 데 유용한 도구입니다. 이 기능을 통해 개발자는 애플리케이션 레벨에서 데이터 유효성을 검사하여 데이터베이스의 성능과 안정성을 향상시킬 수 있습니다.