본문 바로가기
C.W.K.
Stream
Lesson 05 of 08 · published

객체 — additionalProperties, patternProperties

~10 min · json-schema, objects, additional-properties

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

나열 안 한 property 도 정책 필요

additionalProperties

기본값은 properties 에 안 적힌 키도 그냥 통과야. 막으려면 additionalProperties: false 를 줘. 그러면 schema 가 '닫힌' 상태가 돼. 통째로 막는 대신 검사만 하고 싶으면 거기에 schema 를 넣어. { "type": "string" } 을 주면 '나머지 키는 전부 문자열이어야 한다' 는 뜻이야.

patternProperties

가끔은 property 이름 자체가 규칙을 따르기도 해. patternProperties 는 키 regex 하나에 schema 하나를 짝지어. "^env_": {"type": "string"} 이면 'env_ 로 시작하는 키는 전부 문자열' 이야. env-var 맵이나 locale 맵 ("^[a-z]{2}(-[A-Z]{2})?$") 에 자주 써.

propertyNames

키 문자열 자체에 제약을 걸 수도 있어. "propertyNames": {"pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$"} 는 '모든 키가 쓸 만한 식별자여야 한다' 는 뜻이야. JSON 키가 나중에 변수 이름이 되는 경우에 요긴해.

'기본으로 닫기' 에는 앞호환을 포기하는 대가가 따라와. additionalProperties: false 를 건 schema 는 v1 validator 에서 멀쩡한 v2 문서를 거부해. 그래서 공개 API 는 대체로 열어두거나, 닫는다면 그 정책을 문서에 못 박아. 반대로 내부에서만 쓰는 schema 는 닫아두는 일이 많고. 반사적으로 정하지 말고 의식하고 골라.

Code

additionalProperties: false (closed schema)·json
{
  "type": "object",
  "properties": {
    "id":   { "type": "integer" },
    "name": { "type": "string" }
  },
  "required": ["id", "name"],
  "additionalProperties": false
}
additionalProperties 가 schema (typed map)·json
{
  "type": "object",
  "properties": {
    "name":  { "type": "string" },
    "email": { "type": "string" }
  },
  "additionalProperties": { "type": "string" }
}
patternProperties — regex 매칭 키·json
{
  "type": "object",
  "patternProperties": {
    "^env_":     { "type": "string" },
    "_count$":   { "type": "integer", "minimum": 0 }
  },
  "additionalProperties": false
}
propertyNames — 키 자체 제약·json
{
  "type": "object",
  "propertyNames": {
    "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$"
  },
  "additionalProperties": { "type": "any" }
}

External links

Exercise

관리하고 있는 config schema 를 하나 골라. 최상위 항목마다 열어둘지 닫을지 정해봐. 그중 하나에 additionalProperties: false 를 붙이고, config 파일에 일부러 키 오타를 내서 validator 가 잡아내는 걸 봐. 30 분짜리 디버깅에서 한 번만 건져줘도 그때부터는 안 쓸 수가 없어.

Progress

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

댓글 0

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

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