이전에 스키마에 대해서 다룬 적이 있다. (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 데이터를 입력하면 스키마로 바꿔주는 곳이 있으니 활용하면 좋다.
- https://www.liquid-technologies.com/online-json-to-schema-converter
- https://techbrij.com/brijpad/#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/ 에서 공식 문서를 보고 개발이 가능하다.
'Javascript | Typescript > Node.js' 카테고리의 다른 글
typeORM에서 timezone 올바르게 적용하기 (0) | 2022.12.29 |
---|---|
[Node.js] Nodemon에서 tsc-watch 로 변경하여 빌드속도 개선하기 (0) | 2021.02.21 |
TypeORM 간단 사용법 (0) | 2020.08.02 |