세션 순수성(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(