Oracle ORA-12725 오류 원인과 해결 방법 완벽 가이드

ORA-12725
2026년 09월 17일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-12725 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-12725 unmatched parentheses in regular expression 는?

ORA-12725 에러는 Oracle의 정규 표현식(Regular Expression) 함수에서 괄호가 올바르게 짝을 이루지 않을 때 발생하는 오류입니다. REGEXP_LIKE, REGEXP_REPLACE, REGEXP_SUBSTR, REGEXP_INSTR, REGEXP_COUNT 등의 함수에서 패턴 문자열에 열리는 괄호 (와 닫히는 괄호 )의 수가 일치하지 않거나, 잘못된 위치에 사용되었을 때 Oracle 엔진이 이 에러를 발생시킵니다. 이 에러는 정규 표현식 패턴 자체의 문법 오류이므로 실행 시점(Runtime)이 아닌 파싱 시점에서 즉시 감지됩니다.


주요 발생 원인

1. 닫는 괄호 또는 여는 괄호 누락

가장 흔한 원인으로, 복잡한 정규 표현식 패턴을 작성하다 보면 괄호의 짝이 맞지 않는 실수를 범하기 쉽습니다. 특히 그룹핑((...))이나 대안 패턴((a|b|c))을 사용할 때, 여러 중첩 괄호 사이에서 하나를 빠뜨리는 경우가 빈번하게 발생합니다. 초보 개발자뿐만 아니라 숙련된 DBA도 긴 패턴 문자열을 다룰 때 종종 실수합니다.

2. 이스케이프 처리 오류로 인한 괄호 인식 실패

정규 표현식에서 리터럴 괄호 문자(문자 그 자체로서의 ( 또는 ))를 표현하려면 반드시 백슬래시(\)로 이스케이프 처리를 해야 합니다. 그런데 이스케이프 처리를 빠뜨리거나 잘못 적용하면, Oracle은 해당 괄호를 그룹핑 연산자로 인식하여 짝이 맞지 않는다고 판단합니다. 또한 Oracle SQL에서 백슬래시 자체를 표현하기 위한 추가적인 처리가 필요할 수 있어 이중으로 혼란이 발생하기도 합니다.

3. 동적 SQL에서 문자열 연결로 패턴 생성 시 발생하는 오류

애플리케이션 코드나 PL/SQL에서 사용자 입력 값이나 변수를 이용해 정규 표현식 패턴을 동적으로 생성할 때, 입력 값에 괄호가 포함된 경우 의도치 않게 패턴이 깨질 수 있습니다. 예를 들어 사용자가 (서울)이라는 검색어를 입력하면, 이를 패턴에 직접 삽입했을 때 괄호가 정규 표현식 문법으로 해석되어 짝이 맞지 않거나 의도치 않은 동작을 유발합니다. 동적 패턴 생성 시에는 반드시 특수문자 이스케이프 처리 로직이 포함되어야 합니다.


해결 방법

원인 1 해결: 괄호 개수 확인 및 수정

괄호의 짝이 맞는지 먼저 수동으로 세어 확인합니다.

-- 잘못된 예 (닫는 괄호 누락)
SELECT *
FROM employees
WHERE REGEXP_LIKE(phone_number, '(\d{3}-(\d{4}');
-- ORA-12725 발생

-- 올바른 예 (괄호 짝 맞춤)
SELECT *
FROM employees
WHERE REGEXP_LIKE(phone_number, '(\d{3})-(\d{4})');

-- 복잡한 패턴 예: 이메일 검증
SELECT email
FROM employees
WHERE REGEXP_LIKE(email, '^([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,})$');

패턴 검증을 위한 간단한 테스트 쿼리를 활용하면 좋습니다:

-- 패턴 단독 테스트 (dual 활용)
SELECT REGEXP_SUBSTR('test@example.com',
       '^([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,})$')
FROM dual;

원인 2 해결: 리터럴 괄호 이스케이프 처리

정규 표현식에서 괄호 자체를 문자로 매칭하려면 \(\)를 사용합니다.

-- 잘못된 예: 괄호를 리터럴로 쓰려 했지만 이스케이프 누락
SELECT *
FROM employees
WHERE REGEXP_LIKE(phone_number, '(02)');
-- ORA-12725 발생 또는 의도치 않은 동작

-- 올바른 예: 백슬래시로 이스케이프
SELECT *
FROM employees
WHERE REGEXP_LIKE(phone_number, '\(02\)');

-- 실전 예: 지역번호 포함 전화번호 패턴 매칭
SELECT employee_id, phone_number
FROM employees
WHERE REGEXP_LIKE(phone_number, '\(\d{2,3}\)-\d{3,4}-\d{4}');

-- REGEXP_REPLACE 활용 예
SELECT REGEXP_REPLACE('전화: (02)1234-5678',
       '\((\d{2,3})\)', '[\1]') AS replaced_text
FROM dual;

원인 3 해결: 동적 패턴의 특수문자 이스케이프 처리 함수 작성

-- 특수문자 자동 이스케이프 함수 작성
CREATE OR REPLACE FUNCTION escape_regexp(p_str IN VARCHAR2)
RETURN VARCHAR2
IS
BEGIN
    -- 정규 표현식 특수문자를 이스케이프 처리
    RETURN REGEXP_REPLACE(p_str,
           '([\\^$.|?*+(){}\[\]])',
           '\\\1');
END escape_regexp;
/

-- 활용 예: 사용자 입력값을 안전하게 패턴으로 사용
DECLARE
    v_user_input  VARCHAR2(100) := '(서울)';
    v_pattern     VARCHAR2(200);
    v_result      NUMBER;
BEGIN
    -- 특수문자 이스케이프 처리 후 패턴 생성
    v_pattern := escape_regexp(v_user_input);

    SELECT COUNT(*)
    INTO v_result
    FROM employees
    WHERE REGEXP_LIKE(department_name, v_pattern);

    DBMS_OUTPUT.PUT_LINE('매칭 건수: ' || v_result);
END;
/

-- 동적 패턴 생성 시 REGEXP_INSTR 활용 예
SELECT employee_id, first_name
FROM employees
WHERE REGEXP_INSTR(first_name,
      escape_regexp('(A)'), 1, 1, 0) > 0;

예방 방법

1. 정규 표현식 패턴 단위 테스트 습관화

복잡한 정규 표현식 패턴을 프로덕션 코드에 적용하기 전에, 반드시 DUAL 테이블을 이용한 단위 테스트를 먼저 수행하는 습관을 들여야 합니다. 패턴이 길어질수록 괄호 오류가 발생할 가능성이 높아지므로, 패턴을 작은 단위로 쪼개어 테스트한 후 조합하는 방식으로 개발하면 오류를 사전에 방지할 수 있습니다. 또한 온라인 정규 표현식 검증 도구(예: regex101.com)를 활용하여 Oracle POSIX ERE 문법에 맞게 패턴을 검증한 후 SQL에 적용하는 것을 권장합니다.

-- 패턴을 단계적으로 테스트하는 예
-- Step 1: 기본 패턴 테스트
SELECT REGEXP_SUBSTR('010-1234-5678', '\d{3}') FROM dual;

-- Step 2: 그룹 추가 후 테스트
SELECT REGEXP_SUBSTR('010-1234-5678', '(\d{3})-(\d{4})') FROM dual;

-- Step 3: 전체 패턴 테스트
SELECT REGEXP_SUBSTR('010-1234-5678', '^(\d{3})-(\d{3,4})-(\d{4})$') FROM dual;

2. 코드 리뷰 체크리스트에 정규 표현식 검증 항목 추가

팀 개발 환경에서는 코드 리뷰 단계에서 정규 표현식 패턴을 반드시 검토하는 체크리스트 항목을 추가해야 합니다. 특히 동적 SQL로 패턴을 생성하는 경우, 사용자 입력 데이터가 패턴에 그대로 삽입되지 않도록 이스케이프 함수 적용 여부를 의무적으로 확인해야 합니다. 이를 통해 ORA-12725뿐만 아니라 잠재적인 SQL Injection 위험도 함께 예방할 수 있습니다.


관련 에러

  • ORA-12722: invalid regular expression – 정규 표현식 자체의 문법이 잘못된 경우 발생하며, ORA-12725와 함께 자주 마주치는 에러입니다.
  • ORA-12726: unmatched bracket in regular expression – 대괄호([, ])의 짝이 맞지 않을 때 발생하며, ORA-12725의 괄호 버전과 유사한 형태의 에러입니다.
  • ORA-12727: invalid back reference in regular expression – 존재하지 않는 그룹을 역참조(\1, \2 등)할 때 발생합니다.
  • ORA-12728: invalid range in regular expression – 문자 클래스 내에서 잘못된 범위(예: [z-a])를 지정할 때 발생합니다.
  • ORA-12732: invalid interval value in regular expression{n,m} 형태의 반복 횟수 지정이 잘못되었을 때 발생합니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기