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

제약 — 길이, 범위, 패턴, 포맷

~12 min · json-schema, constraints, validation, regex

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

type 너머: 'string 인데 UUID 만' 어떻게 말하나

String 제약

  • minLength, maxLength — 문자 수 경계.
  • pattern — ECMAScript 스타일 regex. 문자열이 반드시 매칭.
  • format — 미리 정의된 이름 포맷 (email, uri, date, date-time, uuid, ipv4, ipv6, hostname, regex).

Number 제약

  • minimum, maximum — 포함 경계.
  • exclusiveMinimum, exclusiveMaximum — 제외 경계.
  • multipleOf — 이 값의 배수여야 함 (1 사용으로 number 필드에 정수 강제).

'format' 은 기본으로 권고적

중요한 함정: Draft 2020-12 에서 format 키워드는 기본적으로 제약이 아니라 annotation. "format": "email" 가 잘못된 이메일 거부 안 함, validator 를 format 강제하도록 설정해야. ajv: ajv-formats{ formats: addFormats }. Python jsonschema: format_checker=Draft202012Validator.FORMAT_CHECKER 전달.

format 함정: 팀이 "format": "email" 든 schema 보내고 기본 ajv 로 돌리고 잘못된 이메일 거부된다 가정. 안 거부됨. 부정 케이스 테스트 — 명백히 깨진 값 보내고 validator 가 불평하는지 확인. 안 하면 format 안 켜진 거.

Code

String 제약·json
{
  "type": "object",
  "properties": {
    "username": {
      "type": "string",
      "minLength": 3,
      "maxLength": 32,
      "pattern": "^[a-z0-9_-]+$"
    },
    "email":   { "type": "string", "format": "email" },
    "website": { "type": "string", "format": "uri" },
    "id":      { "type": "string", "format": "uuid" }
  }
}
Number 제약·json
{
  "type": "object",
  "properties": {
    "age":      { "type": "integer", "minimum": 0, "maximum": 150 },
    "latitude": { "type": "number", "minimum": -90, "maximum": 90 },
    "step":     { "type": "number", "multipleOf": 0.5 },
    "price":    { "type": "number", "exclusiveMinimum": 0 }
  }
}
Format 검사 켜기 (ajv + ajv-formats)·javascript
import Ajv from 'ajv/dist/2020.js';
import addFormats from 'ajv-formats';

const ajv = new Ajv();
addFormats(ajv);  // 이제 'email', 'uri', 'date-time' 등 실제로 강제

const validate = ajv.compile(schema);
const valid = validate(data);

External links

Exercise

사용자 가입 페이로드 schema 작성: username (영숫자 + 밑줄, 3-32 자), email (format), age (정수 13-120), country (정확히 2 자 문자열). 세 샘플 검증 — 유효 하나, age 범위 외 하나, email 잘못된 하나. format 검사 켜졌을 때만 email 에러 나오는 거 확인.

Progress

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

댓글 0

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

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