반응형

오라클 데이터베이스에서 패키지(Package)는 관련된 함수와 프로시저, 변수, 상수, 커서를 하나의 그룹으로 묶은 PL/SQL 프로그램 단위입니다. 패키지는 코드 재사용성을 높이고, 유지보수를 용이하게 하며, 성능 최적화를 가능하게 하는 강력한 기능을 제공합니다.

이번 글에서는 오라클 패키지의 개념, 작성법, 다양한 유형의 예제, 활용 시 주의사항 등을 자세히 설명합니다.


1. 오라클 패키지란?

오라클 패키지는 관련 있는 PL/SQL 구성 요소(프로시저, 함수, 변수 등)를 논리적으로 묶어서 하나의 단위로 관리합니다. 패키지는 두 부분으로 구성됩니다:

  • 패키지 사양(Specification): 패키지의 인터페이스를 정의합니다. (사용 가능한 함수, 프로시저, 변수 등을 선언)
  • 패키지 본체(Body): 패키지 사양에 정의된 구성 요소의 구현부를 포함합니다.

1.1. 패키지의 장점

  1. 재사용성: 여러 응용 프로그램에서 재사용 가능.
  2. 캡슐화: 내부 구현을 숨기고, 외부에 필요한 인터페이스만 제공합니다.
  3. 성능 개선: 패키지의 첫 실행 후 메모리에 로드되어 빠른 접근 가능.
  4. 유지보수성: 관련 코드의 묶음 관리로 코드 유지보수가 용이.
  5. 보안: 특정 사용자나 응용 프로그램에 패키지의 일부만 노출 가능.

2. 오라클 패키지 작성법

패키지를 작성하려면 다음 두 단계를 거칩니다:

2.1. 패키지 사양(Specification)

패키지에 포함될 프로시저, 함수, 변수, 상수, 커서 등의 선언을 작성합니다.

CREATE OR REPLACE PACKAGE 패키지명 IS
   -- 변수 선언
   변수명 데이터타입;
   -- 상수 선언
   상수명 CONSTANT 데이터타입 := 값;
   -- 프로시저 선언
   PROCEDURE 프로시저명(매개변수 IN 데이터타입);
   -- 함수 선언
   FUNCTION 함수명(매개변수 IN 데이터타입) RETURN 데이터타입;
END 패키지명;
/

2.2. 패키지 본체(Body)

패키지 사양에 선언된 구성 요소의 구현부를 작성합니다.

CREATE OR REPLACE PACKAGE BODY 패키지명 IS
   -- 프로시저 구현
   PROCEDURE 프로시저명(매개변수 IN 데이터타입) IS
   BEGIN
      -- 로직 작성
   END 프로시저명;

   -- 함수 구현
   FUNCTION 함수명(매개변수 IN 데이터타입) RETURN 데이터타입 IS
   BEGIN
      -- 로직 작성
      RETURN 값;
   END 함수명;
END 패키지명;
/

3. 간단한 패키지 예제

3.1. 사원 정보를 조회하는 패키지

패키지 사양

CREATE OR REPLACE PACKAGE emp_package IS
   PROCEDURE display_employee(emp_id IN NUMBER);
   FUNCTION get_employee_salary(emp_id IN NUMBER) RETURN NUMBER;
END emp_package;
/

패키지 본체

CREATE OR REPLACE PACKAGE BODY emp_package IS
   -- 사원 정보 출력
   PROCEDURE display_employee(emp_id IN NUMBER) IS
      emp_name VARCHAR2(100);
   BEGIN
      SELECT first_name || ' ' || last_name INTO emp_name
      FROM employees
      WHERE employee_id = emp_id;

      DBMS_OUTPUT.PUT_LINE('사원 이름: ' || emp_name);
   END display_employee;

   -- 사원 급여 반환
   FUNCTION get_employee_salary(emp_id IN NUMBER) RETURN NUMBER IS
      salary NUMBER;
   BEGIN
      SELECT salary INTO salary
      FROM employees
      WHERE employee_id = emp_id;

      RETURN salary;
   END get_employee_salary;
END emp_package;
/

호출 예제

BEGIN
   -- 프로시저 호출
   emp_package.display_employee(101);

   -- 함수 호출
   DBMS_OUTPUT.PUT_LINE('사원 급여: ' || emp_package.get_employee_salary(101));
END;
/

4. 패키지의 다양한 활용 예제

4.1. 글로벌 변수를 사용하는 패키지

패키지 사양

CREATE OR REPLACE PACKAGE global_package IS
   -- 글로벌 변수
   g_counter NUMBER := 0;

   -- 프로시저 선언
   PROCEDURE increase_counter;
   PROCEDURE reset_counter;
   FUNCTION get_counter RETURN NUMBER;
END global_package;
/

패키지 본체

CREATE OR REPLACE PACKAGE BODY global_package IS
   -- 카운터 증가
   PROCEDURE increase_counter IS
   BEGIN
      g_counter := g_counter + 1;
   END increase_counter;

   -- 카운터 초기화
   PROCEDURE reset_counter IS
   BEGIN
      g_counter := 0;
   END reset_counter;

   -- 카운터 값 반환
   FUNCTION get_counter RETURN NUMBER IS
   BEGIN
      RETURN g_counter;
   END get_counter;
END global_package;
/

호출 예제

BEGIN
   global_package.increase_counter;
   global_package.increase_counter;
   DBMS_OUTPUT.PUT_LINE('현재 카운터 값: ' || global_package.get_counter);

   global_package.reset_counter;
   DBMS_OUTPUT.PUT_LINE('리셋 후 카운터 값: ' || global_package.get_counter);
END;
/

4.2. 커서를 사용하는 패키지

패키지 사양

CREATE OR REPLACE PACKAGE cursor_package IS
   PROCEDURE list_all_employees;
END cursor_package;
/

패키지 본체

CREATE OR REPLACE PACKAGE BODY cursor_package IS
   PROCEDURE list_all_employees IS
      CURSOR emp_cursor IS
         SELECT employee_id, first_name, last_name FROM employees;
      emp_record emp_cursor%ROWTYPE;
   BEGIN
      OPEN emp_cursor;
      LOOP
         FETCH emp_cursor INTO emp_record;
         EXIT WHEN emp_cursor%NOTFOUND;
         DBMS_OUTPUT.PUT_LINE(emp_record.employee_id || ': ' || emp_record.first_name || ' ' || emp_record.last_name);
      END LOOP;
      CLOSE emp_cursor;
   END list_all_employees;
END cursor_package;
/

호출 예제

BEGIN
   cursor_package.list_all_employees;
END;
/

4.3. 패키지 초기화 블록 사용

패키지 본체에서 초기화 블록을 사용하면 패키지가 처음 호출될 때 초기화 작업을 수행할 수 있습니다.

패키지 본체

CREATE OR REPLACE PACKAGE BODY init_package IS
   g_initialized BOOLEAN := FALSE;

   PROCEDURE initialize IS
   BEGIN
      IF NOT g_initialized THEN
         DBMS_OUTPUT.PUT_LINE('패키지 초기화 중...');
         g_initialized := TRUE;
      END IF;
   END initialize;
BEGIN
   initialize;
END init_package;
/

5. 패키지 사용 시 주의사항

  1. 캡슐화 및 모듈화
    패키지 내부 구현은 외부에 노출되지 않으므로 필요한 인터페이스만 공개하도록 설계합니다.
  2. 초기화 블록 사용
    초기화 블록은 필요하지 않은 경우 성능 저하를 유발할 수 있으므로 주의해서 사용합니다.
  3. 패키지의 의존성 관리
    패키지가 다른 객체에 의존하는 경우, 의존성이 변경되면 패키지도 재컴파일해야 합니다.
  4. 오버헤드 관리
    지나치게 큰 패키지는 유지보수와 성능 면에서 문제가 될 수 있습니다. 적절히 분리합니다.

6. 결론

오라클 패키지는 관련된 프로시저, 함수, 변수 등을 묶어서 관리할 수 있는 강력한 기능을 제공합니다. 이를 통해 코드의 재사용성과 유지보수성을 크게 향상시킬 수 있습니다.
패키지를 설계할 때는 모듈화, 캡슐화, 성능 최적화를 염두에 두고, 사용 사례에 맞는 적절한 구성 요소를 설계해야 합니다.

패키지를 활용하여 데이터베이스 작업의 효율성을 높여보세요!

반응형

+ Recent posts