๐Ÿ“… ์™œ Date๋กœ ์ €์žฅํ–ˆ๋Š”๋ฐ ๊บผ๋‚ด๋ณด๋ฉด ๋ฌธ์ž์—ด์ผ๊นŒ?

Jisunminยท2025๋…„ 6์›” 25์ผ
post-thumbnail

Prisma์—์„œ new Date()๋กœ ์ €์žฅํ•œ ๊ฐ’์ด ์™œ string์œผ๋กœ ๋‚˜์˜ฌ๊นŒ?


๐Ÿ” ์ƒํ™ฉ ์„ค๋ช…

์ „ ์žฅ seed.ts ํŒŒ์ผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Prisma๋กœ ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ ‡๊ฒŒ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.

deadline: new Date("2025-12-31")

DB์—๋„ timestamp ํƒ€์ž…์œผ๋กœ ์ž˜ ์ €์žฅ๋๊ณ , ๋ฌธ์ œ์—†์–ด ๋ณด์˜€์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ๊ฐ’์„ ๊บผ๋‚ด์„œ ์ฝ˜์†”์— ์ฐ์–ด๋ณด๋‹ˆ, ํƒ€์ž…์ด ๋ฌธ์ž์—ด(string)๋กœ ๋‚˜์™”๊ณ ,
Date ๊ฐ์ฒด์ธ์ง€ ํ™•์ธํ•˜๋Š” instanceof Date ๊ฒฐ๊ณผ๋Š” false์˜€์Šต๋‹ˆ๋‹ค.

console.log(typeof project.deadline); // string
console.log(project.deadline instanceof Date); // false

โ“ ์™œ ์ด๋Ÿฐ ํ˜„์ƒ์ด ๋ฐœ์ƒํ• ๊นŒ?

Prisma๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ DateTime ํ•„๋“œ๋ฅผ JavaScript์˜ Date ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์„œ๋ฒ„ ๋‚ด๋ถ€์—์„œ console.log(project.deadline instanceof Date)๋ฅผ ํ•˜๋ฉด true๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ๋Š” ๋ณดํ†ต JSON ํฌ๋งท์œผ๋กœ ์ง๋ ฌํ™”ํ•ด์„œ ์ „๋‹ฌํ•˜๋Š”๋ฐ,
์ด ๊ณผ์ •์—์„œ Date ๊ฐ์ฒด๋Š” ์ž๋™์œผ๋กœ ISO 8601 ๋ฌธ์ž์—ด (์˜ˆ: "2025-12-31T00:00:00.000Z")๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ด ์ง๋ ฌํ™” ๊ณผ์ •์€ JSON.stringify()๋‚˜ Next.js์˜ NextResponse.json() ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰,

  • Prisma๋Š” ์„œ๋ฒ„ ๋‚ด์—์„œ Date ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ ,
  • ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ตํ•  ๋•Œ๋Š” JSON ์ง๋ ฌํ™” ๊ณผ์ •์—์„œ Date ๊ฐ์ฒด๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์–ด ์ „์†ก๋˜๊ณ ,
  • ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” ์ด ๋‚ ์งœ ๋ฌธ์ž์—ด์„ ๋ฐ›์•„์„œ ํ•„์š”ํ•˜๋ฉด ๋‹ค์‹œ new Date()๋กœ ๊ฐ์‹ธ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ›์€ ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ Date ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

const deadline = new Date(project.deadline);

console.log(deadline instanceof Date); // true
console.log(deadline.getFullYear()); // 2025

โœ… ์š”์•ฝ ์ •๋ฆฌ

์ €์žฅ ์‹œ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ (Prisma)API ์‘๋‹ต / ํด๋ผ์ด์–ธํŠธ์—์„œํƒ€์ž…
new Date("2025-12-31")Date ๊ฐ์ฒดISO 8601 ๋ฌธ์ž์—ดstring

Prisma๋Š” ๋‚ ์งœ๋ฅผ ์ €์žฅํ•  ๋•Œ Date ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ,
๊ฐ€์ ธ์˜ฌ ๋•Œ๋„Date ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ,
JSON์œผ๋กœ ์‘๋‹ตํ•  ๋•Œ๋Š” ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์–ด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.

=> NextResponse.json์˜.json() ๋•Œ๋ฌธ์— Date๊ฐ€ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๋€Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก๊ตฌํ˜„

์ œ๊ฐ€ ์‹ค์ œ๋กœ ์ ์šฉํ•œ ๋‚ ์งœ ํฌ๋งท ํ•จ์ˆ˜์™€ ์‚ฌ์šฉ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


// .helper.ts
export const convertDateToString = (date: Date, separator = ""): string => {
  if (!date || !(date instanceof Date)) {
    console.error("Invalid Date");
    return ""; // ๋นˆ ๋ฌธ์ž์—ด ๋ฐ˜ํ™˜
  }
  const year = date.getFullYear();
  const month = (date.getMonth() + 1).toString().padStart(2, "0");
  const day = date.getDate().toString().padStart(2, "0");

  switch (separator) {
    case "ko":
      return `${year}๋…„ ${month}์›” ${day}์ผ`;
    default:
      return `${year}${separator}${month}${separator}${day}`;
  }
};
<p className="text-gray-600">
  ๐Ÿ—“ ๋งˆ๊ฐ์ผ: {convertDateToString(new Date(project.deadline), '-')}
</p>

์ด๋ ‡๊ฒŒ new Date()๋กœ ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ๊ฐ์‹ธ์„œ Date ๊ฐ์ฒด๋กœ ๋งŒ๋“  ํ›„ ํฌ๋งท ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๋ฉด,
์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋‚ ์งœ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

profile
๋‹จ์ˆœ ์‚ฌ์šฉ์ž๊ฐ€ ์•„๋‹Œ, ์ดํ•ดํ•˜๊ณ  ๋งŒ๋“œ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ก.

0๊ฐœ์˜ ๋Œ“๊ธ€