백엔드 개발에 있어서 가장 중요한 것은 유효성 검증이라고 생각한다.
그래서 자주 쓰는 Validator의 몸집을 키우고 npm에 등록시켜 사용해보려고 한다.
모듈을 사용하는 개발자가 어떻게 사용하기를 원하는지 생각해봐야 한다. 물론 당연히 사용자는 내가 될 것 이니 내가 어떻게 사용하는지를 생각해보자.
const { id, title, name } = req.body;
if(validator(id).isString().isId().end()){
return next(err...);
}
이런식으로 메서드 체이닝을 통해 유효성을 검증하고 그 값이 boolean
타입으로 뽑아내지기를 기대한다.
예를 들어보자. 사용자가 Email데이터를 입력했을 때 우리는 그 데이터가 Email 형식이기를 원한다. 즉, 어떤 데이터가 들어왔을 때 그 데이터가 어떤 형태여야 하는지를 정의한다는 것이다.
const { title } = req.body;
다음과 같이 데이터를 받았을 때 우리는 title
데이터가 어떤 조건을 만족했으면 좋겠는지 생각 할 것이다. 어떤 데이터가 되지 않았으면 좋겠는지가 아니라...
즉, 체이닝 되는 메서드는 AND
연사자로써 작동하면 된다.
우선 validator
는 데이터 타입을 확인시켜주는 TypeValidator
의 인스턴스를 return
하며 시작한다.
class Validator {
#data
#validator
constructor(data, validator = false){
this.#data = data;
this.#validator = validator;
}
}
const validator = (data) => {
return new Validator(data);
}
우선 validator
함수를 호출하며 타입 체킹 메서드를 사용할 수 있도록 준비한다.
class Validator {
#data
#validator
constructor(data, validator = false)...
isString = () => {
if(typeof this.#data !== "string"){
this.#validator = false;
}
return {문자열 확인 객체}
}
}
예시로 isString()을 통해 data
의 string
타입 여부를 확인한 뒤 문자열 메서드를 체이닝할 수 있도록 객체를 하나 뽑아주도록 하자.
class StringValidator {
#data
#validation
constructor(data, validation){
this.#data = data;
this.#validator = validation;
}
isEmail = () => {
if(!this.#validation) return this;
// Check Email Format Logic
return this;
}
}
if(!this.#validation) return this;
이 내용이 가장 중요하다. 이미 false
인 경우 더 건드리지 않고 false
로 return
하도록 하는 장치이다.
마지막으로 결과를 반환하는 함수를 생성해주면 개발이 마무리된다.
class StringValidator {
#data
#validation
constructor(data, validation)...
end = () => {
return this.#validation;
}
}
end
메서드를 호출하여 메서드 체이닝의 결과를 뽑아내도록 한다.
깔끔하게 잘 작동되며 문제도 없다.
다만 js로 개발해서 올릴 경우 Type정의 파일을 같이 올려줘야 ts에서도 작동한다.
처음부터 typescript로 개발할 경우 컴파일 단계에서 타입 정의 파일을 뽑아주기 때문에 다음부터는 꼭 typescript로 개발하도록 하자.