๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป ํ”„๋กœ์ ํŠธ/๐Ÿ€ํ–‰์šด์˜ ๋กœ๋˜ ๋งˆ๋ฒ•์ง„๐Ÿ›ธ

[React, Next.js] Zod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฝ”๋“œ ์ž‘์„ฑํ•ด๋ณด์ž

by hyeong._.ing 2026. 5. 30.

 

 

 

์‚ฌ์šฉ์ž ์„ ํƒ ์˜ต์…˜์„ ๊ฒ€์‚ฌํ•˜๊ณ 
๋กœ๋˜ ๊ฒฐ๊ณผ ์‘๋‹ต์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด
Zod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.
Zod๊ฐ€ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ์ง€ ์•Œ์•„๋ณด๊ณ 
์ฝ”๋“œ ์ž‘์„ฑ์„ ํ•ด๋ณด์ž

 

 

 

 

 

- ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ ๋งˆ๋ฒ•์ง„

 

๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ ๋งˆ๋ฒ•์ง„

ํ–‰์šด ์š”์†Œ 3๊ฐœ๋ฅผ ์„ ํƒํ•˜๋ฉด ์˜ค๋Š˜์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ํ–‰์šด ์ ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.

lotto-magic-frontend.vercel.app

 

 

 

 

 

 

1. Zod

  • TypeScript๋ฅผ ์œ„ํ•œ ์Šคํ‚ค๋งˆ ์„ ์–ธ ๋ฐ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ์™€ ๊ทœ์น™์„ ์ •ํ™•ํžˆ ๊ฐ–์ถ”๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.
  • TypeScript๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์—๋งŒ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•ด์ค€๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ๋ณ€ํ™˜๋˜์–ด ์‹ค์ œ๋กœ ์›น๋ธŒ๋ผ์šฐ์ €๋‚˜ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๋•Œ๋Š” ์ˆœ์ˆ˜ํ•œ JavaScript๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๋ถˆ๊ฐ€ํ•˜๋‹ค.
  • ๋งŒ์•ฝ ์„œ๋ฒ„ API์—์„œ ์ˆซ์ž๋ฅผ ๋ณด๋‚ด์ฃผ๊ธฐ๋กœ ํ–ˆ๋Š”๋ฐ ์‹ค์ˆ˜๋กœ ๋ฌธ์ž๋ฅผ ๋ณด๋ƒˆ์„ ๊ฒฝ์šฐ, TypeScript๋งŒ์œผ๋กœ๋Š” ์‹คํ–‰ ์ค‘์— ์•ฑ์ด ๊ณ ์žฅ๋‚˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์—†๋‹ค.
  • ๊ทธ๋ž˜์„œ Zod๋Š” ์ด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘์— ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • Zod ์‚ฌ์šฉ ์˜ˆ์‹œ : ์™ธ๋ถ€ API ์‘๋‹ต ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ, ์‚ฌ์šฉ์ž ์ž…๋ ฅ ํผ ๊ฒ€์ฆ, ๋ฐฑ์—”๋“œ API ์š”์ฒญ ๊ฒ€์ฆ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฒ€์‚ฌ ๋“ฑ์ด ์žˆ๋‹ค.

 

 

 


 

 

 

 

2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

npm install zod

 

 

 

 


 

 

 

 

 

3. lottoApi.ts

import { z } from 'zod';
z๋Š” Zod์˜ ๊ธฐ๋Šฅ์„ ๋ชจ์•„๋‘” ๊ฐ์ฒด์ด๋‹ค. importํ•˜๋ฉด ์•„๋ž˜์˜ ๊ฒƒ๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
z.string()
z.number()
z.object(...)
z.array(...)โ€‹


์ด ์ค‘์— z.string์€ ์ด ๋ฐ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. 

 

export const LottoOptionsResponseSchema = z.object({
    options: z.array(z.string()),
});
์„œ๋ฒ„์—์„œ ๋กœ๋˜ ์˜ต์…˜ ๋ชฉ๋ก์„ ๋ฐ›์•„์˜ฌ ๋•Œ์˜ ์‘๋‹ต ๋ชจ์–‘์„ ๊ฒ€์‚ฌํ•˜๋Š” ์Šคํ‚ค๋งˆ์ด๋‹ค. 
{
  options: ['๊ฐœ๊ฟˆ', 'ํ–‰์šด', '๋‚ด๋ˆ']
}โ€‹

์ด๋Ÿฐ ๋ฐ์ดํ„ฐ๋งŒ ํ†ต๊ณผํ•˜๋„๋ก ํ•œ๋‹ค. ์™œ๋ƒ๋ฉด z.object ๋•Œ๋ฌธ์ธ๋ฐ, z.object๋Š” ์ด ๋ฐ์ดํ„ฐ๋Š” ๊ฐ์ฒด์—ฌ์•ผํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ทธ๋ž˜์„œ { } ์ด๋Ÿฐ ํ˜•ํƒœ์—ฌ์•ผ ํ•œ๋‹ค.

Zod๋Š” ์ฝ”๋“œ๊ฐ€ ์ง๊ด€์ ์ด๋‹ค. ๋ณด๋ฉด z.object๋Š” { }์„ ์˜๋ฏธํ•˜๊ณ  options๊ฐ€ ์žˆ์–ด์•ผํ•˜๋ฉฐ ๊ทธ ์•ˆ์—๋Š” ๋ฌธ์ž์—ด๋กœ ์ด๋ค„์ง„ ๋ฐฐ์—ด์ด ์™€์•ผํ•œ๋‹ค๊ณ  ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์‹ค์ œ๋กœ ๋ฐ›์•„์˜ฌ ๋•Œ ์‘๋‹ต ๋ชจ์–‘์„ ์‚ดํŽด๋ณด๋ฉด options: ['๋ฌธ์ž์—ด1', '๋ฌธ์ž์—ด2', '๋ฌธ์ž์—ด3'] ์ด๋Ÿฐ ๋ฐฐ์—ด ๊ตฌ์กฐ๊ฐ€ ๋œ๋‹ค.

 

export const DrawLottoRequestSchema = z.object({
    selectedOptions: z.array(z.string()).length(3),
});
๋กœ๋˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฝ‘์„ ๋•Œ ์„œ๋ฒ„๋กœ ๋ณด๋‚ด๋Š” ์š”์ฒญ ๋ฐ์ดํ„ฐ์˜ ๋ชจ์–‘์ด๋‹ค. ์œ„์˜ ์ฝ”๋“œ์™€ ๋‹ค๋ฅธ ์ ์€  lengh(3)์ด ๋ถ™์€ ๊ฒƒ์ด๋‹ค. ๋ฐฐ์—ด์˜ ๊ธธ์ด๊ฐ€ ์ •ํ™•ํžˆ 3๊ฐœ์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์˜๋ฏธํ•œ๋‹ค. ๋งŒ์•ฝ 2๊ฐœ๋‚˜ 4๊ฐœ์˜ ๋ฐฐ์—ด์ด ์˜จ๋‹ค๋ฉด ๊ทธ๊ฑด ์‹คํŒจํ•œ๋‹ค.

 

export const LottoDrawResponseSchema = z.object({
    numbers: z
        .array(z.number().int().min(1).max(45))
        .length(6)
        .refine(
            (numbers) => new Set(numbers).size === numbers.length,
            {
                message: '๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.',
            }
        ),

    luckScore: z.number().int().min(0).max(100),
    luckMessage: z.string(),
    selectedOptions: z.array(z.string()).length(3),

    spellNumber: z.number().int().min(1).max(9),
    spellImageUrl: z.string(),
});

์„œ๋ฒ„๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ชจ์–‘์œผ๋กœ ์‘๋‹ต์„ ํ•ด์•ผํ•œ๋‹ค.

{
  numbers: [3, 11, 18, 24, 36, 42],
  luckScore: 87,
  luckMessage: '์šฐ์ฃผ ํ†ต์‹  ์—ฐ๊ฒฐ ์™„๋ฃŒ',
  selectedOptions: ['๊ฐœ๊ฟˆ', 'ํ–‰์šด', '๋‚ด๋ˆ'],
  spellNumber: 5,
  spellImageUrl: '/images/spell5.png'
}

 

์™œ ์ด๋ ‡๊ฒŒ ๋˜๋Š”์ง€ ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

numbers: z
    .array(z.number().int().min(1).max(45))
    .length(6)
    .refine(...)


๋กœ๋˜ ๋ฒˆํ˜ธ 6๊ฐœ๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. numbers๋Š” ๋ฐฐ์—ด ๊ตฌ์กฐ์ด๋ฉด์„œ, 1๋ถ€ํ„ฐ 45๊นŒ์ง€ ์ด๋ค„์ง„ ์ˆซ์ž๋กœ ์ •์ˆ˜๋งŒ ํ—ˆ์šฉํ•œ๋‹ค. ๋ฐฐ์—ด ์ „์ฒด ๊ธธ์ด๋Š” ์ •ํ™•ํžˆ 6๊ฐœ์—ฌ์•ผ ํ•œ๋‹ค. 

.refine(
    (numbers) => new Set(numbers).size === numbers.length,
    {
        message: '๋กœ๋˜ ๋ฒˆํ˜ธ๋Š” ์ค‘๋ณต๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.',
    }
)


.refine( )์€ Zod๊ฐ€ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒ€์‚ฌ๋งŒ์œผ๋กœ ๋ถ€์กฑํ•  ๋•Œ ์ง์ ‘ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘๋ณต ๋ฒˆํ˜ธ๊ฐ€ ์—†์–ด์•ผํ•œ๋‹ค๋Š” ๊ทœ์น™์„ ์ง์ ‘ ๋งŒ๋“ค์—ˆ๋‹ค.(๋กœ๋˜๋Š” ์ค‘๋ณต ๋ฒˆํ˜ธ๊ฐ€ ์—†์œผ๋‹ˆ) numbers์—๋Š” ์•ž์—์„œ ๊ฒ€์ฆ๋œ ๋ฐฐ์—ด์ด ๋“ค์–ด์˜จ๋‹ค. ์ด ๋ฐฐ์—ด์„ new Set์œผ๋กœ ๋ฐ”๊พธ๋ฉด ์ค‘๋ณต์ด ์ œ๊ฑฐ๋œ๋‹ค. ๋งŒ์•ฝ [1,2,3,4,5,5]๊ฐ€ ๋“ค์–ด์™”๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. set์œผ๋กœ ๋ฐ”๋€Œ๋ฉด [1,2,3,4,5]๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ size(5)๊ฐ€ number.length(6)์™€ ๋งž์ง€ ์•Š๊ฒŒ๋˜์–ด์„œ ๊ฒ€์ฆ์— ์‹คํŒจํ•˜๊ฒŒ๋œ๋‹ค.

๊ทธ ๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋น„์Šทํ•œ ๊ตฌ์กฐ์ด๋‹ˆ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

 

export type LottoOptionsResponse = z.infer<typeof LottoOptionsResponseSchema>;
export type DrawLottoRequest = z.infer<typeof DrawLottoRequestSchema>;
export type LottoDrawResponse = z.infer<typeof LottoDrawResponseSchema>;
์ด ๋ถ€๋ถ„์€ Zod ์Šคํ‚ค๋งˆ๋ฅผ TypeScript ํƒ€์ž…์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. z.infer<typeof Schema>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ‚ค๋งˆ ์ •์˜์—์„œ ์ •์  TypeScript ํƒ€์ž…์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. 
export const DrawLottoRequestSchema = z.object({
    selectedOptions: z.array(z.string()).length(3),
});โ€‹

 

์ด ์ฝ”๋“œ๋ฅผ Zod๊ฐ€ TypeScript ํƒ€์ž…์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์•„๋ž˜์™€ ๋น„์Šทํ•œ ํƒ€์ž…์ด ๋œ๋‹ค.
type DrawLottoRequest = {
  selectedOptions: string[];
}โ€‹


Zod์˜ ํฐ ์žฅ์ ์€ ์Šคํ‚ค๋งˆ๋ฅผ ๊ณ ์น˜๋ฉด ์•Œ์•„์„œ ํƒ€์ž…์ด ์ž๋™์œผ๋กœ ๋”ฐ๋ผ ๊ณ ์ณ์ง„๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

 

// Primses๋Š” ๋‚˜์ค‘์— ๊ฒฐ๊ณผ๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๊ณณ์œผ๋กœ
// ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ๋‚˜์ค‘์— ๊ฒฐ๊ณผ ์ค„๊ฒŒ ํ•˜๊ณ  ์•ฝ์†ํ•˜๋Š” ๋А๋‚Œ์œผ๋กœ ์‚ฌ์šฉํ•ด์„œ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
// ์™œ ๋‚˜์ค‘์— ๋ฐ›๋ƒ? fetch ๋•Œ๋ฌธ์ด๋‹ค.
// ์„œ๋ฒ„ ์‘๋‹ต์€ ๋ฐ”๋กœ ์˜ค์ง€ ์•Š์•„์„œ, ์‘๋‹ต์ด ์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฉˆ์ถฐ์žˆ์ง€ ์•Š๊ณ  Promise๋กœ ์˜ˆ์•ฝ์„ ๊ฑธ์–ด๋‘”๋‹ค.
export async function getLottoOptions(): Promise<LottoOptionsResponse> {
    const response = await fetch(createApiUrl('/api/lotto/options'));

    if (!response.ok) {
        const message = await getErrorMessage(response);
        throw new Error(message);
    }

    const data = await response.json();

    return LottoOptionsResponseSchema.parse(data);
}
์—ฌ๊ธฐ์„œ Zod๊ฐ€ ์‹ค์ œ๋กœ ์ผ์„ ํ•œ๋‹ค.
    const data = await response.json();โ€‹


์„œ๋ฒ„์—์„œ ๋ฐ›์€ JSON์„ JavaScript ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ์˜ data๋Š” ๋ฏฟ์„ ์ˆ˜ ์—†๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ œ ์ด ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•ด์•ผํ•œ๋‹ค.

LottoOptionsResponseSchema.parse(data)


.parse( )๋Š” ์ž…๋ ฅ๊ฐ’์„ ์Šคํ‚ค๋งˆ์— ๋งž๊ฒŒ ๊ฒ€์ฆํ•˜๊ณ  ๋งž์€๋ฉด ํƒ€์ž…์ด ๋ณด์žฅ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ฒ€์ฆ์— ์‹คํŒจํ•˜๋ฉด ZodError๋ฅผ ๋˜์ง„๋‹ค.

 

 

- lottoApi.ts ์ „์ฒด ์ฝ”๋“œ

 

lotto-magic-frontend/lib/api/lottoApi.ts at main · hyeong-ing/lotto-magic-frontend

๋กœ๋˜ ๋งˆ๋ฒ•์ง„ ์ƒ์„ฑ ์›น์‚ฌ์ดํŠธ_ ํ”„๋ก ํŠธ ์ฝ”๋“œ. Contribute to hyeong-ing/lotto-magic-frontend development by creating an account on GitHub.

github.com

 

 

 

 


 

 

 

 

4. ResultPage.tsx

import {
    LottoDrawResponseSchema,
    type LottoDrawResponse,
} from '@/lib/api/lottoApi';
ResultPage๋Š” Zod์™€ ์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐ์‹œ์ผฐ๋‹ค. ์•„๊นŒ ๋งŒ๋“ค์—ˆ๋˜ lottoApi์—์„œ Zod ์Šคํ‚ค๋งˆ์™€ Zod๋กœ ๋งŒ๋“  ํƒ€์ž…์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

    useEffect(() => {
        // ๊ฒฐ๊ณผ๋ฅผ ์ž ๊น sessionStorage๋กœ ์ €์žฅํ•œ๋‹ค.
        // ์ƒˆ๋กœ๊ณ ์นจํ•ด๋„ ๊ฐ™์€ ํ™”๋ฉด์ด ๋ณด์ด๋„๋ก ํ–ˆ๋‹ค.
        const savedResult = sessionStorage.getItem('lotto-result');
        
        // ์ €์žฅ๋œ ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ํ† ์ŠคํŠธ ๋‚˜ํƒ€๋‚˜๊ณ 
        // ๋ฃจํŠธ ํ™”๋ฉด์œผ๋กœ ์ด๋™์‹œํ‚จ๋‹ค.
        if (!savedResult) {
            showMagicToast('์ €์žฅ๋œ ๊ฒฐ๊ณผ๊ฐ€ ์—†์–ด์š”.');
            router.replace('/');
            return;
        }

        try {
            // 
            const parsedJson = JSON.parse(savedResult);
            const safeResult = LottoDrawResponseSchema.parse(parsedJson);

            setResult(safeResult);
        } catch (error) {
            // ์—๋Ÿฌ ๋ฐœ์ƒ์‹œ ์ฝ˜์†”์— ์–ด๋–ค ์—๋Ÿฌ์ธ์ง€ ๋ณด์—ฌ์ค€๋‹ค.
            console.error(error);
            
            // ๊ทธ๋ฆฌ๊ณ  sessionStorage์— ์ €์žฅ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ์ง€์šด๋‹ค.
            sessionStorage.removeItem('lotto-result');
            // ํ† ์ŠคํŠธ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ณ 
            showMagicToast('๊ฒฐ๊ณผ ์ •๋ณด๋ฅผ ์ฝ์ง€ ๋ชปํ–ˆ์–ด์š”.');
            // ๋ฃจํŠธ ํ™”๋ฉด์œผ๋กœ ๋ณด๋‚ธ๋‹ค.
            router.replace('/');
        }
    }, [router]);
const parsedJson = JSON.parse(savedResult);
const safeResult = LottoDrawResponseSchema.parse(parsedJson);

setResult(safeResult);


Zod๊ฐ€ ์‹ค์ œ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์€ ์œ„์˜ ์ฝ”๋“œ์ด๋‹ค. sessionStorage์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฌธ์ž์—ด์ด๋‹ค.

'{"numbers":[1,2,3,4,5,6],"luckScore":80,...}'


๋Œ€์ถฉ ์ด๋Ÿฐ์‹์œผ๋กœ ์ €์žฅ๋˜์–ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋Š” ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋ณด์—ฌ๋„ ๋ฌธ์ž์—ด์ด๋‹ค. 

const parsedJson = JSON.parse(savedResult);


๊ทธ๋ž˜์„œ JavaScript ๊ฐ์ฒด๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. JSON.parse( ) ๋ฉ”์„œ๋“œ๋Š” JSON ๋ฌธ์ž์—ด์˜ ๊ตฌ๋ฌธ์„ ๋ถ„์„ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ์—์„œ JavaScript ๊ฐ’์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

const safeResult = LottoDrawResponseSchema.parse(parsedJson);


์ด ์ฝ”๋“œ์—์„œ Zod ์Šคํ‚ค๋งˆ๋กœ ๊ฒ€์‚ฌ๊ฐ€ ์ด๋ค„์ง„๋‹ค. parsedJson์ด LottoDrawResponseSchema ๊ทœ์น™์— ๋งž๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๊ณ , ๋งž์œผ๋ฉด safeResult์— ์˜ฌ๋ฐ”๋ฅธ ๋กœ๋˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ„๋‹ค.

 

 

 

- JSON.parse( )

 

JSON.parse() - JavaScript | MDN

 

developer.mozilla.org

 

 

 

- ResultPage.tsx ์ „์ฒด์ฝ”๋“œ

 

lotto-magic-frontend/components/result/ResultPage.tsx at main · hyeong-ing/lotto-magic-frontend

๋กœ๋˜ ๋งˆ๋ฒ•์ง„ ์ƒ์„ฑ ์›น์‚ฌ์ดํŠธ_ ํ”„๋ก ํŠธ ์ฝ”๋“œ. Contribute to hyeong-ing/lotto-magic-frontend development by creating an account on GitHub.

github.com