2026년 08월 02일 | DBMS Error 가이드
이 글에서 다루는 내용
01P01 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
01P01 deprecated feature 는?
PostgreSQL 에러 코드 01P01은 deprecated feature, 즉 “더 이상 권장되지 않는 기능”을 사용했을 때 발생하는 경고(Warning) 수준의 메시지입니다. 이 에러는 치명적인 오류가 아니라 SQLState 클래스 01(Warning)에 속하며, 현재는 동작하지만 향후 PostgreSQL 버전에서 제거되거나 변경될 가능성이 있는 문법, 함수, 또는 기능을 사용했음을 알려줍니다. 실무에서는 마이그레이션 작업, 레거시 코드 유지보수, 또는 오래된 드라이버를 사용하는 환경에서 자주 마주치게 됩니다.
주요 발생 원인
- 구버전 문법 또는 비표준 SQL 사용
PostgreSQL은 버전이 올라가면서 일부 구문이나 함수가 표준 SQL에 맞게 변경되거나 새로운 함수로 대체됩니다. 예를 들어 timestamp with time zone 관련 구형 캐스팅 방식이나, 구버전의 :: 연산자 남용, 또는 abstime, reltime, tinterval과 같이 이미 PostgreSQL 12에서 제거된 데이터 타입을 계속 사용하는 경우 이 경고가 발생할 수 있습니다. 특히 PostgreSQL 8.x~9.x 시절에 작성된 레거시 코드를 최신 버전으로 마이그레이션할 때 빈번하게 나타납니다.
- 사용 중단 예정 함수(Deprecated Function) 호출
특정 내장 함수들은 새로운 함수로 대체되면서 deprecated 상태가 됩니다. 예를 들어 pg_stat_reset() 대신 더 세분화된 통계 초기화 함수 사용을 권장하거나, to_timestamp(double precision) 방식 대신 ISO 표준 형식을 권장하는 경우가 있습니다. 이런 함수들은 현재 버전에서는 동작하지만, 경고 메시지를 통해 개발자에게 코드 수정을 유도합니다.
- 구버전 설정 파라미터(GUC) 사용
postgresql.conf 또는 SET 명령어로 이미 deprecated 처리된 파라미터를 설정하려 할 때도 01P01 경고가 발생합니다. PostgreSQL 버전이 올라가면서 일부 GUC(Grand Unified Configuration) 파라미터는 이름이 바뀌거나 다른 파라미터로 통합됩니다. 예를 들어 default_with_oids 파라미터는 PostgreSQL 12에서 deprecated되어 PostgreSQL 13에서 완전히 제거되었으며, 이를 계속 사용하면 경고 또는 오류가 발생합니다.
해결 방법
1. 구버전 문법 교체
deprecated된 데이터 타입이나 문법을 현재 권장 방식으로 교체합니다.
-- 잘못된 예 (deprecated 타입 사용: abstime, reltime)
-- PostgreSQL 12 이전에서만 동작, 이후 버전에서는 제거됨
SELECT CAST('2023-01-01' AS abstime);
-- 권장 방법: 표준 타입 사용
SELECT CAST('2023-01-01' AS timestamptz);
-- 구버전 OID 포함 테이블 생성 (deprecated)
CREATE TABLE old_table (id INT) WITH OIDS;
-- 권장 방법: OID 없이 생성 (PostgreSQL 12+에서는 WITH OIDS 자체가 제거됨)
CREATE TABLE new_table (
id INT,
name TEXT
);
2. deprecated 함수 대체 함수로 교체
-- deprecated 방식: epoch 기반 타임스탬프 변환 (일부 버전에서 경고 발생)
SELECT to_timestamp(1609459200.0);
-- 권장 방법: 명확한 ISO 8601 형식 사용
SELECT to_timestamp('2021-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
-- 통계 관련 deprecated 함수 대신 세분화된 함수 사용
-- 구버전 방식
SELECT pg_stat_reset();
-- 권장 방법: 특정 대상만 초기화
SELECT pg_stat_reset_single_table_counters('myschema.mytable'::regclass);
SELECT pg_stat_reset_single_function_counters('myfunction'::regproc);
-- deprecated 된 시스템 컬럼 조회 방식 확인 및 교체
-- 구버전: tableoid, xmin 등을 직접 캐스팅하는 비표준 방식
SELECT oid::text FROM pg_class WHERE relname = 'mytable';
-- 권장 방법
SELECT oid FROM pg_class WHERE relname = 'mytable';
3. deprecated GUC 파라미터 교체
-- deprecated 파라미터 확인 (현재 설정된 파라미터 목록 조회)
SELECT name, setting, short_desc
FROM pg_settings
WHERE name IN (
'default_with_oids',
'sql_inheritance',
'escape_string_warning'
)
ORDER BY name;
-- 세션 레벨에서 deprecated 파라미터 설정 시도 (경고 발생 예시)
-- SET default_with_oids = on; -- PostgreSQL 13+에서는 ERROR 발생
-- postgresql.conf에서 deprecated 파라미터 제거 후 권장 파라미터로 대체
-- 변경 전: default_with_oids = on
-- 변경 후: 해당 설정 제거 (기본값 off)
-- 현재 deprecated 경고를 발생시키는 파라미터 탐지용 쿼리
SELECT name, setting, source
FROM pg_settings
WHERE source NOT IN ('default', 'override')
AND name LIKE '%oid%'
ORDER BY name;
4. deprecated 경고 로그 수집 및 분석
-- 로그에서 deprecated 관련 메시지 발생 빈도 확인을 위한 로그 설정
-- postgresql.conf 설정 권장값
-- log_min_messages = warning
-- log_min_error_statement = warning
-- 현재 로그 설정 확인
SHOW log_min_messages;
SHOW log_min_error_statement;
-- pg_catalog을 이용한 deprecated 객체 탐색
SELECT p.proname, p.prokind, p.proisstrict,
pg_get_functiondef(p.oid) AS func_def
FROM pg_proc p
JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE n.nspname = 'public'
AND pg_get_functiondef(p.oid) ILIKE '%abstime%'
OR pg_get_functiondef(p.oid) ILIKE '%reltime%';
예방 방법
- 정기적인 PostgreSQL 릴리스 노트(Release Notes) 검토 및 업그레이드 전 테스트 자동화
PostgreSQL 신버전이 출시될 때마다 공식 릴리스 노트의 “Deprecations” 및 “Incompatibilities” 항목을 반드시 검토하는 습관을 들여야 합니다. 특히 메이저 버전 업그레이드(예: 14→15, 15→16) 전에는 pg_upgrade를 활용한 사전 검증과 함께, CI/CD 파이프라인에 deprecated 기능 탐지 스크립트를 포함시켜 코드베이스 전체를 자동으로 스캔하는 체계를 구축하세요. 아래와 같이 PGSSLMODE, PGAPPNAME 등 환경 변수 수준의 점검도 포함하면 더욱 완벽합니다.
“`sql
— 버전 확인 및 호환성 체크 쿼리
SELECT version();
SELECT current_setting(‘server_version_num’)::int AS version_num;
— 14만 해당: 향후 제거 예정 기능 사용 여부 점검
SELECT count(*) AS deprecated_func_usage
FROM pg_stat_user_functions f
JOIN pg_proc p ON f.funcid = p.oid
WHERE p.proname IN (‘pg_stat_reset’); — 예시
“`
- 코드 리뷰 시 PostgreSQL Lint 도구 및
check_postgres활용
pgTAP, plpgsql_check, check_postgres 등의 도구를 CI 파이프라인에 통합하여 deprecated 기능 사용을 조기에 감지하세요. 또한 DB 스키마 변경 시에는 반드시 pg_dump로 현재 스키마를 덤프하고, 새 버전의 PostgreSQL 인스턴스에 복원하여 경고 메시지 발생 여부를 확인하는 절차를 표준 배포 프로세스에 포함시키는 것이 좋습니다.
관련 에러
01000(Warning): 일반적인 경고 메시지로,01P01의 상위 클래스에 해당합니다. deprecated feature 외에도 다양한 경고 상황에서 발생합니다.42704(Undefined Object): deprecated된 타입이나 함수가 완전히 제거된 후 해당 객체를 참조하면 발생하는 오류입니다.01P01경고를 무시하다가 메이저 업그레이드 이후 이 에러를 만나는 경우가 많습니다.0A000(Feature Not Supported): 특정 버전에서 완전히 지원이 중단된 기능을 사용할 때 발생합니다.01P01이 경고라면0A000은 실제 실행 차단 오류입니다.HV00M(FDW Deprecated): Foreign Data Wrapper 관련 deprecated 기능 사용 시 발생할 수 있는 연관 경고 코드입니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.