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

22032
2026년 10월 25일 | DBMS Error 가이드

이 글에서 다루는 내용

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

22032 invalid json text 는?

PostgreSQL 에러 코드 22032 invalid json text는 JSON 형식이 유효하지 않은 문자열을 JSON 타입으로 변환하거나 처리하려 할 때 발생하는 에러입니다. 주로 ::json 캐스팅, json_ 계열 함수, 또는 JSON 컬럼에 데이터를 삽입할 때 입력값이 JSON 표준 문법(RFC 7159)을 따르지 않을 경우 트리거됩니다. 애플리케이션 레이어에서 JSON을 동적으로 생성하거나, 외부 시스템에서 데이터를 수신할 때 특히 자주 마주치는 에러입니다.


주요 발생 원인

  • 따옴표 오류 및 이스케이프 처리 미흡

JSON 표준에서는 문자열 값을 반드시 큰따옴표(")로 감싸야 합니다. 작은따옴표를 사용하거나, 문자열 내부의 특수 문자(백슬래시, 제어 문자 등)를 제대로 이스케이프하지 않으면 파싱 오류가 발생합니다. 예를 들어 {'name': 'Hong'} 같은 Python 딕셔너리 형태의 문자열은 PostgreSQL JSON 파서가 거부합니다.

  • 불완전한 JSON 구조 (괄호 미일치, 누락된 값)

중괄호({}), 대괄호([])가 열리고 닫히지 않거나, 콤마 뒤에 키-값 쌍이 누락된 경우 유효하지 않은 JSON이 됩니다. 애플리케이션에서 JSON을 문자열 연결(concatenation) 방식으로 동적으로 생성하다 보면 이런 구조적 오류가 빈번하게 발생합니다. 특히 배열의 마지막 요소 뒤에 불필요한 쉼표(trailing comma)가 붙는 경우도 대표적인 원인입니다.

  • NULL, 빈 문자열, 비JSON 텍스트의 잘못된 캐스팅

빈 문자열('')이나 일반 텍스트 문자열을 ::json으로 직접 캐스팅하면 에러가 발생합니다. 외부 API 응답이나 CSV 임포트 데이터에서 JSON 필드가 빈 값으로 들어오는 경우, 또는 "null"(문자열)과 null(JSON null)을 혼동하여 처리할 때도 이 에러가 발생할 수 있습니다.


해결 방법

원인 1: 따옴표 오류 수정

잘못된 따옴표 사용 예시와 올바른 형태를 비교합니다.

-- ❌ 잘못된 예: 작은따옴표 사용 (Python dict 형태)
SELECT '{"name": ''Hong''}'::json;  -- 이 경우는 될 수도 있지만 아래는 안 됨
SELECT '{''name'': ''Hong''}'::json;  -- 에러 발생

-- ✅ 올바른 예: 큰따옴표 사용
SELECT '{"name": "Hong"}'::json;

-- ✅ 특수문자 이스케이프 처리
SELECT '{"path": "C:\\\\Users\\\\data"}'::json;

-- ✅ 백슬래시가 포함된 경우 $$ 달러 쿼팅 활용
SELECT $${"message": "Hello\nWorld"}$$::json;

원인 2: 불완전한 JSON 구조 진단 및 수정

json_typeof, pg_try_cast (PostgreSQL 16+) 또는 예외 처리를 통해 유효성을 사전 검증합니다.

-- ❌ 잘못된 예: trailing comma
SELECT '{"id": 1, "name": "test",}'::json;  -- 에러 발생

-- ❌ 잘못된 예: 닫는 괄호 누락
SELECT '{"id": 1, "name": "test"'::json;  -- 에러 발생

-- ✅ 올바른 JSON 구조
SELECT '{"id": 1, "name": "test"}'::json;

-- ✅ 유효성 검사 함수 작성 (에러를 NULL로 처리)
CREATE OR REPLACE FUNCTION safe_to_json(p_text TEXT)
RETURNS JSON AS $$
BEGIN
    RETURN p_text::json;
EXCEPTION
    WHEN invalid_text_representation THEN
        RETURN NULL;
END;
$$ LANGUAGE plpgsql;

-- 사용 예
SELECT safe_to_json('{"valid": true}');   -- {"valid": true}
SELECT safe_to_json('{invalid json}');     -- NULL 반환 (에러 없음)
SELECT safe_to_json('');                   -- NULL 반환 (에러 없음)

-- ✅ 배치 데이터 검증: 유효하지 않은 행 찾기
SELECT id, raw_data
FROM staging_table
WHERE safe_to_json(raw_data) IS NULL
  AND raw_data IS NOT NULL;

원인 3: NULL 및 빈 문자열 처리

-- ❌ 잘못된 예: 빈 문자열 캐스팅
SELECT ''::json;  -- 에러 발생

-- ✅ NULLIF로 빈 문자열을 NULL로 변환 후 처리
SELECT NULLIF(col_value, '')::json
FROM your_table;

-- ✅ CASE 문을 활용한 안전한 캐스팅
SELECT
    id,
    CASE
        WHEN col_value IS NULL OR col_value = '' THEN NULL
        WHEN col_value = 'null' THEN 'null'::json
        ELSE col_value::json
    END AS safe_json
FROM your_table;

-- ✅ JSONB 타입으로의 안전한 데이터 삽입
INSERT INTO events (user_id, payload)
VALUES (
    1,
    COALESCE(NULLIF('', ''), '{}')::jsonb
);

-- ✅ json vs jsonb 타입 선택 (jsonb 권장)
-- jsonb는 저장 시 유효성 검사 + 이진 저장으로 성능 우수
CREATE TABLE user_profiles (
    id SERIAL PRIMARY KEY,
    data JSONB NOT NULL DEFAULT '{}'
);

실무 활용: 외부 데이터 임포트 시 유효성 검사 파이프라인

-- 스테이징 테이블로 원시 데이터 수신
CREATE TABLE raw_import (
    id SERIAL,
    raw_json TEXT,
    imported_at TIMESTAMPTZ DEFAULT NOW()
);

-- 유효한 JSON만 운영 테이블로 이동
INSERT INTO production_events (payload, created_at)
SELECT raw_json::jsonb, imported_at
FROM raw_import
WHERE safe_to_json(raw_json) IS NOT NULL;

-- 유효하지 않은 행은 에러 로그 테이블로 이동
INSERT INTO import_errors (raw_data, error_reason, logged_at)
SELECT raw_json, 'invalid_json_format', NOW()
FROM raw_import
WHERE safe_to_json(raw_json) IS NULL;

예방 방법

  • 애플리케이션 레이어에서 JSON 직렬화 라이브러리 사용

JSON 문자열을 직접 문자열 연결로 생성하지 말고, 반드시 언어의 공식 JSON 직렬화 라이브러리(Python의 json.dumps(), Java의 ObjectMapper, Node.js의 JSON.stringify())를 사용하세요. 데이터베이스로 전달하기 전에 애플리케이션 레이어에서 JSON 유효성을 검증하는 미들웨어 또는 DTO 검증 로직을 추가하는 것이 최선입니다. PostgreSQL 컬럼 타입을 json 대신 jsonb로 설정하면 삽입 시 자동으로 유효성 검사가 이루어져 잘못된 데이터가 저장되는 것을 원천 차단할 수 있습니다.

  • CHECK 제약 조건과 트리거를 활용한 DB 레벨 가드

테이블 설계 단계에서 JSON 컬럼에 CHECK 제약 조건을 추가하거나, BEFORE INSERT/UPDATE 트리거를 사용하여 유효하지 않은 JSON이 저장되기 전에 차단하는 방어 로직을 구현하세요. 운영 환경에서는 jsonb 타입이 이미 유효성 검사를 내장하고 있으므로, 가능하면 json 타입보다 jsonb 타입 사용을 표준으로 정하는 것이 팀 전체의 실수를 줄이는 데 효과적입니다.


관련 에러

  • 22P02 invalid_text_representation: ::json 또는 ::jsonb 캐스팅 실패 시 함께 발생하는 상위 카테고리 에러 코드입니다. 22032는 이 에러의 JSON 특화 버전입니다.
  • 22023 invalid_parameter_value: json_extract_path, jsonb_set 등 JSON 함수에 잘못된 경로나 인자를 전달할 때 발생합니다.
  • 42804 datatype_mismatch: JSON 값을 기대하는 컬럼에 완전히 다른 데이터 타입을 삽입하려 할 때 발생합니다.
  • 22001 string_data_right_truncation: JSON 문자열이 해당 컬럼의 최대 길이를 초과할 때 발생하며, 대용량 JSON 처리 시 함께 주의해야 합니다.
DBMS 에러 코드 시리즈

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

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

댓글 남기기