세션 순수성 (Session Purity) 유지

세션 순수성(Session Purity)이란 무엇인가?

오라클 데이터베이스에서 세션 순수성이란 각 세션이 독립적인 환경에서 실행되어, 다른 세션의 작업에 영향을 받지 않도록 보장하는 개념입니다. 이는 다중 사용자 환경에서 데이터 무결성을 유지하고 예측 가능한 결과를 얻는 데 매우 중요합니다.

세션 순수성이 깨지는 주된 원인은 다음과 같습니다.

  • 전역 임시 테이블(Global Temporary Tables): 세션 간에 데이터를 공유할 수 있어, 다른 세션의 데이터에 영향을 줄 수 있습니다.
  • 전역 변수(Global Variables): 패키지 변수 등을 통해 세션 간에 상태가 공유될 수 있습니다.
  • 최적화 환경(Optimizer Environment): 세션 수준에서 설정된 최적화 관련 파라미터가 다른 세션에 영향을 줄 수 있습니다.

세션 순수성 유지가 중요한 이유

세션 순수성을 유지하는 것은 다음과 같은 중요한 이점을 제공합니다.

  • 데이터 무결성: 각 세션이 독립적으로 작동하므로, 다른 세션의 오류나 변경 사항이 현재 세션의 데이터에 영향을 미치지 않습니다.
  • 예측 가능성: 세션의 동작이 항상 일관되게 유지되므로, 개발 및 디버깅이 용이합니다.
  • 병렬 처리 성능 향상: 각 세션이 독립적으로 실행되므로, 병렬 처리 환경에서 성능 저하를 최소화할 수 있습니다.
  • 보안 강화: 불필요한 정보 공유를 방지하여 보안을 강화할 수 있습니다.

세션 순수성 유지 방법

세션 순수성을 유지하기 위한 몇 가지 주요 방법을 살펴보겠습니다.

1. 전역 임시 테이블 사용 제한

전역 임시 테이블은 데이터를 여러 세션에서 공유하므로, 세션 순수성을 해칠 수 있습니다. 가능하면 프라이빗 임시 테이블(Private Temporary Table) 또는 커서 지속 기간 임시 테이블(Cursor-Duration Temporary Table)을 사용하는 것이 좋습니다.

예시:

-- 전역 임시 테이블 생성 (세션 간 데이터 공유 가능)CREATE GLOBAL TEMPORARY TABLE my_gtt (  id NUMBER,  value VARCHAR2(50));-- 프라이빗 임시 테이블 생성 (현재 세션에서만 데이터 접근 가능)CREATE PRIVATE TEMPORARY TABLE ORA$PTT_my_ptt (  id NUMBER,  value VARCHAR2(50))  ON COMMIT PRESERVE DEFINITION;  -- 커서-지속 기간 임시 테이블 (커서 종료 시 데이터 자동 삭제)CREATE GLOBAL TEMPORARY TABLE my_ctt (  id NUMBER,  value VARCHAR2(50))  ON COMMIT DELETE ROWS;

2. 패키지 변수 사용 시 주의

패키지 변수는 세션 간에 상태를 유지할 수 있으므로, 세션 순수성을 해칠 수 있습니다. 필요하다면 세션별로 초기화하거나 특정 값을 설정하여 사용해야 합니다.

예시:

-- 패키지 변수 선언CREATE OR REPLACE PACKAGE my_package AS  session_id NUMBER;END;-- 패키지 초기화 (세션별로 초기화 필요)CREATE OR REPLACE PROCEDURE initialize_session_id ASBEGIN  my_package.session_id := SYS_CONTEXT('USERENV', 'SESSIONID');END;

3. 최적화 관련 파라미터 설정

최적화 관련 파라미터는 SQL 실행 계획에 영향을 미치므로, 세션 수준에서 설정을 변경하는 경우 주의해야 합니다. ALTER SESSION 명령을 사용하여 세션 수준에서 변경할 수 있지만, 가능하면 애플리케이션에 미치는 영향을 고려해야 합니다.

예시:

-- 최적화 모드 변경 (세션 수준)ALTER SESSION SET OPTIMIZER_MODE = ALL_ROWS;

4. 연결 풀링 (Connection Pooling) 활용

연결 풀링은 데이터베이스 연결을 재사용하여 성능을 향상시키는 기법입니다. 하지만 연결 풀링을 사용할 때, 세션 상태가 초기화되지 않으면 예상치 못한 문제가 발생할 수 있습니다.

예시:

-- 연결 풀에서 연결 획득 후 세션 초기화Connection conn = dataSource.getConnection();try {  // 세션 상태 초기화  Statement stmt = conn.createStatement();  stmt.execute(
    
    
		
		
			
위로 스크롤