빠른 비교
{
"type": "object",
"properties": {
"email": {
"type": "string",
"format": "email"
},
"code": {
"type": "string",
"pattern": "^[A-Z]{3}-[0-9]{4}$"
},
"age": {
"type": "integer",
"minimum": 0,
"maximum": 130
}
}
}제약 방식
문자열 길이는 minLength, maxLength로 제한한다
문자열이 비어 있으면 안 되거나, 특정 길이를 넘으면 안 되는 규칙은 정규식보다 길이 keyword가 더 명확합니다. minLength: 1은 빈 문자열을 막고, maxLength는 저장소나 UI 표시 길이 제한을 schema에 드러냅니다.
{
"type": "string",
"minLength": 1,
"maxLength": 80
}길이 제약은 값의 의미보다 형태에 가깝습니다. "이 값은 반드시 이메일이어야 한다"는 의미 검증은 format이나 서버 검증을 함께 고려해야 합니다.
pattern은 부분 매치가 기본이므로 anchor를 명시한다
JSON Schema의 pattern은 정규식이 문자열 전체와 일치해야 한다는 뜻이 아닙니다. 정규식이 문자열 어딘가에 매치되면 통과합니다. 전체 형태를 제한하려면 ^와 $를 붙여 범위를 명확히 하는 편이 안전합니다.
{
"type": "string",
"pattern": "^[A-Z]{3}-[0-9]{4}$"
}"p" 같은 pattern은 "apple"도 통과시킵니다. 전체 코드 형식을 검증하려는 경우에는 anchor 없는 pattern이 예상보다 느슨한 schema를 만들기 쉽습니다.
format은 기본적으로 annotation으로 볼 수 있다
format: "email"이나 format: "date-time"은 값의 의미를 알려주는 데 유용합니다. 다만 JSON Schema에서 format은 validator 설정에 따라 검증 실패를 만들 수도 있고, 단순 annotation으로 무시될 수도 있습니다. validator가 어떤 format을 assertion으로 처리하는지 확인해야 합니다.
{
"type": "string",
"format": "date-time"
}API 경계에서 반드시 막아야 하는 규칙이라면 format만 믿지 말고 validator 설정, 별도 서버 검증, 테스트 케이스를 함께 둡니다.
숫자 범위는 minimum, maximum, multipleOf로 표현한다
숫자는 범위와 단위를 명확히 적는 것이 중요합니다. minimum, maximum은 포함 경계이고, exclusiveMinimum, exclusiveMaximum은 제외 경계입니다. 금액 단위처럼 특정 간격만 허용해야 하면 multipleOf를 사용합니다.
{
"type": "number",
"minimum": 0,
"exclusiveMaximum": 100,
"multipleOf": 0.01
}금액을 부동소수점 number로 검증할 때는 구현 언어의 정밀도 문제도 같이 고려해야 합니다. 결제 금액처럼 정확도가 중요하면 정수 cent 단위나 decimal string 설계가 더 안전할 수 있습니다.
선택 기준
| 목적 | keyword |
|---|---|
| 빈 문자열 차단 | minLength: 1 |
| 최대 입력 길이 제한 | maxLength |
| 고정 코드 형식 검증 | pattern + ^...$ |
| 이메일, 날짜 같은 의미 표시 | format |
| 숫자 범위 제한 | minimum, maximum |
| 특정 단위 간격 제한 | multipleOf |
주의사항
pattern은 전체 일치가 아니라 부분 매치입니다. 전체 형식을 제한하려면 anchor를 명시해야 합니다.
{
"pattern": "p"
}위 schema는 "p"뿐 아니라 "apple"도 통과시킬 수 있습니다.
format 검증은 validator 설정에 따라 달라질 수 있습니다. 보안이나 결제처럼 실패 처리가 중요한 입력은 format만으로 검증했다고 보지 말고 서버 검증과 테스트를 함께 두세요.
참고 링크
3 sources