Ultimate Next.js Course 강의를 보면서 공부한 것들을 작성한 글입니다.
타입스크립트를 위한 스키마 선언 및 데이터 검증 라이브러리. 런타임에서 타입 검증 제공
현재 실무에서 사용하는 resolver는 yup인데 zod도 yup과 거의 유사했다.
cf. resolver: zod나 yup과 같은 유효성 검사 라이브러리에서 폼 데이터를 검증한 결과를 react-hook-form에서 사용할 수 있는 형식으로 변환해주는 역할.
// login-schema.ts
import * as z from "zod";
export const LoginSchema = z.object({
email: z.string().email({
message: "Invalid email address",
}),
password: z.string().min(1, {
message: "password should be longer than 1 letter.",
}),
code: z.optional(z.string()),
});
// login-form.tsx
import * as z from "zod"
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";
import { LoginSchema } from "@/types/login-schema";
const form = useForm({
resolver: zodResolver(LoginSchema),
defaultValues: {
email: "",
password: "",
},
})
const onSubmit = (values: z.infer<typeof LoginSchema>) => {
console.log(values);
};
// email-signin.ts
"use server"
import { LoginSchema } from "@/types/login-schema";
import { createSafeActionClient } from "next-safe-action";
import { users } from "../schema";
const action = createSafeActionClient();
export const emailSignIn = action
.schema(LoginSchema)
.action(async ({ parsedInput: { email, password, code } }) => {
const existingUser = await db.query.users.findFirst({
where: eq(users.email, email),
});
if (existingUser?.email !== email) {
return { error: "Email not found" };
}
console.log(email, password, code);
return { success: email };
});
import { useAction } from "next-safe-action/hooks";
const { execute, status, result } = useAction(emailSignIn, {
onSuccess(data) {
console.log(data);
},
});
createSafeActionClient()
: 서버 액션 생성. 예시 코드에서는 데이터베이스에 현재 인풋에 입력된 유저의 이메일 여부를 확인하고 이에 따라 성공/실패를 리턴한다.useAction
: 컴포넌트에서 서버 액션을 호출하기 위한 훅. 서버 액션의 로딩, 성공, 실패 등의 상태를 관리 및 처리한다.