서론
Oracle Database는 다양한 종류의 데이터를 효율적으로 관리하기 위해 여러 가지 특수 데이터 타입을 제공합니다. 이 가이드에서는 데이터베이스 애플리케이션 개발 시 이러한 특수 데이터 타입을 활용하여 데이터 무결성을 높이고, 스토리지 요구 사항을 줄이며, 성능을 개선하는 방법을 자세히 설명합니다.
특수 데이터 타입 소개
데이터를 저장하는 데 필요한 공간을 줄이고 데이터 무결성을 유지하는 특수한 데이터 형식입니다.
문자 데이터 타입
문자열 데이터를 저장하는 데 사용됩니다. 각 데이터 타입별 특징과 성능에 미치는 영향은 다음과 같습니다.
- CHAR: 고정 길이 문자열을 저장하며, 지정된 길이보다 짧은 문자열은 공백으로 채워집니다.
- VARCHAR2: 가변 길이 문자열을 저장하며, 최대 길이를 지정할 수 있습니다. 저장 공간 효율성이 높습니다.
- NCHAR: 고정 길이 유니코드 문자열을 저장합니다. 다국어 지원이 필요한 경우 사용합니다.
- NVARCHAR2: 가변 길이 유니코드 문자열을 저장합니다.
팁: VARCHAR2 데이터 타입을 사용하세요. 대체로 저장 공간의 효율성과 성능 면에서 가장 좋습니다.
예제:
CREATE TABLE employees (
employee_id NUMBER,
employee_name VARCHAR2(100)
);
숫자 데이터 타입
숫자 데이터를 저장하는 데 사용됩니다. 각 데이터 타입별 특징과 성능에 미치는 영향은 다음과 같습니다.
- NUMBER: 정수 및 부동 소수점 숫자를 저장하며, 정밀도와 스케일을 지정할 수 있습니다.
- FLOAT: 부동 소수점 숫자를 저장하며, 하드웨어에 따라 성능이 달라질 수 있습니다.
- BINARY_FLOAT: 32비트 부동 소수점 숫자를 저장합니다.
- BINARY_DOUBLE: 64비트 부동 소수점 숫자를 저장합니다.
예제:
CREATE TABLE products (
product_id NUMBER,
product_price NUMBER(10, 2)
);
날짜 및 시간 데이터 타입
날짜와 시간 데이터를 저장하는 데 사용됩니다. 각 데이터 타입별 특징과 성능에 미치는 영향은 다음과 같습니다.
- DATE: 날짜와 시간을 저장하며, 초 단위까지 정밀도를 가집니다.
- TIMESTAMP: 날짜와 시간을 저장하며, 나노초 단위까지 정밀도를 가집니다.
- TIMESTAMP WITH TIME ZONE: 날짜, 시간, 시간대를 저장합니다. 전 세계적으로 분산된 시스템에 유용합니다.
- INTERVAL YEAR TO MONTH: 연도와 월 단위로 기간을 저장합니다.
- INTERVAL DAY TO SECOND: 일, 시간, 분, 초 단위로 기간을 저장합니다.
예제:
CREATE TABLE orders (
order_id NUMBER,
order_date DATE,
delivery_time TIMESTAMP WITH TIME ZONE
);
특수 데이터 타입
특수한 데이터를 저장하는 데 사용됩니다. 각 데이터 타입별 특징과 성능에 미치는 영향은 다음과 같습니다.
- LOB (Large Object): 대용량 텍스트 또는 이진 데이터를 저장합니다.
- CLOB: 문자 기반 대용량 데이터 저장.
- BLOB: 이진 기반 대용량 데이터 저장.
- NCLOB: 유니코드 문자 기반 대용량 데이터 저장.
- LONG 및 LONG RAW: 가변 길이 문자열 또는 이진 데이터를 저장합니다 (더 이상 사용되지 않음).
- JSON: JSON 데이터를 네이티브 방식으로 저장하고 관리합니다.
예제:
CREATE TABLE documents (
document_id NUMBER,
document_content CLOB,
document_json JSON
);
특수 데이터 타입의 활용 예시
실제 데이터베이스 애플리케이션에서 특수 데이터 타입을 어떻게 활용할 수 있는지 몇 가지 예시를 들어 설명합니다.
1. 전화 번호 형식 강제
정규 표현식을 사용하여 전화 번호 형식을 강제합니다.
CREATE TABLE contacts (
contact_id NUMBER,
phone_number VARCHAR2(20),
CONSTRAINT check_phone_number
CHECK (REGEXP_LIKE(phone_number, '^\(\d{3}\) \d{3}-\d{4}$'))
);
INSERT INTO contacts (contact_id, phone_number) VALUES (1, '(123) 456-7890'); -- 성공
INSERT INTO contacts (contact_id, phone_number) VALUES (2, '123-456-7890'); -- 실패
2. 통화 코드 주석 정보
CREATE DOMAIN currency AS NUMBER(10,2)
CHECK WITH DOMAIN (VALUE >= 0)
ANNOTATIONS (
CURRENCY_CODE = 'USD'
);
CREATE TABLE products (product_name VARCHAR2(50), price currency);
DESCRIBE products;
Name Null? Type
------------------------------- -------- -------------
PRODUCT_NAME VARCHAR2(50)
PRICE NUMBER(10,2)
Check constraint: PRICE CHECK (VALUE>=0)
Domain name: CURRENCY
Domain properties:
CURRENCY_CODE := USD
3. JSON 스키마 유효성 검사
JSON 스키마를 사용하여 JSON 데이터의 유효성을 검사합니다.
CREATE TABLE departments (
department_id NUMBER,
department_name VARCHAR2(50),
department_json JSON CONSTRAINT ensure_json CHECK (department_json IS JSON (STRICT))
);
INSERT INTO departments (department_id, department_name, department_json)
VALUES (1, 'HR', '{"employees": [{"name": "Alice", "title": "Manager"}]}'); -- 성공
INSERT INTO departments (department_id, department_name, department_json)
VALUES (2, 'IT', '{"name": "Bob"}'); -- 실패 (스키마 위반)
결론
Oracle Database는 다양한 특수 데이터 타입을 통해 데이터 관리의 유연성과 효율성을 높입니다. 개발자는 애플리케이션의 요구 사항에 맞는 적절한 데이터 타입을 선택하여 성능을 최적화하고 데이터 무결성을 유지할 수 있습니다.