-
Notifications
You must be signed in to change notification settings - Fork 3
๐ zod ๋์ ํ๊ธฐ
๋ถ์ผ | ์์ฑ์ | ์์ฑ์ผ |
---|---|---|
FE | ์กฐ๋ฐฐ๊ฒฝ | 24๋ 11์ 24์ผ |
ํ์ฌ ํ๋ก์ ํธ์์๋ API ๋ช ์ธ์ ๋ฐ๋ผ request/response ํ์ ์ ๋ฐ๋ก ์์ฑํด๋ ์ํ์ด๋ค.
export interface GetStockListRequest {
limit: number;
}
export interface GetStockListResponse {
id: string;
name: string;
currentPrice: number;
changeRate: number;
volume: number;
marketCap: string;
}
์ด๋ ์ปดํ์ผ ๊ณผ์ ์์๋ ์ค๋ฅ ๋ฐ์ ์ ์ก์๋ผ ์ ์์ง๋ง, ๋ฐํ์ ์์๋ ํ์ ์ ๋ณด๊ฐ ์ ๊ฑฐ๋์ด ํ์ธํ ์ ์๋ค.
ํ์ ๊ฒ์ฌ๋ ์ปดํ์ผ ์์ ์์ ์ผ์ด๋๋ฉฐ, ํ์ ์คํฌ๋ฆฝํธ๊ฐ ๋ฐํ์ ์ ์ ํจ์ฑ ๊ฒ์ฆ๊น์ง ํด์ฃผ์ง ๋ชปํ๋ค. ์ฆ, ํ์ ๊ฒ์ฌ๊ฐ ์ ํจ์ฑ ๊ฒ์ฆ์ ๋์ ํ ์ ์๋ค.
๋ฐํ์ ์์ ์ ์์ธกํ ์ ์๋ ๋์๊น์ง ํต์ ํ๊ธฐ ์ํด์๋ ์ ํจ์ฑ ๊ฒ์ฆ ๋ก์ง์ด ํ์ํ๋ค.
์ด๋ฅผ ์ฝ๊ฒ ๋์์ฃผ๊ธฐ ์ํด์ zod
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์
ํ๊ธฐ๋ก ํ๋ค.
์คํค๋ง๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ํตํด ํ์ ์ถ๋ก ๋ฐ ์ ํจ์ฑ ๊ฒ์ฆ์ ํ ์ ์๋ ์ ์ด ๋งค๋ ฅ์ ์ผ๋ก ๋๊ปด์ก๋ค.
์ฐ๋ฆฌ ํ๋ก์ ํธ๋ yarn
์ ์ฌ์ฉํ๊ณ ์๋ค.
yarn add zod
import { z } from 'zod';
export const GetStockResponseSchema = z.object({
marketCap: z.number(),
eps: z.number(),
per: z.number(),
high52w: z.number(),
low52w: z.number(),
});
์ฃผ์ ์์ธ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ get ์์ฒญ์ ๋ํ ์๋ต ์คํค๋ง๋ฅผ ์ ์ํ๋ค.
z.number()์๋ .min(), .max(), .postive(), nonnegative(), negative(), nonpositive(), finite() ๋ฑ์ ์ฒด์ด๋์ผ๋ก ์ถ๊ฐ๋ก ์ง์ ํ ์ ์๋ค. ๋ํ z.bigint()๋ ๋์ผํ๊ฒ ๊ฐ๋ฅํ๋ค.
export const GetLoginStatusSchema = z.object({
message: z.enum(['Authenticated', 'Not Authenticated']),
});
์์ ๊ฐ์ด z.enum()์ผ๋ก๋ ์ง์ ํ ์ ์๋ค.
export const ChatDataSchema = z.object({
id: z.number(),
likeCount: z.number(),
message: z.string(),
type: z.string(),
createdAt: z.date(),
liked: z.boolean(),
nickname: z.string(),
});
export const ChatDataResponseSchema = z.object({
chats: z.array(ChatDataSchema),
hasMore: z.boolean(),
});
z.array()๋ฅผ ํตํด ๋ฐฐ์ด ์คํค๋ง๋ฅผ ์ง์ ํ ์ ์๋ค.
export type GetStockResponse = z.infer<typeof GetStockResponseSchema>;
z.infer๋ฅผ ํตํด ์์์ ์ ์ํ ์คํค๋ง๋ก ํ์ ์ ์ ์ํ ์ ์๋ค.
VSC ์์์๋ ํ์ ์ถ๋ก ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
.parse
const validatedData = GetStockResponseSchema.parse(data);
๊ฒ์ฆํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ parse์ ๋๊ฒจ์ ํธ์ถํ๋ฉด ์ ํจ์ฑ ๊ฒ์ฆ์ ํ ์ ์์ผ๋ฉฐ ๊ฒ์ฆ์ ์คํจํ๋ค๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
.safeParse
const result = schema.safeParse(data);
if (!result.success) {
// handle error then return
result.error
}
์ ํจ์ฑ ๊ฒ์ฆ์ ์คํจํ์ ๋ ์๋ฌ๋ฅผ ๋์ง๊ณ ์ถ์ง์๋ค๋ฉด safeParse๋ฅผ ์ฌ์ฉํ๋ค.
safeParse์ ๋ฆฌํด๊ฐ์ผ๋ก๋ { success: true; data: T; } | { success: false; error: ZodError; }
๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ ์ ์๋ค.
์ฐธ๊ณ ์๋ฃ
zod๋ก ์ ํจ์ฑ ๊ฒ์ฆ๊ณผ ํ์ ์ ์ธ์ ๋๋ง๋ฆฌ ํ ๋ผ ์ก๊ธฐ
ํ์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐ๋๋ฐ๋ ์ ํจ์ฑ ๊ฒ์ฆ์ด ํ์ํ ๊น?
- ๐ฉ FE ๊ธฐ์ ์ ํ์ด์
- โจ ์ฐจํธ์ ๋ฐ์ํ ๊ตฌํ๊ณผ useRef ํ์ ๋ฌธ์
- ๐ฃ ๋ถ๋ชจ ์์์ ์ํ์ ๋ฐ๋ผ ์์ ์์๋ ์คํ์ผ ๋ณํ ๋ถ์ฌํ๊ธฐ
- ๐ zod ๋์ ํ๊ธฐ
- ๐ useInfiniteQuery๋ฅผ ์ฌ์ฉํ ๊ทธ๋ํ ๋ฌดํ์คํฌ๋กค ๊ตฌํ
- ๐ซ ์ฌ์ฉ์์ ์์ ๋ณํ ์๋ ๊ทธ๋ํ ์คํฌ๋กค ๊ตฌํํ๊ธฐ
- ๐งช ์๋ง์ ๊ทธ๋ํ ๋ฐ์ดํฐ ์์ฒญ์ ์ด๋ป๊ฒ ์ค์ผ๊น
- ๐ ๋คํฌ๋ชจ๋์์ ์๋ก๊ณ ์นจ ์ ๋ผ์ดํธ๋ชจ๋๊ฐ ์ ๊น ๋ณด์ด๋ ๋ฌธ์
- ๐ ์น์์ผ์ ์ฑํ ๋ฐ์ดํฐ์ REST API์ ์ฑํ ๋ฐ์ดํฐ๋ฅผ ํจ๊ป ๊ด๋ฆฌํ๊ธฐ
- ๐ก BE ๊ธฐ์ ์ ํ ์ด์
- โ๏ธ Node WebSocket ํ๊ณ ๋ค๊ธฐ
- โ๏ธ TypeORM Datasource mock ๋ง๋ค๊ธฐ
- โ๏ธ oauth ID range ๋ฌธ์
- ๐ custom pipe์์ Nan์ด ๋ฐ์์ง๋ ๋ฌธ์
- ๐ช nest Websocket์ ์ธ์ ์ด ์๋๋ค๊ณ ?
- ๐ด nginx websocket ์ฐ๊ฒฐ ์ ๋ฌธ์ ๋ฐ์
- ๐ WebPush ๊ตฌํ
- ๐ง ์ฐ์ ์์ ํ๋ก ์์ฒญ ์ ์ดํ๊ธฐ
- ๐ websocket์ด ๋ฆ๊ฒ ํ ๋น๋์ด ๋ฐ์๋๋ ๋ฌธ์
- ๐ฅณ typeorm์ ์ด์ฉํ FCM ์๋ฆผ ์๋น์ค
- ๐ฆ ๋ค์ค ์ ์ ๋์์ฑ ์ ์ด โ ์ฑ๊ธํค, ๋ฎคํ ์ค
- ๐ ๊ทธ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์ ๊ณตํ๊ธฐ์ํ ์ ๋ต
- ๐ ๏ธ ์ธํ๋ผ ๊ธฐ์ ์คํ ์ ํ ์ด์
- ๐ Ncloud ์ค์ ๊ณผ์
- ๐ ORM ๊ธฐ์ ์คํ ๋น๊ต
- ๐ค RabbitMQ๋ก ๋ถ์ฐ ์๋ฒ์๊ฒ ๋ฉ์์ง๋ฅผ ๋ถ๋ฐฐํ๊ธฐ
- ๐ข private DB ์๋ฒ์ ์ ์ํ์ง ๋ชปํ๋ ํ์
- ๐ 1์ฃผ์ฐจ ๋ฐํ
- ๐ 2์ฃผ์ฐจ ๋ฐํ
- ๐ 3์ฃผ์ฐจ ๋ฐํ
- ๐ 4์ฃผ์ฐจ ๋ฐํ
- ๐ 5์ฃผ์ฐจ ๋ฐํ
- ๐ ์ต์ข ๋ฐํ