티스토리 뷰

Oracle DB 프로시저 글로벌 변수 세션 관리

Oracle DB 프로시저 글로벌 변수와 세션 관리

Oracle DB에서 프로시저의 글로벌 변수는 패키지를 통해 세션별로 관리됩니다. 사용자가 데이터베이스에 접속하면 새로운 세션이 생성되며, 이 세션 동안 패키지 변수의 상태가 유지됩니다. 즉, 한 사용자가 패키지 변수 값을 변경해도 다른 사용자의 세션에는 영향을 주지 않습니다.


주요 개념

  • 패키지 변수 (Package Variables):
    오라클에서 프로시저나 함수 간에 데이터를 공유하기 위한 가장 일반적인 방법은 패키지를 사용하는 것입니다. 패키지 명세부에 선언된 변수는 해당 패키지 내의 모든 프로시저와 함수에서 접근할 수 있는 글로벌 변수 역할을 합니다.
  • 세션 (Session):
    사용자가 데이터베이스에 접속하여 로그아웃할 때까지의 기간을 의미합니다. 각 세션은 독립적인 메모리 공간을 가집니다.

세션 관리 방식

패키지 변수의 값은 각 세션별로 독립적으로 유지됩니다. 예를 들어, 사용자 A가 패키지 변수의 값을 10으로 설정해도, 같은 시점에 접속한 사용자 B의 해당 변수 값은 초기 상태 그대로이거나 이전에 설정한 다른 값을 유지합니다.

작동 원리

  1. 최초 호출 시 메모리 로드: 특정 세션에서 패키지의 프로시저나 함수가 처음 호출될 때, 해당 패키지 전체가 해당 세션의 메모리(UGA - User Global Area)에 로드됩니다.
  2. 값의 유지 및 변경: 일단 메모리에 로드되면, 패키지 변수는 세션이 활성 상태인 동안 그 값을 유지합니다. 해당 세션 내에서 이 변수 값을 변경하면, 변경된 값은 세션이 끝날 때까지 유효합니다.
  3. 세션 종료 시 소멸: 사용자가 로그아웃하거나 세션이 비정상적으로 종료되면, 해당 세션에 할당되었던 패키지 변수와 그 값들은 모두 메모리에서 사라집니다.

예시 코드

아래는 세션별로 변수를 관리하는 간단한 패키지 예제입니다.

1. 패키지 명세부 (Global Variable Declaration)

CREATE OR REPLACE PACKAGE session_mgmt_pkg AS

-- 모든 세션에서 개별적으로 유지되는 글로벌 변수
g_session_variable VARCHAR2(100);
PROCEDURE set_variable (p_value IN VARCHAR2);
FUNCTION get_variable RETURN VARCHAR2;
END session_mgmt_pkg;
/

2. 패키지 본문 (Procedure and Function Implementation)

CREATE OR REPLACE PACKAGE BODY session_mgmt_pkg AS

PROCEDURE set_variable (p_value IN VARCHAR2) AS
BEGIN
g_session_variable := p_value;
DBMS_OUTPUT.PUT_LINE('변수 값 설정: ' || g_session_variable);
END set_variable;
FUNCTION get_variable RETURN VARCHAR2 AS
BEGIN
RETURN g_session_variable;
END get_variable;
END session_mgmt_pkg;
/

사용 시나리오

사용자 A의 세션:

-- 변수 값 설정

BEGIN
session_mgmt_pkg.set_variable('사용자 A의 데이터');
END;
/
-- 변수 값 확인
SELECT session_mgmt_pkg.get_variable() FROM DUAL;
-- 결과: '사용자 A의 데이터'

사용자 B의 세션 (동일한 시점):

-- 변수 값 확인 (설정 전)

SELECT session_mgmt_pkg.get_variable() FROM DUAL;
-- 결과: NULL (초기값)
-- 변수 값 설정
BEGIN
session_mgmt_pkg.set_variable('사용자 B의 고유 정보');
END;
/
-- 변수 값 확인
SELECT session_mgmt_pkg.get_variable() FROM DUAL;
-- 결과: '사용자 B의 고유 정보'

이처럼 g_session_variable이라는 패키지 변수는 각 사용자 세션별로 다른 값을 가지며 서로에게 영향을 주지 않습니다.

주의사항 및 대안

상태 비저장(Stateless) 환경에서의 주의점
웹 애플리케이션과 같이 커넥션 풀링(Connection Pooling)을 사용하는 환경에서는 동일한 데이터베이스 세션이 여러 사용자 요청에 재사용될 수 있습니다. 이 경우, 이전 사용자의 정보가 패키지 변수에 남아 다음 사용자에게 노출될 수 있으므로, 각 작업이 끝날 때마다 변수를 명시적으로 초기화하는 로직이 반드시 필요합니다.

  • 글로벌 임시 테이블 (Global Temporary Table):
    세션별 데이터를 보다 명시적으로 관리하고 싶거나 데이터의 양이 많은 경우, 글로벌 임시 테이블을 사용하는 것이 더 나은 대안이 될 수 있습니다. 글로벌 임시 테이블의 데이터 역시 세션 또는 트랜잭션 단위로만 존재하며, 세션이 종료되면 데이터는 자동으로 삭제됩니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함