본문 바로가기
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 키워드는 제약이 아니라 그냥 설명이야. "format": "email" 이라고 써놔도 잘못된 이메일을 거부하지 않아. validator 쪽에서 format 을 강제하도록 따로 켜줘야 해. ajv 면 ajv-formatsaddFormats 를 붙이고, 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 는 딱 두 글자 문자열로. 샘플 셋을 검증해. 멀쩡한 거 하나, age 가 범위를 벗어난 거 하나, email 이 틀린 거 하나. 그리고 email 에러는 format 검사를 켰을 때만 나온다는 걸 직접 확인해.

Progress

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

댓글 0

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

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