2026년 10월 01일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-24004 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-24004 QUEUE does not exist 는?
ORA-24004 에러는 Oracle Advanced Queuing(AQ) 또는 Oracle Database 내에서 특정 큐(Queue)에 접근하거나 작업을 수행하려 할 때, 해당 큐가 존재하지 않을 경우 발생하는 에러입니다. 주로 DBMS_AQ, DBMS_AQADM 패키지를 사용하여 메시지 큐잉 작업을 처리할 때 잘못된 큐 이름을 참조하거나, 큐가 삭제된 상태에서 접근을 시도할 때 나타납니다. 대형 금융 시스템이나 ERP 환경에서 비동기 메시지 처리를 구현할 때 특히 자주 목격되며, 운영 환경에서 발생 시 메시지 유실이나 시스템 중단으로 이어질 수 있어 빠른 원인 파악과 조치가 필요합니다.
주요 발생 원인
1. 존재하지 않는 큐 이름 참조 (오타 또는 스키마 불일치)
가장 흔한 원인은 큐 이름을 잘못 입력하거나 스키마(소유자)를 명시하지 않아 발생하는 경우입니다. Oracle AQ에서 큐는 특정 스키마에 종속되며, SCHEMA.QUEUE_NAME 형식으로 정확히 지정해야 합니다. 예를 들어 HR.MY_QUEUE를 참조해야 하는데 단순히 MY_QUEUE로만 지정하면, 현재 세션의 스키마에서 해당 큐를 찾지 못해 ORA-24004가 발생합니다.
2. 큐가 생성되지 않았거나 삭제된 경우
배포 스크립트 실행 순서 오류, 마이그레이션 누락, 또는 운영자의 실수로 큐 자체가 생성되지 않았거나 이미 DROP된 상태일 수 있습니다. 특히 여러 환경(개발/스테이징/운영)을 관리하는 경우, 특정 환경에서만 큐가 존재하지 않아 에러가 발생하는 케이스가 많습니다. 큐 객체는 일반 테이블과 달리 DBMS_AQADM.CREATE_QUEUE로 생성해야 하므로, 일반적인 DDL 스크립트에서 누락되기 쉽습니다.
3. 권한(Privilege) 문제로 인한 큐 비가시성
큐에 대한 SELECT 또는 ENQUEUE/DEQUEUE 권한이 없는 경우, 시스템이 해당 큐를 “존재하지 않음”으로 처리하여 ORA-24004를 반환할 수 있습니다. DBA 계정이 아닌 일반 애플리케이션 계정으로 접근할 때 이 문제가 자주 발생합니다. 이는 단순한 권한 에러(ORA-01031)처럼 보이지 않고 ORA-24004로 나타나기 때문에 원인 파악이 어렵습니다.
해결 방법
원인 1: 큐 이름 및 스키마 확인
먼저 현재 데이터베이스에 어떤 큐가 존재하는지 확인합니다.
-- 현재 사용자가 접근 가능한 모든 큐 조회
SELECT OWNER, NAME, QUEUE_TYPE, ENQUEUE_ENABLED, DEQUEUE_ENABLED
FROM ALL_QUEUES
WHERE NAME = 'MY_QUEUE'; -- 찾고자 하는 큐 이름 입력
-- DBA 권한으로 전체 큐 확인
SELECT OWNER, NAME, QUEUE_TYPE, ENQUEUE_ENABLED, DEQUEUE_ENABLED
FROM DBA_QUEUES
ORDER BY OWNER, NAME;
-- 큐 테이블(Queue Table) 확인
SELECT OWNER, QUEUE_TABLE, TYPE
FROM DBA_QUEUE_TABLES;
큐 이름이 올바른지 확인 후, 정확한 스키마를 포함하여 접근합니다.
-- 잘못된 접근 방법 (스키마 미지정)
BEGIN
DBMS_AQ.ENQUEUE(
queue_name => 'MY_QUEUE', -- ORA-24004 발생 가능
...
);
END;
/
-- 올바른 접근 방법 (스키마 명시)
BEGIN
DBMS_AQ.ENQUEUE(
queue_name => 'HR.MY_QUEUE', -- 스키마.큐이름 형식
enqueue_options => l_enqueue_options,
message_properties => l_message_properties,
payload => l_payload,
msgid => l_msgid
);
END;
/
원인 2: 큐 생성 (큐가 없는 경우)
큐가 존재하지 않는다면, 큐 테이블과 큐를 순서대로 생성해야 합니다.
-- Step 1: 큐 테이블(Queue Table) 생성
BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
queue_table => 'HR.MY_QUEUE_TABLE',
queue_payload_type => 'RAW', -- 또는 사용자 정의 오브젝트 타입
comment => '메시지 처리를 위한 큐 테이블'
);
END;
/
-- Step 2: 큐(Queue) 생성
BEGIN
DBMS_AQADM.CREATE_QUEUE(
queue_name => 'HR.MY_QUEUE',
queue_table => 'HR.MY_QUEUE_TABLE',
comment => '비동기 메시지 처리 큐'
);
END;
/
-- Step 3: 큐 시작 (ENQUEUE/DEQUEUE 활성화)
BEGIN
DBMS_AQADM.START_QUEUE(
queue_name => 'HR.MY_QUEUE'
);
END;
/
-- 큐 상태 확인
SELECT NAME, ENQUEUE_ENABLED, DEQUEUE_ENABLED
FROM USER_QUEUES
WHERE NAME = 'MY_QUEUE';
원인 3: 권한 부여
애플리케이션 계정에 큐 관련 권한을 부여합니다.
-- AQ 관련 기본 권한 부여
GRANT AQ_ADMINISTRATOR_ROLE TO app_user;
-- 또는 최소 권한으로 개별 부여
BEGIN
DBMS_AQADM.GRANT_QUEUE_PRIVILEGE(
privilege => 'ENQUEUE',
queue_name => 'HR.MY_QUEUE',
grantee => 'APP_USER',
grant_option => FALSE
);
END;
/
BEGIN
DBMS_AQADM.GRANT_QUEUE_PRIVILEGE(
privilege => 'DEQUEUE',
queue_name => 'HR.MY_QUEUE',
grantee => 'APP_USER',
grant_option => FALSE
);
END;
/
-- 권한 확인
SELECT QUEUE_NAME, GRANTEE, PRIVILEGE
FROM ALL_QUEUE_PRIVILEGES
WHERE QUEUE_NAME = 'MY_QUEUE';
예방 방법
1. 큐 존재 여부를 사전 검증하는 래퍼(Wrapper) 프로시저 작성
애플리케이션 코드에서 직접 큐에 접근하기 전, 큐의 존재 여부와 상태를 확인하는 검증 로직을 항상 포함시키는 것이 Best Practice입니다. 아래와 같이 큐 상태를 확인하는 헬퍼 함수를 만들어 사용하면 예기치 않은 에러를 사전에 방지할 수 있습니다.
CREATE OR REPLACE FUNCTION is_queue_available(
p_queue_name IN VARCHAR2,
p_owner IN VARCHAR2 DEFAULT USER
) RETURN BOOLEAN IS
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM ALL_QUEUES
WHERE NAME = UPPER(p_queue_name)
AND OWNER = UPPER(p_owner)
AND ENQUEUE_ENABLED = 'YES'
AND DEQUEUE_ENABLED = 'YES';
RETURN v_count > 0;
EXCEPTION
WHEN OTHERS THEN
RETURN FALSE;
END is_queue_available;
/
-- 사용 예시
BEGIN
IF is_queue_available('MY_QUEUE', 'HR') THEN
-- 정상 ENQUEUE 로직 수행
DBMS_OUTPUT.PUT_LINE('큐 사용 가능: 메시지 전송 진행');
ELSE
-- 알림 또는 예외 처리
RAISE_APPLICATION_ERROR(-20001, '큐가 존재하지 않거나 비활성화 상태입니다.');
END IF;
END;
/
2. 배포 스크립트에 큐 초기화 검증 단계 포함 및 환경별 일관성 관리
CI/CD 파이프라인 또는 배포 스크립트에 큐 객체의 존재 여부를 자동으로 검증하는 단계를 반드시 포함시켜야 합니다. 모든 환경(개발/스테이징/운영)에서 동일한 큐 구성이 유지될 수 있도록 큐 생성 스크립트를 형상 관리 도구(Git 등)로 관리하고, 배포 전 자동화된 검증 쿼리를 실행하여 누락된 큐를 사전에 탐지하는 체계를 갖추어야 합니다.
관련 에러
- ORA-24010:
QUEUE테이블이 존재하지 않을 때 발생하며, ORA-24004와 함께 AQ 구성 문제 시 자주 동반됩니다. - ORA-24002:
QUEUE_TABLEdoes not exist — 큐 테이블 자체가 없을 때 발생하는 에러로, ORA-24004 발생 전 확인이 필요합니다. - ORA-24003: 큐가 이미 실행 중이거나 중지된 상태에서 중복 조작을 시도할 때 발생합니다.
- ORA-01031: 권한 부족 에러로, 큐 권한 문제 시 ORA-24004와 함께 발생할 수 있습니다.
- ORA-24033: 메시지를 소비할 구독자(Subscriber)가 없을 때 발생하며, AQ 구성이 불완전할 때 ORA-24004 이후 나타날 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.