본문 바로가기

ORACLE

Oracle NONEDITIONABLE 옵션

반응형

오라클(Oracle) 데이터베이스에서 `NONEDITIONABLE` 옵션은 주로 오브젝트(예: 패키지, 프로시저, 함수 등)의 에디션 기반 재정의(Edition-Based Redefinition, EBR)를 비활성화할 때 사용됩니다.


 오라클 NONEDITIONABLE 옵션: 패키지와 프로시저에서 알아두면 유용한 설정


오라클 데이터베이스에서 애플리케이션의 유지보수와 배포를 효율적으로 관리하기 위해 `Edition-Based Redefinition(EBR)`라는 기능이 도입되었습니다. EBR은 코드와 데이터를 분리하여 애플리케이션의 다운타임 없이 변경 사항을 적용할 수 있게 해주는 강력한 도구입니다. 하지만 모든 상황에서 EBR을 사용하고 싶지 않을 때가 있습니다. 이때 `NONEDITIONABLE` 옵션이 유용하게 사용됩니다. 이번 글에서는 `NONEDITIONABLE`이 무엇인지, 그리고 패키지나 프로시저에서 어떻게 활용되는지 알아보겠습니다.

 

NONEDITIONABLE이란?


`NONEDITIONABLE`은 오라클 오브젝트가 에디션 기반으로 재정의되지 않도록 지정하는 속성입니다. 기본적으로 오라클 11gR2부터 도입된 EBR 기능을 사용하면, 패키지, 프로시저, 함수 등의 오브젝트가 에디션별로 독립적으로 정의될 수 있습니다. 즉, 새로운 에디션을 만들어 기존 코드를 수정하거나 업그레이드하면서도 기존 사용자는 영향을 받지 않도록 할 수 있습니다.

그러나 `NONEDITIONABLE`을 선언하면 해당 오브젝트는 에디션 기능을 사용하지 않으며, 모든 에디션에서 동일한 정의를 유지하게 됩니다. 이는 오브젝트가 단일 버전으로만 존재해야 하는 경우나 EBR을 의도적으로 비활성화하고 싶을 때 유용합니다.

 

NONEDITIONABLE의 선언 방법


`NONEDITIONABLE`은 오브젝트를 생성하거나 수정할 때 `CREATE` 또는 `ALTER` 문에 추가할 수 있습니다. 예를 들어, 패키지와 프로시저에 적용하는 방법을 살펴보겠습니다.

1. 패키지 생성 시 적용

CREATE OR REPLACE NONEDITIONABLE PACKAGE my_package AS
  PROCEDURE my_procedure;
END my_package;
/
CREATE OR REPLACE PACKAGE BODY my_package AS
  PROCEDURE my_procedure IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('Hello, NONEDITIONABLE Package!');
  END my_procedure;
END my_package;
/



2. 프로시저 생성 시 적용

CREATE OR REPLACE NONEDITIONABLE PROCEDURE my_procedure AS
BEGIN
  DBMS_OUTPUT.PUT_LINE('This is a NONEDITIONABLE procedure.');
END my_procedure;
/



위와 같이 `NONEDITIONABLE` 키워드를 추가하면 해당 오브젝트는 에디션 간 독립성을 가지지 않고 단일 정의로 유지됩니다.

 

NONEDITIONABLE을 사용하는 이유


1. 단순성 유지: EBR은 강력하지만 복잡성을 동반합니다. 소규모 프로젝트나 EBR의 혜택이 필요 없는 환경에서는 `NONEDITIONABLE`로 설정해 관리 부담을 줄일 수 있습니다.
2. 의존성 관리: 특정 오브젝트가 다른 에디션에 종속되지 않도록 강제해야 할 때 사용됩니다. 예를 들어, 공통 유틸리티 패키지가 여러 에디션에서 동일해야 한다면 `NONEDITIONABLE`을 설정하는 것이 적합합니다.
3. **명시적 의도 전달**: 개발자가 해당 오브젝트를 에디션 기반으로 변경하지 않겠다는 의도를 팀원이나 후임자에게 명확히 전달할 수 있습니다.

 

주의할 점


- 기본값: 오라클에서 오브젝트는 기본적으로 `EDITIONABLE`로 생성됩니다(EBR이 활성화된 환경에서). 따라서 `NONEDITIONABLE`을 명시하지 않으면 EBR의 영향을 받을 수 있습니다.
- 변경 불가: 이미 `EDITIONABLE`로 생성된 오브젝트를 `NONEDITIONABLE`로 변경하려면 오브젝트를 드롭하고 다시 생성해야 합니다. 단순히 `ALTER`로는 속성을 변경할 수 없습니다.
- EBR 환경과의 충돌: EBR을 적극 활용하는 환경에서 `NONEDITIONABLE`을 사용하면 예상치 못한 동작이 발생할 수 있으니, 팀의 개발 전략과 일치시키는 것이 중요합니다.

 

실무 예제: NONEDITIONABLE의 활용


예를 들어, 회계 시스템에서 공통 계산 로직을 담은 `calc_utils` 패키지가 있다고 가정해봅시다. 이 패키지는 모든 사용자와 애플리케이션 버전에서 동일한 동작을 보장해야 합니다. 이런 경우 아래와 같이 `NONEDITIONABLE`을 설정할 수 있습니다.

CREATE OR REPLACE NONEDITIONABLE PACKAGE calc_utils AS
  FUNCTION calculate_tax(amount NUMBER) RETURN NUMBER;
END calc_utils;
/
CREATE OR REPLACE PACKAGE BODY calc_utils AS
  FUNCTION calculate_tax(amount NUMBER) RETURN NUMBER IS
  BEGIN
    RETURN amount * 0.1; -- 10% 세금 계산
  END calculate_tax;
END calc_utils;
/


이렇게 설정하면 `calc_utils` 패키지는 에디션에 상관없이 단일 버전으로 유지되며, 다른 개발자가 실수로 에디션별로 수정하는 일을 방지할 수 있습니다.

 

결론


`NONEDITIONABLE`은 오라클 데이터베이스에서 EBR의 유연성을 포기하는 대신 단순성과 일관성을 선택할 수 있게 해주는 옵션입니다. 

반응형

'ORACLE' 카테고리의 다른 글

ORACLE : RAC 환경에서의 CRS 관리  (0) 2023.11.22
ORACLE : 백업 히스토리 확인하는 방법  (0) 2023.11.22