1. 개요

JSON 스키마는 JSON 객체 의 형식과 구조를 검증하기 위한 선언적 언어입니다. 유효한 JSON 개체가 어떻게 생겼는지정확히 설명하기 위해 특수 프리미티브의 수를 지정할 수 있습니다

JSON 스키마 사양은 세 부분으로 나뉩니다.

  • JSON 스키마 코어 : JSON 스키마 코어 사양은 스키마에 대한 용어가 정의되는 곳입니다.
  • JSON 스키마 유효성 검사 : JSON 스키마 유효성 검사 사양은 유효성 검사 제약 조건을 정의하는 유효한 방법을 정의하는 문서입니다. 이 문서는 또한 JSON API에 대한 유효성 검사를 지정하는 데 사용할 수 있는 키워드 세트를 정의합니다. 다음 예에서는 이러한 키워드 중 일부를 사용합니다.
  • JSON Hyper-Schema : 하이퍼링크 및 하이퍼미디어 관련 키워드가 정의된 JSON 스키마 사양의 또 다른 확장입니다.

2. JSON 스키마 정의

이제 JSON 스키마가 무엇에 사용되는지 정의했으므로 JSON 개체 와 이를 설명하는 해당 JSON 스키마를 만들어 보겠습니다 .

다음은 제품 카탈로그를 나타내는 간단한 JSON 개체 입니다.

{
    "id": 1,
    "name": "Lampshade",
    "price": 0
}

다음과 같이 JSON 스키마를 정의할 수 있습니다 .

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "title": "Product",
    "description": "A product from the catalog",
    "type": "object",
    "properties": {
        "id": {
            "description": "The unique identifier for a product",
            "type": "integer"
        },
        "name": {
            "description": "Name of the product",
            "type": "string"
        },
        "price": {
            "type": "number",
            "minimum": 0,
            "exclusiveMinimum": true
        }
    },
    "required": ["id", "name", "price"]
}

보시다시피 JSON 스키마JSON 문서 이며 해당 문서는 객체여야 합니다. JSON 스키마 의해 정의된 객체 멤버(또는 속성)를 키워드라고 합니다 .

샘플에서 사용한 키워드를 설명하겠습니다.

  • $ schema 키워드는 이 스키마가 초안 v4 사양에 따라 작성되었음을 나타냅니다.
  • 제목 설명 키워드는 검증 중인 데이터에 제약 조건을 추가하지 않는다는 점에서 설명적일 뿐입니다 . 스키마의 의도는 다음 두 키워드로 설명됩니다. 제품을 설명합니다.
  • type 키워드는 JSON 데이터 에 대한 첫 번째 제약 조건을 정의합니다 . JSON Object 여야 합니다 .

또한 JSON 스키마는 스키마 키워드가 아닌 속성을 포함할 수 있습니다(MAY). 우리의 경우 id , name , price 는 JSON Object 의 멤버(또는 속성)가 됩니다 .

각 속성에 대해 유형을 정의할 수 있습니다 . 우리는 idname을 string 으로 , price를 number 로 정의했습니다 . JSON 스키마 에서 숫자는 최소값을 가질 수 있습니다. 기본적으로 이 최소값은 포괄적이므로 exclusiveMinimum 을 지정해야 합니다 .

마지막으로 스키마는 id , nameprice 가 필수 임을 알려줍니다 .

3. JSON 스키마로 검증

JSON 스키마를 배치하면 JSON 객체유효성을 검사할 수 있습니다 .

이 작업을 수행하기 위한 많은 라이브러리가 있습니다 . 이 예에서는 Java json-schema 라이브러리를 선택했습니다 .

먼저 pom.xml 에 다음 의존성을 추가해야 합니다 .

<dependency>
    <groupId>com.networknt</groupId>
    <artifactId>json-schema-validator</artifactId>
    <version>1.0.72</version>
</dependency>

마지막으로 JSON 개체의 유효성을 검사하기 위해 몇 가지 간단한 테스트 사례를 작성할 수 있습니다 .

@Test
public void givenInvalidInput_whenValidating_thenInvalid() throws IOException {
    JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4);
    JsonSchema jsonSchema = factory.getSchema(
     JSONSchemaUnitTest.class.getResourceAsStream("/schema.json"));
    JsonNode jsonNode = mapper.readTree(
     JSONSchemaUnitTest.class.getResourceAsStream("/product_invalid.json"));
    Set<ValidationMessage> errors = jsonSchema.validate(jsonNode);
    assertThat(errors).isNotEmpty().asString().contains("price: must have a minimum value of 0");
}

이 경우 유효성 검사 오류가 수신됩니다.

두 번째 테스트는 다음과 같습니다.

@Test 
public void givenValidInput_whenValidating_thenValid() throws ValidationException { 
    JsonSchemaFactory factory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V4); 
    JsonSchema jsonSchema = factory.getSchema( 
     JSONSchemaUnitTest.class.getResourceAsStream("/schema.json")); 
    JsonNode jsonNode = mapper.readTree( 
     JSONSchemaUnitTest.class.getResourceAsStream("/product_valid.json")); 
    Set<ValidationMessage> errors = jsonSchema.validate(jsonNode); 
    assertThat(errors).isEmpty(); 
}

유효한 JSON 객체를 사용하므로 유효성 검사 오류가 발생하지 않습니다.

4. 결론

이 기사에서는 JSON 스키마가 무엇이며 스키마를 정의하는 데 도움이 되는 몇 가지 관련 키워드가 무엇인지 정의했습니다 .

JSON 스키마를 해당 JSON 개체 표현과 결합하면 몇 가지 유효성 검사 작업을 수행할 수 있습니다.

이 기사의 간단한 테스트 사례는 GitHub 프로젝트 에서 찾을 수 있습니다 .

res – REST with Spring (eBook) (everywhere)