Yup은 Form validation을 위한 라이브러리이다.
yup formatted object
를 생성 → 우리가 의도한 스키마와 닮아있는 객체를 생성한다.
yup utility function
을 통해 데이터 객체가 이 스키마와 매치되는지 확인한다.
⇒ 이 2가지 과정을 통해 Validation을 진행한다.
체크아웃 시 주소 입력하는 폼의 데이터 타입을 생각해보자.
// Expected schema from form
// If object does not match this schema,
// it is not valid.
{
email_address: email <required>,
full_name: string <required>,
house_no: int,
address_1: string <required>,
address_2: string,
post_code: string <required>,
timestamp: date <required>
}
email, date 에서 알 수 있듯이 yup은 해당 값을 검증할 수 있는 메서드를 갖고 있다.
Yup schema object 로 바꿔보자.
const checkoutAddressSchema = yup.object().shape({
email_address: yup
.string()
.email()
.required(),
full_name: yup.string().required(),
house_no: yup
.number()
.required()
.positive()
.integer(),
address_1: yup.string().required(),
address_2: yup.string(),
post_code: yup.string().required(),
timestamp: yup.date().default(() => new Date()),
})
Yup schema object
는 객체를 유효성 검증하는 데에 책임이 있는 이뮤터블 객체이다. 각 validator에 상응하는 고유의 메서드를 갖고 있으므로, 위에서 보듯이 여러개를 조합하여 원하는 data validation이 가능하다.
string
, integer
, date
, boolean
, array
, object
와 같은 기본적인 타입과 더불어서 required
(also notRequired), email
, positive
와 같은 것들도 제공한다.
또한 embedded function과 함께 default 값을 정할 수 있다. (eg. timestamp) 이 디폴트 함수 내에는 어떠한 로직이라도 들어갈 수 있고 어떠한 값이라도 리턴될 수 있다.
이제 폼에 맞는 스키마를 만들었고, 이것을 우리가 받은 데이터를 검증하는 데 사용할 수 있다. 아래와 같은 데이터를 제출받았다고 할 때 검증해보자.
let addressFormData = {
email_address: 'kdy@kdy.com',
full_name: 'KDY',
house_no: null,
address_1: 'My Home',
post_code: 'AAAAA',
}
Check if the object is valid
yup.isValid()
를 사용한다.
const valid = await checkoutAddressSchema.isValid(addressFormData)
// OR
checkoutAddressSchema.isValid(addressFormData).then(function(valid) {
// valid true or false
})
isValid()
는 프로미스를 리턴한다. 그래서 어싱크 어웨이트를 사용하거나 콜백 문법을 사용할 수 있다.
Validating the object
yup.validate()
await checkoutAddressSchema.validate(addressFormData)
Casting an Object
yup.cast()
만약 스키마에서 지정한 타입으로 들어오지 않았다면 타입을 캐스팅해서 고칠 수 있다.
checkoutAddressSchema.cast(addressFormData)
describe()
Yup object로부터 데이터 스키마를 불러낼 수 있다. 이 메서드는 오브젝트 스키마의 디테일을 모은다.concat()
2개의 스키마를 조합하고 싶을 때는 concat을 쓴다.abortEarly
Yup은 모든 validation을 한꺼번에 진행하고 그것이 모두 끝난 뒤에야 결과를 리턴한다. 만약 첫 번째 에러가 났을 때 바로 그 validate 절차를 멈추고 싶다면 abortEarly를 validate()
메서드의 두번째 인자로 옵셔널하게 넘겨주면 된다.await checkoutAddressSchema.validate(addressFormData, { abortEarly: true })
trim()
, uppercase()
, lowercase()
min()
, max()
, round()
, morethan()
, lessthan()
, truncate()
https://medium.com/@rossbulat/introduction-to-yup-object-validation-in-react-9863af93dc0e