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_validate | pg_jsonschema | 성능 차이 |
| 속성 및 타입 검증 (jsonb) | 59 ms | 348 ms | 5.9배 빠름 |
| 속성 및 타입 검증 (json) | 80 ms | 334 ms | 4.2배 빠름 |
| 정규식(Regex) 패턴 매칭 (jsonb) | 48 ms | 3,502 ms | 73배 빠름 |
| 검증 실패 케이스 (jsonb) | 16 ms | 148 ms | 9배 빠름 |
성능 차이의 원인
- C 기반의 네이티브 처리:
json_schema_validate는 C로 작성되어 PostgreSQL 내부 데이터 표현 방식을 직접 다룹니다. Rust/serde 구조체로 변환하는 오버헤드가 없습니다. - 정규식 캐싱: 특히 정규식 테스트에서 73배나 빠른 이유는 컴파일된 정규식 패턴을 세션 레벨의 해시 테이블에 캐싱하기 때문입니다. 매번 패턴을 재컴파일하는 비용을 획기적으로 줄였습니다.
마무리하며
json_schema_validate는 현재 Draft 7 사양의 핵심 기능을 대부분 지원하며, 향후 prefixItems나 외부 참조($ref) 기능 등을 추가해 나갈 예정입니다. PostgreSQL의 강력한 jsonb를 활용하면서도 데이터의 무결성을 잃고 싶지 않은 엔지니어들에게 이 익스텐션은 최고의 선택지가 될 것입니다.
이 모듈은 PostgreSQL 라이선스 하에 GitHub에서 소스 코드를 확인할 수 있으며, PostgreSQL 14 이상의 환경에서 빌드하여 바로 사용할 수 있습니다.
SEO 최적화 정보
| 항목 | 내용 |
| Focus Keyphrase | PostgreSQL JSON Schema validation |
| SEO Title | PostgreSQL JSON 데이터 검증을 위한 json_schema_validate 확장 모듈 가이드 |
| Slug | postgresql-json-schema-validate-extension-performance |
| Meta Description | PostgreSQL에서 JSON 및 jsonb 데이터를 JSON 스키마로 검증하는 법을 알아보세요. 신규 C 기반 익스텐션으로 pg_jsonschema 대비 최대 73배 빠른 성능을 경험할 수 있습니다. |
| Tag | PostgreSQL, jsonb, JSON Schema, 데이터베이스 검증, 데이터 무결성, SQL 성능, 오픈소스 익스텐션, EDB |
PostgreSQL의 복잡한 JSON 데이터를 더 안전하고 효율적으로 관리하고 싶으신가요? EDB의 전문가들이 귀사의 데이터베이스 아키텍처 최적화를 도와드립니다. 지금 바로 문의해 주세요!
메일: salesinquiry@enterprisedb.com

