들어가며
오라클 데이터베이스는 객체 지향 프로그래밍의 장점을 관계형 데이터베이스에 통합하기 위해 다양한 객체-관계형(Object-Relational) 기능을 제공합니다. 이러한 기능을 활용하면 데이터 모델링을 더욱 유연하게 수행하고, 복잡한 비즈니스 로직을 데이터베이스 내에서 효율적으로 처리할 수 있습니다.
객체-관계형 기능의 주요 특징
- 객체 타입(Object Types): 사용자 정의 데이터 타입을 생성하여 복잡한 데이터 구조를 표현할 수 있습니다.
- 컬렉션(Collections): 테이블 내에 여러 개의 값을 저장할 수 있는 VARRAY 또는 NESTED TABLE 타입을 사용하여 1:N 관계를 효율적으로 관리합니다.
- 메서드(Methods): 객체 타입에 정의된 메서드를 통해 데이터에 대한 연산을 캡슐화하고 재사용성을 높입니다.
- 참조(References): 객체 간의 관계를 REF 타입을 사용하여 표현하고, 객체 간의 탐색을 용이하게 합니다.
객체 타입 생성 및 사용 예시
먼저, 주소 정보를 담는 객체 타입을 생성합니다.
CREATE TYPE address_t AS OBJECT (
street VARCHAR2(100),
city VARCHAR2(50),
state VARCHAR2(2),
zip VARCHAR2(10)
);
/
다음으로, 이 객체 타입을 사용하여 직원 테이블을 생성합니다.
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
employee_name VARCHAR2(100),
employee_address address_t
);
직원 테이블에 데이터를 삽입하는 예시입니다.
INSERT INTO employees (employee_id, employee_name, employee_address)
VALUES (
1,
'홍길동',
address_t('강남대로 123', '서울', 'KL', '12345')
);
직원 정보를 조회하는 예시입니다.
SELECT e.employee_name, e.employee_address.city
FROM employees e;
실행 결과:
EMPLOYEE_NAME EMPLOYEE_ADDRESS.CITY
--------------------------------------------------
홍길동 서울
컬렉션 타입 생성 및 사용 예시
취미 정보를 담는 VARRAY 타입을 생성합니다. VARRAY 타입은 크기가 고정된 배열을 의미합니다.
CREATE TYPE hobby_list_t AS VARRAY(3) OF VARCHAR2(50);
/
이 컬렉션 타입을 사용하여 직원 테이블을 생성합니다.
CREATE TABLE employees (
employee_id NUMBER PRIMARY KEY,
employee_name VARCHAR2(100),
hobbies hobby_list_t
);
직원 테이블에 데이터를 삽입하는 예시입니다.
INSERT INTO employees (employee_id, employee_name, hobbies)
VALUES (
1,
'홍길동',
hobby_list_t('독서', '여행', '영화감상')
);
직원 정보를 조회하는 예시입니다.
SELECT e.employee_name, e.hobbies
FROM employees e;
실행 결과:
EMPLOYEE_NAME HOBBIES
-------------------------------------------------------------
홍길동 HOBBY_LIST_T('독서', '여행', '영화감상')
메서드 생성 및 사용 예시
객체 타입에 메서드를 추가하여 특정 연산을 수행할 수 있습니다. 다음은 면적을 계산하는 메서드를 가진 원 객체 타입을 생성하는 예시입니다.
CREATE TYPE circle_t AS OBJECT (
radius NUMBER,
MEMBER FUNCTION area RETURN NUMBER
);
/
CREATE TYPE BODY circle_t AS
MEMBER FUNCTION area RETURN NUMBER IS
BEGIN
RETURN radius * radius * 3.14;
END;
END;
/
생성된 객체 타입을 사용하여 테이블을 만들고 데이터를 삽입합니다.
CREATE TABLE circles (
circle_id NUMBER PRIMARY KEY,
circle circle_t
);
INSERT INTO circles (circle_id, circle)
VALUES (1, circle_t(10));
메서드를 호출하여 면적을 계산하는 예시입니다.
SELECT c.circle.area() FROM circles c;
실행 결과:
C.CIRCLE.AREA()
---------------------
314
참조 타입 생성 및 사용 예시
REF 타입을 사용하여 객체 간의 관계를 설정할 수 있습니다. 다음은 부서 정보를 참조하는 REF 타입을 직원 테이블에 추가하는 예시입니다.
CREATE TABLE departments (
department_id NUMBER PRIMARY KEY,
department_name VARCHAR2(100)
);
ALTER TABLE employees
ADD (department_ref REF department_t SCOPE IS departments);
부서 테이블에 데이터를 삽입합니다.
INSERT INTO departments (department_id, department_name)
VALUES (10, '인사부');
직원 테이블에 부서 정보를 참조하는 데이터를 삽입합니다.
INSERT INTO employees (employee_id, employee_name, department_ref)
VALUES (
1,
'홍길동',
(SELECT REF(d) FROM departments d WHERE d.department_id = 10)
);
REF 타입을 사용하여 부서 정보를 조회하는 예시입니다.
SELECT e.employee_name, DEREF(e.department_ref).department_name
FROM employees e;
실행 결과:
EMPLOYEE_NAME DEREF(E.DEPARTMENT_REF).DEPARTMENT_NAME
----------------------------------------------------------
홍길동 인사부
마치며
오라클 데이터베이스의 객체-관계형 기능을 활용하면 데이터 모델링 및 애플리케이션 개발을 더욱 강력하고 유연하게 수행할 수 있습니다. 제공되는 다양한 기능을 숙지하고 활용하여 효율적인 데이터베이스 애플리케이션을 개발하시기 바랍니다.