JSON 데이터의 구조를 완벽하게 검증하는 방법

작성자: Andrew Dunstan

작성일: 2026년 3월 10일

PostgreSQL jsonb 타입의 가장 큰 장점은 유연성입니다. 열(Column)을 미리 정의하지 않고도 필요한 구조를 무엇이든 저장할 수 있죠. 하지만 이러한 유연성에는 대가가 따릅니다. 잘못된 데이터가 들어오는 것을 막을 방법이 마땅치 않다는 점입니다. jsonb 컬럼에 **CHECK 제약 조건(CHECK constraint)**을 걸 수는 있지만, 단순한 구조를 넘어선 검증 로직을 SQL이나 PL/pgSQL로 작성하다 보면 코드가 금세 복잡하고 지저분해지기 일쑤입니다.

필자는 이 문제를 해결하기 위해 **json_schema_validate**라는 PostgreSQL 확장 모듈을 개발해 왔습니다. 이 모듈을 사용하면 데이터베이스 내에서 직접 JSON 및 JSONB 데이터를 JSON 스키마(JSON Schema) 규격에 맞춰 검증할 수 있습니다. 애플리케이션 코드에서 JSON 스키마를 사용해 보셨다면 익숙한 개념일 것입니다. 그 로직이 이제 PostgreSQL 내부에서 실행되는 것입니다.

왜 데이터베이스에서 검증해야 할까요?

애플리케이션 레벨의 검증도 유용하지만, 한계가 명확합니다. 여러 애플리케이션이 동일한 테이블에 쓰기 작업을 하거나, 누군가 수동으로 INSERT를 실행하거나, 혹은 마이그레이션 스크립트가 검증 레이어를 건너뛰는 경우가 발생할 수 있기 때문입니다. **데이터베이스는 모든 데이터가 반드시 거쳐 가야 하는 ‘최후의 보루’**이므로, 데이터의 구조(Shape)를 강제하기에 가장 자연스럽고 안전한 장소입니다.

이 확장 모듈을 사용하면 CHECK 제약 조건 내에서 전체 JSON 스키마를 다음과 같이 강제할 수 있습니다.

SQL

CREATE TABLE events (
    id serial PRIMARY KEY,
    data jsonb NOT NULL CHECK (
        jsonschema_is_valid(data, '{
            "type": "object",
            "required": ["event_type", "timestamp"],
            "properties": {
                "event_type": {"type": "string", "enum": ["click", "view", "purchase"]},
                "timestamp": {"type": "string", "format": "date-time"},
                "user_id": {"type": "integer", "minimum": 1},
                "metadata": {"type": "object"}
            },
            "additionalProperties": false
        }'::jsonschema_compiled)
    )
);

여기서 ::jsonschema_compiled 캐스팅이 중요합니다. 이는 PostgreSQL에 스키마를 매번 행마다 다시 파싱하지 말고, 한 번만 파싱한 뒤 캐싱하도록 지시하는 역할을 합니다.


지원 기능

이 익스텐션은 JSON Schema Draft 7의 방대한 기능을 지원합니다. 타입 검증, 필수 속성(required), 열거형(enum), 상수(const)와 같은 기본 기능은 물론, 그 이상의 고급 기능도 포함합니다.

1. 문자열 검증 (String validation)

minLength, maxLength, pattern(POSIX 정규식)을 지원하며 날짜, 이메일, IP 주소, URI, UUID와 같은 공통 형식에 대한 format 검증을 제공합니다.

SQL

SELECT jsonschema_is_valid(
    '"2024-01-15T09:30:00Z"',
    '{"type": "string", "format": "date-time"}'
); -- 결과: true

2. 숫자 검증 (Numeric validation)

minimum, maximum, exclusiveMinimum, exclusiveMaximum, multipleOf 등을 지원합니다.

SQL

SELECT jsonschema_is_valid(
    '{"price": 9.99}',
    '{
        "type": "object",
        "properties": {
            "price": {"type": "number", "exclusiveMinimum": 0, "multipleOf": 0.01}
        }
    }'
); -- 결과: true

3. 배열 및 객체 검증

배열의 요소 수 제한(minItems/maxItems)이나 중복 제거(uniqueItems), 객체의 속성 이름 패턴 매칭(patternProperties) 등을 지원합니다. 특히 if/then/else를 이용한 조건부 스키마도 사용 가능하여 데이터 값에 따라 검증 로직을 다르게 적용할 수 있습니다.


두 가지 모드: 불리언(Boolean)과 에러 상세(Errors)

단순 검증이나 CHECK 제약 조건에서는 **jsonschema_is_valid()**를 사용하여 true/false를 반환받습니다. 하지만 무엇이 잘못되었는지 구체적으로 알고 싶다면 jsonschema_validate() 함수를 사용하면 됩니다. 이 함수는 에러가 발생한 경로(Path)와 설명을 담은 JSON 배열을 반환합니다.

SQL

SELECT jsonschema_validate(
    '{"name": 123, "tags": "not-an-array"}',
    '{
        "properties": {
            "name": {"type": "string"},
            "tags": {"type": "array", "items": {"type": "string"}}
        }
    }'
);
-- 결과: 
-- [{"path": "name", "message": "Expected type string but got number"},
--  {"path": "tags", "message": "Expected type array but got string"}]

이는 상세한 에러 메시지를 사용자에게 전달해야 하는 트리거 함수나 애플리케이션 로직을 작성할 때 매우 유용합니다.


성능 테스트: pg_jsonschema와의 비교

PostgreSQL에서 JSON 스키마를 검증하는 또 다른 유명한 옵션은 Rust 기반의 pg_jsonschema(Supabase 개발)입니다. 필자는 PostgreSQL 17.2 환경에서 10만 행의 데이터를 대상으로 두 익스텐션의 성능을 비교해 보았습니다.

테스트 시나리오json_schema_validatepg_jsonschema성능 차이
속성 및 타입 검증 (jsonb)59 ms348 ms5.9배 빠름
속성 및 타입 검증 (json)80 ms334 ms4.2배 빠름
정규식(Regex) 패턴 매칭 (jsonb)48 ms3,502 ms73배 빠름
검증 실패 케이스 (jsonb)16 ms148 ms9배 빠름

성능 차이의 원인

  1. C 기반의 네이티브 처리: json_schema_validate는 C로 작성되어 PostgreSQL 내부 데이터 표현 방식을 직접 다룹니다. Rust/serde 구조체로 변환하는 오버헤드가 없습니다.
  2. 정규식 캐싱: 특히 정규식 테스트에서 73배나 빠른 이유는 컴파일된 정규식 패턴을 세션 레벨의 해시 테이블에 캐싱하기 때문입니다. 매번 패턴을 재컴파일하는 비용을 획기적으로 줄였습니다.

마무리하며

json_schema_validate는 현재 Draft 7 사양의 핵심 기능을 대부분 지원하며, 향후 prefixItems나 외부 참조($ref) 기능 등을 추가해 나갈 예정입니다. PostgreSQL의 강력한 jsonb를 활용하면서도 데이터의 무결성을 잃고 싶지 않은 엔지니어들에게 이 익스텐션은 최고의 선택지가 될 것입니다.

이 모듈은 PostgreSQL 라이선스 하에 GitHub에서 소스 코드를 확인할 수 있으며, PostgreSQL 14 이상의 환경에서 빌드하여 바로 사용할 수 있습니다.


SEO 최적화 정보

항목내용
Focus KeyphrasePostgreSQL JSON Schema validation
SEO TitlePostgreSQL JSON 데이터 검증을 위한 json_schema_validate 확장 모듈 가이드
Slugpostgresql-json-schema-validate-extension-performance
Meta DescriptionPostgreSQL에서 JSON 및 jsonb 데이터를 JSON 스키마로 검증하는 법을 알아보세요. 신규 C 기반 익스텐션으로 pg_jsonschema 대비 최대 73배 빠른 성능을 경험할 수 있습니다.
TagPostgreSQL, jsonb, JSON Schema, 데이터베이스 검증, 데이터 무결성, SQL 성능, 오픈소스 익스텐션, EDB

PostgreSQL의 복잡한 JSON 데이터를 더 안전하고 효율적으로 관리하고 싶으신가요? EDB의 전문가들이 귀사의 데이터베이스 아키텍처 최적화를 도와드립니다. 지금 바로 문의해 주세요!

메일: salesinquiry@enterprisedb.com

Visited 3 times, 3 visit(s) today