Language/JSON [JSON] 스키마
  • 728x90
    반응형

     

     

     

     

     

    JSON 스키마(schema)

    JSON은 좀 더 쉽게 데이터를 교환하고 저장하기 위하여 만들어진 데이터 교환 표준이다. 이때 JSON 데이터를 전송받는 측에서는 전송받은 데이터가 적법한 형식의 데이터인지를 확인할 방법이 필요하다. 따라서 적법한 JSON 데이터의 형식을 기술한 문서를 JSON 스키마(schema)라고 한다.

     

    JSON 스키마에 대한 더 자세한 사항은 다음 링크를 참고하면 된다.

     

     

    JSON Schema

    Welcome to the JSON Schema Community With over 60 million weekly downloads, JSON Schema has a large and active developer community across the world. Join the Community to learn, share ideas, ask questions, develop JSON Schema tooling and build new connecti

    json-schema.org

     

     

     

    JSON 스키마 검증(validation)

    JSON 스키마는 다음과 같은 세 가지 검증 과정을 거친다.

     

    1. 데이터의 타입이 정확한가?
    2. 필수로 받아와야 하는 데이터가 포함되어 있는가?
    3. 데이터가 원하는 범위 안에 있는가?

    JSON 스키마에서는 위와 같은 검증 기준을 모두 키워드(keyword)를 이용하여 직접 명시할 수 있다.

     

     

     

    검증 키워드(validation keywords)

    JSON 스키마에서는 검증 기준을 명시하기 위해 여허 키워드를 사용할 수 있다. 이러한 키워드를 사용하여 데이터에 여러 가지 조건을 걸어줄 수 있다.

     

    JSON 스키마에서 사용할 수 있는 대표적인 검증 키워드는 다음과 같다.

    검증 키워드 설명
    type 유효한 데이터의 타입을 명시함
    properties 유효한 데이터 이름과 값의 쌍들을 명시함
    required 명시한 배열의 모든 요소를 프로퍼티로 가지고 있어야만 유효함
    minimum 최소값 이상의 숫자만 유효함
    maximum 최대값 이하의 숫자만 유효함
    multipleOf 명시한 숫자의 배수만 유효함
    maxLength 명시한 최대 길이 이하의 문자열만 유효함
    minLength 명시한 최소 길이 이상의 문자열만 유효함
    pattern 명시한 정규 표현식에 해당하는 문자열만 유효함

     

    또한, 스키마에 대한 정보를 나타내는 메타 데이터(metadata) 키워드는 다음과 같다.

     

    1. title
    2. description
    3. default

    다음 예제는 검증 키워드와 메타 데이터 키워드를 이용한 JSON 스키마 예제이다.

     

    🔔 예제)

    {    
    	"title": "강아지 스키마",   
    	"description": "이 스키마는 강아지에 관한 데이터를 검증하기 위해 작성된 스키마임.",    
    	"type": "object",    
    	"properties": {        
    		"name": {"type": "string"},        
    		"family": {"type": "string"},        
    		"age": {"type": "integer"},        
    		"weight": {"type": "number"},	        
    		"owner": {            
    			"type": "object",	            
    			"properties": {                
    				"ownerName": {"type": "string"},                
    				"phone": {"type": "string"}            
    			}        
    		}    
    	}
    }

     

    type 키워드를 사용하여 유효한 타입을 명시하면, 해당 데이터가 유효한지를 검사할 수 있다. 이때 사용할 수 있는 타입에는 JSON의 기본 타입을 모두 사용할 수 있다.

     

    properties 키워드를 사용하면, 해당 객체가 가지는 프로퍼티가 유효한지를 검사할 수있다.

     

     

     

    정수 검증

    type 키워드의 값을 integer로 명시하면, 해당 데이터가 정수인지를 검사해 준다.

     

    문법

    {

        "type" : "interger"

    }

     

    위의 예제에서 0, -10, 4 등의 정수는 검증을 통과할 것이다.

    하지만 2.156과 같은 실수나 "123"과 같은 문자열 등은 검증을 통과하지 못한다.

     

     

     

    숫자 검증

    type 키워드의 값을 number로 명시하면, 해당 데이터가 숫자인지를 검사해 준다.

    이때 정수뿐만 아니라 소수부를 가지는 실수까지도 모두 검증을 통과한다.

     

    문법

    {

        "type" : "number"

    }

     

    위의 예제에서 0, 10, 3.14, -4.56 등의 모든 정수와 실수는 검증을 통과한다. 하지만 "123"과 같은 문자열이나 true와 같은 불리언 등은 검증을 통과하지 못한다.

     

     

     

    배수 검증

    multipleOf 키워드를 사용하여 해당 숫자가 명시된 숫자의 배수인지를 검사할 수 있다.

     

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

     

    🔔 예제)

    {    
    	"type": "number",    
    	"multipleOf": 3
    }

     

    위의 예제에서 0, 3, 6, 9 등의 3의 배수인 숫자는 검증을 통과한다. 하지만 10, 20과 같이 3의 배수가 아닌 숫자나 "123"과 같은 문자열 등은 검증을 통과하지 못한다.

     

     

     

    범위 검증

    다음과 같은 키워드를 사용하면 해당 숫자의 유효한 범위를 명시할 수 있다.

     

    1. minimum
    2. maximum
    3. exclusiveMinimum
    4. exclusiveMaxmum

    minimum과 maximum 키워드를 사용하면 해당 숫자가 가질 수 있는 최소값과 최대값을 명시할 수 있다.

     

    exclusiveMinimum과 exclusiveMaximum 키워드는 불리언 값을 명시할 수 있다. 만약 exclusiveMinmum 값이 true이면, 해당 숫자가 가질 수 있는 최소값으로 minimum 키워드로 명시된 값을 포함하지 않고 검사한다.

     

    하지만 exclusiveMinimum 값이 false이면, 최소값으로 minimum 키워드로 명시된 값까지 포함해서 검사한다.

     

    exclusiveMaximum 키워드도 해당 숫자가 가질 수 있는 최대값에 대해 exclusiveMinimum과 같은 방식으로 동작한다.

    exclusiveMinimum과 exclusiveMaximum 키워드는 값을 따로 명시하지 않으면, 기본값으로 false를 저장한다.

     

    다음 예제는 해당 데이터가 1보다 크거나 같고(n>=1) 10보다는 작은(n<10)정수 또는 실수인지를 검사하는 예제이다.

     

    🔔 예제)

    {    
    	"type": "number",    
    	"minimum": 1,    
    	"maximum": 10,    
    	"exclusiveMaximum": true
    }

     

     

     

    문자열 검증

    type 키워드의 값을 string으로 명시하면, 해당 JSON 데이터가 유니코드 문자열인지를 검사해 준다.

     

    🔔 예제)

    {    
    	"type": "string"
    }

     

    위의 예제에서 "제이슨", "JSON", "123" 등의 문자열은 검증을 통과한다.

    하지만 1, 3.14와 같은 숫자나 true와 같은 불리언 등은 검증을 통과하지 못한다.

     

     

     

    문자열 길이 검증

    minLength와 maxLength 키워드를 사용하여 해당 문자열의 길이가 유효한지를 검사할 수 있다. 이때 minLength와 maxLength 키워드의 값은 0을 포함한 양수만을 사용할 수 있다.

     

    다음 예제는 해당 문자열의 길이가 1보다 크고 4보다 작은지를 검사하는 예제이다.

     

    🔔 예제)

    {    
    	"type": "string",    
    	"minLength": 1,    
    	"maxLength": 4
    }

     

     

     

    정규 표현식 검증

    pattern 키워드를 사용하여 해당 문자열이 명시된 정규 표현식과 일치하는지를 검사할 수 있다.

     

    정규 표현식(regular expression)은 문자열에서 특정한 규칙을 가지는 문자열의 집합을 찾아내기 위한 검색 패턴이다. 이러한 검색 패턴은 모든 종류의 문자열 검색이나 교체 등의 작업에서 사용될 수 있다.

     

    JSON에서는 자바스크립트에서 사용할 수 있는 정규 표현식 문법을 모두 사용할 수 있다.

    JSON정규 표현식에서 주로 사용되는 패턴 문자는 다음과 같다.

     

    패턴 문자 설명
    ^a 단어의 맨 앞에 위치한 패턴만을 검색함 (ex : 'a'로 시작하는 단어의 'a'만을 검색함)
    a$ 단어의 맨 뒤에 위치한 패턴만을 검색함 (ex : 'a' 로 끝나는 단어의 'a'만을 검색함)
    a(b)c 전체 패턴을 검색한 후에 괄호 안에 명시된 문자열을 저장함 (ex : 'abc'를 검색한 후에 b를 저장함)
    [abc] 대괄호([]) 안에 명시된 문자를 검색함 (ex : 'abc'를 검색함)
    [a-z] 대괄호([]) 안에 명시된 범위의 문자를 검색함 (ex : a부터 z까지의 문자를 검색함)
    [^abc] 대괄호([]) 안에 명시된 문자 이외의 문자를 검색함 (ex : 'abc'를 제외한 문자를 검색함)
    [^a-z] 대괄호([]) 안에 명시된 범위의 문자를 제외한 문자를 검색함 (ex : a부터 z까지의 문자를 제외한 문자를 검색함)
    n+ 앞의 문자가 1번 이상 나타날 경우를 검색함 ({1,} 과 같음)
    n* 앞의 문자가 0번 이상 나타날 경우를 검색함 ({0,} 과 같음)
    n? 앞의 문자가 0번 또는 1번만 나타날 경우를 검색함 ({0,1}과 같음)
    {n} 앞의 문자가 정확히 n번 나타날 경우를 검색함 (n은 반드시 양의 정수여야 함)
    {m,n} 앞의 문자가 최소 m번이상 최대 n번이하로 나타날 경우를 검색함 (m과 n은 반드시 양의 정수여야함)

     

    다음 예제는 정규 표현식을 이용하여 해당 데이터가 1개 이상의 영문 소문자를 가지는 문자열인지를 검사한다.

     

    🔔 예제)

    {    
    	"type": "string",    
    	"pattern": "[a-z]+"
    }

     

     

     

    객체 검증

    type 키워드의 값을 object로 명시하면, 해당 데이터가 객체인지를 검사해 준다.

     

    🔔 예제)

    {    
    	"type": "object"
    }

     

    위의 예제에서 데이터 이름과 값의 쌍인 프로퍼티를 갖는 객체는 검증을 통과할 것이다.

    하지만 "123"과 같은 문자열이나 배열 등은 검증을 통과하지 못한다.

     

     

     

    프로퍼티 검증

    객체의 프로퍼티(property)는 데이터 이름과 값의 쌍으로 구성된다. properties 키워드를 사용하여 해당 객체가 가지는 프로퍼티가 유효한지를 검사할 수 있다.

     

    🔔 예제)

    {    
    	"type": "object",    
    	"properties": {        
    		"name": {"type": "string"},        
    		"family": {"type": "string"},        
    		"age": {"type": "integer"},        
    		"weight": {"type": "number"}    
    	}
    }

     

    다음 예제의 JSON 객체는 위의 예제와 같은 검증을 통과할 것이다.

     

    🔔 예제)

    {    
    	"name": "식빵",    
    	"family": "웰시코기",    
    	"age": 1,    
    	"weight": 2.14
    }

     

    하지만 다음 예제의 JSON 객체는 age와 weight 프로퍼티가 값으로 문자열을 가지므로, 검증을 통과하지 못한다.

     

    🔔 예제)

    {    
    	"name": "식빵",	    
    	"family": "웰시코기",    
    	"age": "1",    
    	"weight": "2.14"
    }

     

     

    필수 프로퍼티 검증

    required 키워드를 사용하여 해당 객체가 반드시 가지고 있어야 하는 필수 프로퍼티를 명시할 수 있다.

     

    만약 필수 프로퍼티가 하나 이상이라면, 배열을 이용하여 각 필수 프로퍼티의 이름을 나열하면 된다.

     

    다음 예제는 해당 데이터가 객체이면서, 프로퍼티로 name과 family를 가졌는지를 검사하는 예제이다.

     

    🔔 예제)

    {    
    	"type": "object",    
    	"properties": {        
    		"name": {"type": "string"},        
    		"family": {"type": "string"},        
    		"age": {"type": "integer"},        
    		"weight": {"type": "number"}	    
    	},    
    	"required": ["name", "family"]
    }

     

     

     

    프로퍼티의 개수 검증

    minProperties와 maxProperties 키워드를 사용하여 해당 객체가 가질 수 있는 프로퍼티 개수의 최소값과 최대값을 명시할 수 있다.

     

    다음 예제는 해당 데이터가 객체이면서, 프로퍼티를 1개나 2개만 가졌는지를 검사하는 예제이다.

     

    🔔 예제)

    {    
    	"type": "object",    
    	"minProperties": 1,    
    	"maxProperties": 2
    }

     

     

     

    배열 검증

    type 키워드의 값을 array로 명시하면, 해당 데이터가 배열인지를 검사해 준다.

     

    🔔 예제)

    {    
    	"type": "array"
    }

     

    위의 예제에서 여러 개의 데이터가 순서를 가지고 대괄호로 둘러싸인 배열은 검증을 통과할 것이다.

    하지만 1, 3.14와 같은 숫자나 객체 등은 검증을 통과하지 못한다.

     

     

     

    배열 요소 검증

    items 키워드를 사용하여 해당 배열에 저장된 배열 요소에 대한 검증을 수행할 수 있다.

    items 키워드와 함께 명시된 JSON 스키마로 각 배열 요소의 검증을 수행한다.

     

    다음 예제는 해당 데이터가 배열이면서, 각 배열 요소가 모두 정수인지를 검사하는 예제이다.

     

    🔔 예제)

    {    
    	"type": "array",	    
    	"items": {        
    		"type": "integer"    
    	}
    }

     

    위의 예제에서 배열 요소가 모두 정수인 배열이나 배열 요소가 하나도 없는 빈 배열은 검증을 통과할 것이다. 하지만 배열 요소로 정수 외의 데이터를 가지는 배열은 검증을 통과하지 못한다.

     

    배열의 각 요소를 서로 다른 JSON 스키마로 검사하고 싶으면, items 키워드와 함께 배열로 스키마를 명시하면 된다. 이 배열은 각 배열 요소를 검사할 JSON 스키마가 저장되어 있다.

     

    다음 예제는 해당 데이터가 배열이면서, 각 배열 요소를 서로 다른 JSON 스키마로 검사하는 예제이다.

     

    🔔 예제)

    {    
    	"type": "array",    
    	"items": [        
            {            
                "type": "string",            
                "maxLength": 5        
            },        
            {            
                "type": "string"        
            },        
            {            
                "type": "string"        
            }    
    	]
    }

     

    위의 예제에서 첫 번째 배열 요소가 5개의 문자를 넘지 않는 문자열이며, 두 번째와 세 번째 배열 요소가 문자열인 배열은 검증을 통과할 것이다. 또한, 세개의 유효한 배열 요소 외에 추가로 다른 배열 요소를 가지고 있는 배열도 검증을 통과할 것이다.

     

    하지만 additionalItms 키워드의 값을 false 로 명시하면, 추가로 다른 배열 요소를 가지는 배열은 검증을 통과하지 못하게 된다.

     

    🔔 예제)

    {    
    	"type": "array",    
    	"items": [        
    		{            
    			"type": "string",            
    			"maxLength": 5        
    		},        
    		{            
    			"type": "string"        
    		},        
    		{            
    			"type": "string"        
    		}    
    	],    
    	"additionalItems": false
    }

     

     

     

    배열 길이 검증

    minItems와 maxItems 키워드를 사용하여 해당 배열이 가질 수 있는 최소값과 최대값을 명시할 수 있다.

     

    다음 예제는 해당 데이터가 배열이면서, 가지고 있는 배열 요소가 3개부터 10개까지인가를 검사하는 예제이다.

     

    🔔 예제)

    {    
    	"type": "array",    
    	"minItems": 3,    
    	"maxItems": 10
    }

     

     

     

    중복 값 검증

    uniqueItems 키워드를 사용하여 해당 배열에 저장된 배열 요소에 대한 중복 값 허용 여부를 명시할 수 있다.

    uniqueItems 값이 true이면, 배열 요소의 값에 중복 값을 허용하지 않을 수 있다.

     

    다음 예제는 해당 데이터가 배열이면서, 가지고 있는 배열 요소의 값이 중복되지 않는가를 검사하는 예제이다.

     

    🔔 예제)

    {    
    	"type": "array",    
    	"uniqueItems": true
    }

     

     

     

    불리언 검증

    type 키워드의 값을 boolean으로 명시하면, 해당 데이터가 불리언인지를 검사해 준다. 이때는 데이터의 값이 true와 false인 경우에만 검증을 통과할 수 있다.

     

    🔔 예제)

    {    
    	"type": "boolean"
    }

     

    JSON은 불리언 true와 false 대신에 숫자 1과 0을 대신 사용할 수 없으므로, 위의 예제에서 숫자 1과 0은 통과할 수 없다.

     

     

     

    null 검증

    type 키워드의 값을 null로 명시하면, 해당 데이터가 null인지를 검사해 준다.

     

    🔔 예제)

    {    
    	"type": "null"
    }

     

    위의 예제에서 null 이외의 모든 값은 검증을 통과하지 못한다.

     

     

     

    열거형 데이터 검증

     

    enum 키워드를 사용하여 해당 데이터가 명시된 배열에 속한 값인지를 검사할 수 있다. 유효한 enum값들은 배열을 사용하여 명시하며, 중복 값을 가질 수는 없다.

     

    🔔 예제)

    {    
    	"type": "string",    
    	"enum": ["웰시코기", "포메라니안", "푸들"]
    }

     

    위의 예제에서 문자열인 "웰시코기", "포메라니안", "푸들" 이외의 모든 값은 검증을 통과할 수 없다.

     

     

    스키마 결합

    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"    
    	}
    }

     

    위의 예제는 해당 데이터가 문자열이 아닌 데이터만이 검증을 통과한다. 즉, 모든 문자열은 검증을 통과하지 못한다.

     

     

     

    728x90
    반응형

    'Language > JSON' 카테고리의 다른 글

    JSON 사용법  (0) 2018.11.16
    JSON 타입  (1) 2018.11.15
    [JSON] 기초  (0) 2018.11.15
상단으로