C.W.K.
Stream
Lesson 07 of 08 · published

$ref 와 $defs — 재사용 가능한 조각

~12 min · json-schema, ref, defs, reuse

Level 0평문
0 XP0/64 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

Schema 가 자라; 재사용이 sane 유지

$defs — 로컬 정의

$defs 는 이름 붙은 sub-schema 의 최상위 dictionary. 모양 한 번 정의; 같은 문서 어디서나 $ref 로 참조. 옛 definitions 키워드 (Draft-07) 를 대체.

$ref — schema 포인터

$ref 는 URI Reference 받아. 같은 문서 ref 는 JSON Pointer fragment: #/$defs/Address. 외부 문서 ref 는 전체 URL: https://example.com/address.schema.json. 대부분 validator 가 외부 ref 를 HTTP fetch + 캐시로 해결, 또는 '먼저 이 schema 들 로컬 로드' API 로.

$id — 서로 참조하는 schema

각 schema 문서에 안정적인 $id URL. 다른 schema 가 그걸 참조. validator 의 일은 $id 일관되게 해결 — 검증 전 필요한 모든 schema 를 validator 에 로드, 교차 참조가 투명하게 작동.

원칙: schema 는 그냥 JSON. 코드처럼 다뤄 — 반복되는 모양을 $defs 로 추출, 잘 이름 붙이고, $ref 로 재사용. address 객체 세 번 복붙된 50 줄 schema 는 리팩토링 냄새.

Code

한 문서의 $defs + $ref·json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id":     "https://example.com/order.schema.json",
  "type":    "object",
  "properties": {
    "billing_address":  { "$ref": "#/$defs/Address" },
    "shipping_address": { "$ref": "#/$defs/Address" }
  },
  "required": ["billing_address"],
  "$defs": {
    "Address": {
      "type": "object",
      "properties": {
        "street":      { "type": "string" },
        "city":        { "type": "string" },
        "postal_code": { "type": "string" }
      },
      "required": ["street", "city", "postal_code"]
    }
  }
}
교차 문서 $ref·json
{
  "$id":    "https://example.com/user.schema.json",
  "type":   "object",
  "properties": {
    "address": { "$ref": "https://example.com/address.schema.json" }
  }
}
검증 전 schema 로드 (ajv 예시)·javascript
import Ajv from 'ajv/dist/2020.js';

const ajv = new Ajv();
ajv.addSchema(addressSchema);  // $id: .../address.schema.json
ajv.addSchema(userSchema);     // $id 로 address 참조

const validate = ajv.getSchema('https://example.com/user.schema.json');
const valid = validate(data);

External links

Exercise

직접 작성한 실제 schema (또는 OpenAPI 의 chunk 같은 거) 골라. 두 번 이상 반복되는 모양 식별. $defs/Name 으로 추출하고 중복을 $ref 로 교체. schema 가 여전히 작동하는지 검증. diff 가 $defs 가 존재하는 이유의 before/after.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.