PostgreSQL 42622 오류 원인과 해결 방법 완벽 가이드

42622
2026년 09월 09일 | DBMS Error 가이드

이 글에서 다루는 내용

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

42622 name too long 는?

PostgreSQL 에러 코드 42622는 데이터베이스 객체(테이블, 컬럼, 인덱스, 함수, 뷰 등)의 이름이 PostgreSQL이 허용하는 최대 길이를 초과했을 때 발생하는 에러입니다. PostgreSQL은 내부적으로 식별자(identifier)의 길이를 NAMEDATALEN 상수로 제한하며, 기본값은 64바이트로 설정되어 있어 실질적으로 사용할 수 있는 이름의 최대 길이는 63바이트입니다(null terminator 1바이트 제외). 특히 멀티바이트 문자(한글, 중국어, 일본어 등)를 사용할 경우 문자 수와 바이트 수가 다르기 때문에, 생각보다 훨씬 적은 수의 문자만으로도 이 제한에 걸릴 수 있어 주의가 필요합니다.


주요 발생 원인

  • 객체 이름이 63바이트를 초과하는 경우

가장 직접적인 원인으로, 테이블명, 컬럼명, 인덱스명, 시퀀스명, 함수명 등 어떤 데이터베이스 객체라도 이름이 63바이트를 넘으면 이 에러가 발생합니다. 특히 자동화 스크립트나 ORM(예: Django, SQLAlchemy, Hibernate)이 규칙에 따라 이름을 자동 생성할 때, 테이블명과 컬럼명을 조합해 인덱스나 외래 키 제약 이름을 만드는 과정에서 의도치 않게 길이를 초과하는 경우가 매우 빈번합니다.

  • 한글 등 멀티바이트 문자 사용

PostgreSQL의 63바이트 제한은 ‘문자 수’가 아닌 ‘바이트 수’ 기준입니다. UTF-8 인코딩에서 한글 한 글자는 3바이트를 차지하기 때문에, 한글로만 이름을 구성하면 단 21자만으로도 제한에 도달합니다. 한글과 영문, 숫자를 혼용하는 환경에서는 이 계산이 더욱 복잡해지므로, 멀티바이트 문자를 식별자에 사용할 때는 반드시 바이트 단위로 길이를 확인해야 합니다.

  • 마이그레이션 또는 DDL 자동 생성 도구 사용

Flyway, Liquibase, Alembic 같은 마이그레이션 도구나 ORM의 자동 DDL 생성 기능을 사용할 때, 개발 환경(예: MySQL, Oracle)에서는 허용되었던 긴 이름이 PostgreSQL로 이관 시 에러를 유발하는 경우가 많습니다. 또한 인덱스 이름을 명시하지 않고 자동 생성에 맡길 경우, {테이블명}_{컬럼명1}_{컬럼명2}_idx 형태로 이름이 만들어지면서 손쉽게 63바이트를 초과하게 됩니다.


해결 방법

원인 1 해결: 객체 이름 직접 단축

가장 근본적인 해결책은 63바이트 이하로 이름을 직접 수정하는 것입니다. 이미 생성된 객체라면 ALTER 명령으로 이름을 변경합니다.

-- 에러 발생 예시: 이름이 너무 긴 테이블 생성 시도
CREATE TABLE user_profile_extended_information_storage_table (
    id SERIAL PRIMARY KEY
);
-- ERROR:  42622: identifier "user_profile_extended_information_storage_table" exceeds maximum allowed length of 63

-- 해결: 이름을 63바이트 이하로 단축
CREATE TABLE user_profile_ext_info (
    id SERIAL PRIMARY KEY
);

-- 이미 존재하는 객체 이름 변경
ALTER TABLE user_profile_extended_information_storage_table
    RENAME TO user_profile_ext_info;

-- 이름의 바이트 길이 사전 확인 방법
SELECT octet_length('user_profile_extended_information_storage_table') AS byte_length;
-- byte_length: 47 (이 경우는 OK, 63 초과 시 에러)

원인 2 해결: 멀티바이트 문자 길이 검증 후 처리

한글 등 멀티바이트 문자를 식별자로 사용하기 전에 반드시 바이트 길이를 확인해야 합니다.

-- 한글 이름의 바이트 수 확인
SELECT 
    '사용자프로필확장정보저장테이블' AS name,
    char_length('사용자프로필확장정보저장테이블') AS char_count,
    octet_length('사용자프로필확장정보저장테이블') AS byte_count;
-- char_count: 15, byte_count: 45 (한글 1자 = 3바이트)

-- 21자 한글 이름 예시 (63바이트 = 한계)
SELECT octet_length('가나다라마바사아자차카타파하가나다라마바사') AS byte_count;
-- byte_count: 63 (딱 한계)

-- 22자 한글이면 66바이트로 에러 발생
-- 해결: 간결한 이름 또는 영문 약어 사용
CREATE TABLE 사용자프로필 (  -- 6자 = 18바이트 (안전)
    아이디 SERIAL PRIMARY KEY,
    이름 VARCHAR(100)
);

-- 더 안전한 방법: 영문 식별자 사용 권고
CREATE TABLE user_profile (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100)
);

원인 3 해결: 인덱스 및 제약 이름 명시적 지정

ORM이나 마이그레이션 도구 사용 시 이름을 자동 생성에 맡기지 말고 반드시 명시적으로 지정합니다.

-- 문제가 될 수 있는 자동 생성 패턴
CREATE TABLE order_management_system_transactions (
    id SERIAL PRIMARY KEY,
    customer_identification_number INTEGER,
    product_category_classification_code VARCHAR(50)
);

-- 자동 생성되는 인덱스 이름이 너무 길어 에러 발생 가능
CREATE INDEX ON order_management_system_transactions 
    (customer_identification_number, product_category_classification_code);
-- 자동 생성명: order_management_system_transactions_customer_identification_number_p...
-- ERROR: 42622

-- 해결: 인덱스 이름 명시적 지정 (63바이트 이하로)
CREATE INDEX idx_oms_trans_cust_prod 
    ON order_management_system_transactions 
    (customer_identification_number, product_category_classification_code);

-- 외래 키 제약 이름도 명시적으로 지정
ALTER TABLE order_management_system_transactions
    ADD CONSTRAINT fk_oms_trans_customer
    FOREIGN KEY (customer_identification_number)
    REFERENCES customers(id);

-- 현재 DB 내 63바이트 초과 위험 객체 사전 점검 쿼리
SELECT 
    relname AS object_name,
    octet_length(relname) AS byte_length,
    relkind AS object_type
FROM pg_class
WHERE octet_length(relname) > 50  -- 50바이트 이상인 것 미리 점검
ORDER BY byte_length DESC;

예방 방법

  • 명명 규칙(Naming Convention) 표준 수립 및 자동 검증 도입

팀 내에서 데이터베이스 객체 명명 규칙을 문서화하고, 모든 식별자는 영문 소문자, 숫자, 언더스코어만 사용하며 최대 40바이트(안전 마진 확보)를 넘지 않도록 규칙을 정합니다. CI/CD 파이프라인에 DDL 린팅 도구(예: sqlfluff)를 통합하거나, 아래와 같은 점검 쿼리를 마이그레이션 전 자동으로 실행하여 위반 여부를 사전에 탐지합니다.

“`sql

— 마이그레이션 전 이름 길이 사전 검증 함수

CREATE OR REPLACE FUNCTION check_identifier_length(identifier TEXT)

RETURNS BOOLEAN AS $$

BEGIN

IF octet_length(identifier) > 63 THEN

RAISE EXCEPTION ‘42622: Identifier “%” exceeds 63 bytes (actual: % bytes)’,

identifier, octet_length(identifier);

END IF;

RETURN TRUE;

END;

$$ LANGUAGE plpgsql;

— 사용 예시

SELECT check_identifier_length(‘my_table_name_that_might_be_too_long_for_postgresql’);

“`

  • ORM 및 마이그레이션 도구 설정에서 명시적 이름 지정 강제화

Django, SQLAlchemy, Hibernate 등 ORM을 사용할 때 인덱스, 외래 키, 유니크 제약 등에 대해 항상 name 파라미터를 명시적으로 지정하는 코드 리뷰 규칙을 수립합니다. 또한 pg_constraint, pg_class, pg_indexes 뷰를 주기적으로 조회하여 이름 길이가 50바이트를 초과하는 객체를 모니터링하는 주기적 점검 체계를 운영합니다.


관련 에러

  • 42601 (syntax_error): DDL 구문 자체가 잘못된 경우로, 이름 문제보다는 SQL 문법 오류에서 발생합니다. 42622와 함께 DDL 작성 시 자주 마주치는 에러입니다.
  • 42710 (duplicate_object): 동일한 이름의 객체가 이미 존재할 때 발생하는 에러로, 이름을 단축하여 변경하다가 기존 객체와 충돌할 때 함께 발생할 수 있습니다.
  • 42P07 (duplicate_table): 같은 이름의 테이블이 이미 존재할 때 발생하며, 이름 변경 과정에서 42622와 연계되어 나타날 수 있습니다.
  • 42939 (reserved_name): PostgreSQL 내부 예약어를 식별자로 사용하려 할 때 발생하는 에러로, 명명 규칙 수립 시 함께 고려해야 합니다.
DBMS 에러 코드 시리즈

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

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

댓글 남기기