..

Search

18) 스키마 결합

스키마 결합


스키마 결합

JSON 스키마에서는 다음 키워드를 사용하여 여러 JSON 스키마를 결합할 수 있습니다.

 

1. allOf

2. anyOf

3. oneOf


allOf

allOf 키워드를 사용하여 명시된 배열에 나열된 모든 JSON 스키마를 한 번에 검사할 수 있습니다.

이때 배열에 나열된 스키마에 대한 검증을 모두 통과해야 합니다.

 

다음 예제는 해당 문자열 데이터의 길이가 3 이상이고 5 이하인지를 검사하는 예제입니다.

예제

{
    "allOf": [
        {"minLength"3},
        {"maxLength"5}
    ]
}

 

위의 예제에서는 해당 문자열 데이터의 길이가 최소 3 이상인지를 검사하는 스키마와 해당 문자열 데이터의 길이가 최대 5 이하인지를 검사하는 스키마가 있습니다.

이때 allOf 키워드를 사용하여 두 스키마를 결합하므로, 두 스키마의 검증을 모두 통과하는 데이터만이 검증을 통과할 것입니다.

 

따라서 "abc", "1234"와 같이 문자열의 길이가 3 이상이고 5 이하인 문자열만이 검증을 통과합니다.


anyOf

anyOf 키워드를 사용하여 명시된 배열에 나열된 모든 JSON 스키마를 한 번에 검사할 수 있습니다.

이때 배열에 나열된 하나 이상의 스키마에 대한 검증을 통과해야 합니다.

 

다음 예제는 해당 데이터가 문자열이나 숫자인지를 검사하는 예제입니다.

예제

{
    "anyOf": [
        {"type""string"},
        {"type""number"}
    ]
}

 

위의 예제에서는 해당 데이터가 문자열인지를 검사하는 스키마와 숫자인지를 검사하는 스키마가 결합하여 있습니다.

여기에 anyOf 키워드를 사용했으므로, 두 스키마 중 어느 하나의 검증을 통과하는 데이터만이 검증을 통과할 것입니다.

 

따라서 문자열과 숫자만이 검증을 통과합니다.


oneOf

oneOf 키워드를 사용하여 명시된 배열에 나열된 모든 JSON 스키마를 한 번에 검사할 수 있습니다.

이때 배열에 나열된 오직 하나의 스키마에 대한 검증만을 통과해야 합니다.

 

다음 예제는 해당 데이터가 숫자이면서 3의 배수이거나, 아니면 숫자이면서 4의 배수인지를 검사하는 예제입니다.

예제

{
    "oneOf": [
        { "type": "number", "multipleOf": 3 },
        { "type": "number", "multipleOf": 4 }
    ]
}

 

위의 예제에서는 해당 데이터가 숫자이면서 3의 배수인지를 검사하는 스키마와 숫자이면서 4의 배수인지를 검사하는 스키마가 결합하여 있습니다.

여기에 oneOf 키워드를 사용했으므로, 두 스키마 중 오직 하나의 검증만을 통과하는 데이터만이 검증을 통과할 것입니다.

 

따라서 3, 6, 9와 같은 3의 배수와 4, 8, 16과 같은 4의 배수는 검증을 통과합니다.

하지만 12, 24, 36과 같은 3과 4의 공배수는 검증을 통과할 수 없습니다.


not

not 키워드를 사용하여 명시된 JSON 스키마를 만족하지 않는 데이터만을 검사할 수 있습니다.

 

다음 예제는 해당 데이터가 문자가 아닌지를 검사하는 예제입니다.

예제

{
    "not": {
        "type": "string"
    }
}

 

위의 예제는 해당 데이터가 문자열이 아닌 데이터만이 검증을 통과합니다.

즉, 모든 문자열은 검증을 통과하지 못합니다.


연습문제