Javascript | Typescript/Node.js

AJV(another json validatiror)를 사용하여 JSON 스키마 검증하기(json schema validation)

devMarco 2020. 7. 19. 23:48

이전에 스키마에 대해서 다룬 적이 있다. (https://gkqlgkql.tistory.com/83) 스키마는 데이터의 형식을 정의한다. 예를 들어, JSON 스키마는 JSON 의 구조를 정하고, RDBMS의 스키마는 테이블 구조를 정의하는 식이다. 현재 주로 개발하고 있는 node.js REST API 서버에서는 일반적으로 JSON 으로 구성된 리퀘스트를 받게 된다. 이 때 클라이언트에서 보낸 리퀘스트 JSON 형식이 적절한지를 검증하는 과정이 필요한데, 이를 JSON schema validation(JSON 스키마 유효성 검증) 이라고 한다. 이번 포스팅에서는 JSON-schema-validation 라이브러리인 AJV(Another Json Validator)를 사용하는 방법에 대해서 다루어 본다.

이를테면 회원가입을 한다고 생각해보면 클라이언트에서는 리퀘스트 바디를 다음과 같이 만들어 보낼 것이다.

{
    "name": "마르코",
    "id": "marco102",
    "password": "1q2w3e4r!",
    "email":"aaaa@bbbb.com",
        "zipNumber" : 05313,
        "address1":"서울시 중구 XXX"
}

서버에서는 이름, id, 비밀번호, 이메일 등 JSON 유효성을 체크해야 한다.

  • 필요한 프로퍼티가 다 들어 있는지? (위 리퀘스트에서 id, password 등이 빠지거나 하면 안됨)
  • 리퀘스트 프로퍼티의 타입이 맞는지? (숫자, 문자열 등 타입 체크)

이번 포스팅에서는 AJV 라는 node.js 모듈을 활용해서 JSON validation을 진행해본다.

라이브러리 임포트

AJV 라이브러리를 임포트한다.

import * as Ajv from 'ajv'
const ajv = new Ajv()

스키마 정의

JSON 스키마를 정의한다. 이 때, 스키마 정의는 손으로 만들 수도 있지만, 상당히 귀찮은 작업이다. 다음 사이트에서 인풋 json 데이터를 입력하면 스키마로 바꿔주는 곳이 있으니 활용하면 좋다.

//JSON 스키마 정의
        let schema = {
                        // JSON body로 오브젝트 사용
            type: 'object',
                        // 반드시 필요한 프로퍼티들을 정리
            required: ['name', 'id', 'password', 'email', 'address1'],

                        // 사용하는 프로퍼티들
            properties: {
                name: { type: 'string' },
                id: { type: 'string' },
                password: { type: 'string' },
                email: { type: 'string' },
                zipNumber: { type: 'number' },
                address1: { type: 'string' },
            },
        };

유효성 검증

JSON 유효성을 검증한다. 에러가 있다면 에러를 던지게 한다.

//ajv로 JSON 유효성 검증
        const ajv = new Ajv();
        const isValid = ajv.validate(schema, requestData);

        if (!isValid) {
            const errorMessages = ajv.errorsText();
            throw new Error(`Validation Error. ${errorMessages}`);
        }

JSON 검증 시도해보기

json validation을 시도해본다.

스키마에 맞는 원본

//리퀘스트 데이터 : 원본 (에러 없음)
        let requestData = {
            name: '마르코', // 이름
            id: 'marco102', // id
            password: '1q2w3e4r!', // 비밀번호(암호화 필수)
            email: 'aaaa@bbbb.com', // 이메일
            zipNumber: 12345, // 우편번호
            address1: '서울시 중구 XXX', //주소
        };

이메일이 누락된 경우

//리퀘스트 데이터 : email이 누락된 경우
        let requestData = {
            name: '마르코', // 이름
            id: 'marco102', // id
            password: '1q2w3e4r!', // 비밀번호(암호화 필수)
            zipNumber: 12345, // 우편번호
            address1: '서울시 중구 XXX', //주소
        };

-----

// 에러 : required property인 email이 없다는 에러가 리턴됨
Error: Validation Error. data should have required property 'email'

zipNumber(숫자여야 함)를 문자열로 보낸 경우

//리퀘스트 데이터 : zipNumber를 문자열로 보낸 경우
        let requestData = {
            name: '마르코', // 이름
            id: 'marco102', // id
            password: '1q2w3e4r!', // 비밀번호(암호화 필수)
            email: 'aaaa@bbbb.com', // 이메일
            zipNumber: '12345', // 우편번호
            address1: '서울시 중구 XXX', //주소
        };

------
// 에러 : zipNumber가 number여야 한다는 에러가 리턴됨
Error: Validation Error. data.zipNumber should be number

이외에도 배열, 객체 등도 검증이 가능하며, 정규식을 활용해 문자열 형식을 제한할 수 있다. (이메일 형식 검증 등) 사실 node.js 플랫폼에는 express-validator, joi 등 다양한 JSON 스키마 검증 라이브러리들이 있다. 이들을 비교 해보면서 AJV를 선택한 이유로는 학습 비용이 적고, 스키마 생성이 편리하다는 점이다. node.JS에서 유효성 검증 모듈을 고민한다면 AJV를 추천한다.

이외에도 https://ajv.js.org/ 에서 공식 문서를 보고 개발이 가능하다.