ꡬν λκΈ°
- νμκ°, κΈμμ μ ν, μ΄λ©μΌ νμ, μ νλ²νΈ νμ λ± κ°λ¨ν κ²μ¬λ§ νμνλ€.
- joiλ yup κ°μ μΈλΆ λΌμ΄λΈλ¬λ¦¬ μμ΄ κ΅¬ννκ³ μΆλ€. (볡μ‘ν κΈ°λ₯μ νμ μλ€.)
- λ©μλ 체μ΄λμ μ§μ ꡬνν΄λ³΄κ³ μΆλ€
μ΄λ¬ν λκΈ°λ‘ μ λ ₯μ μ ν¨μ±μ κ²μ¬νλ μ νΈλ¦¬ν°λ₯Ό μ§μ ꡬνν΄ λ³΄κΈ°λ‘ νλ€.
μꡬμ¬ν
- λ©μλ 체μ΄λμΌλ‘ 체μ΄λ λ μμλλ‘ μ ν¨μ±μ κ²μ¦νλ€.
- νμ₯μ±μ μν΄ μ§μ μ μν λ©μλλ‘ μ ν¨μ±μ κ²μ¦ν μ μμ΄μΌ νλ€.
- μ λ ₯ νλ μ»΄ν¬λνΈμμ μ λ ₯ μλ§λ€ μ ν¨μ±μ μλμΌλ‘ κ²μ¦νλ€.
ꡬννκΈ°
Validator ν΄λμ€
μ ν¨μ±μ κ²μ¦νλ Validator ν΄λμ€λ₯Ό μμ±νλ€.
ν΄λμ€μ λ©μλλ‘ μ ν¨μ±μ κ²μ¦νλ λ‘μ§μ ꡬννλ€.
κ° λ©μλλ νμ this
λ₯Ό 리ν΄ν΄μ 체μ΄λμ΄ κ°λ₯νλλ‘ νλ€.
type ValidatorFunction = (input: string) => Promise<boolean> | boolean;
const emailPattern = /^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6})*$/;
export default class Validator {
isValid: boolean = true;
private chain: Array<ValidatorFunction> = [];
required = () => {
this.chain.push((input: string) => input.length > 0);
return this;
};
max = (max: number) => {
this.chain.push((input: string) => input.length < max);
return this;
};
min = (min: number) => {
this.chain.push((input: string) => input.length >= min);
return this;
};
test = (pattern: RegExp) => {
this.chain.push((input: string) => new RegExp(pattern).test(input));
return this;
};
email = () => {
return this.test(emailPattern);
};
exec = async (fn: ValidatorFunction) => {
this.chain.push(fn);
return this;
};
validate = async (input: string) => {
for await (const validator of this.chain) {
const isValid = await validator(input);
this.isValid = isValid;
if (!isValid) return false;
}
this.isValid = true;
return true;
};
}
chain
validate λ©μλμμ chain μμ ValidatorFunctionμ μ²μ 체μ΄λ λ κ²λΆν° μ°¨λ‘λλ‘ μ€ννλ€. (FIFO νμ²λΌ λμνλ€.)
chainμ μΈλΆμμ μ κ·Όνκ±°λ λ³κ²½ν μ μλλ‘ privateμΌλ‘ μ§μ νλ€.
validate()
λͺ¨λ μ ν¨μ± κ²μ¬λ₯Ό ν΅κ³Όνλ©΄ trueλ₯Ό λ°ννκ³ , νλλΌλ ν΅κ³Όνμ§ λͺ»νλ©΄ falseλ₯Ό λ°ννλ€.
μ΄λ² νλ‘μ νΈμμλ λ°λ‘ μλ¬ λ©μμ§λ₯Ό νμνμ§ μκ³ μλ€. μΆν μλ¬λ©μμ§κ° μΆκ°λλ€λ©΄ false λμ throw Erorr('μλ¬ λ©μμ§')
λ‘ κ΅¬νν μ μκ² λ€.
exec(), test()
νμ₯μ±μ μν΄ μΆκ°ν λ©μλμ΄λ€. Validator λ΄ λ―Έλ¦¬ μ μλ μ ν¨μ± κ²μ¬ λ©μλ μΈμλ λ‘μ§μ μ§μ ꡬννμ¬ λκ²¨μ€ μ μλ€.
exec()
: μ§μ ꡬνν ν¨μλ‘ κ²μ¬ν μ μλ€.
test()
: μ§μ μ μν μ κ·μμΌλ‘ κ²μ¬ν μ μλ€.
Validator ν΄λμ€ μ¬μ©νκΈ°
λ€μμ²λΌ inputμ λν μ ν¨μ±μ μ μν μ μλ€.
const emailValidator = new Validator().required().email()
const nicknameValidator = new Validator().required().min(2).max(10).test(/^[a-zA-Z0-9]*$/)
input μ»΄ν¬λνΈ λ΄λΆμμλ validatorκ° propμΌλ‘ μ£Όμ΄μ§ λ,
ChangeEvent νΈλ€λ¬μμ validateλ₯Ό μ€ννκ³ , κ·Έ κ²°κ³Όμ λ°λΌ μ ν¨μ±μ λνλ΄λ uiλ₯Ό λ³κ²½νλ€.
<TextField
label="λλ€μ"
validator={nicknameValidator}
...
/>
λ§λ¬΄λ¦¬
λ€λ₯Έ νλ‘μ νΈμμλ μ ν¨μ± κ²μ¦μ react-hook-formκ³Ό yup λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμλ€.
yupμ μ²μ μ¬μ©νμ λ λ©μλ 체μ΄λμΌλ‘ inputμ μ μνλ κ²μ κ°λͺ μ λ°μλ€.
볡μ‘ν formμ μ¬μ©νλ€λ©΄ yupμ΄λ κ·Έμ λΉμ·ν joi κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²μ΄ λ μ’μ κ²μ΄λ€.
νμ§λ§ inputμ΄ λ§μ§ μκ³ , 볡μ‘ν κ²μ¦μ΄ νμνμ§ μλ€λ©΄ μ΄λ κ² κ°λ¨ν Validator ν΄λμ€λ₯Ό λ§λ€μ΄ μ¬μ©ν΄ 보μ
'πͺ΄ TIL' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Next.js 13μ App Directoryμ 4κ°μ§ μΆκ°λ κΈ°λ₯ (0) | 2023.05.27 |
---|---|
[리μ‘νΈ] react-router-dom v5μ v6μ ꡬν λ°©λ² λΉκ΅ (0) | 2023.05.12 |