๐Ÿžํ”„๋กœ๊ทธ๋ž˜๋ฐ/Next.js

๐Ÿžํ”„๋กœ๊ทธ๋ž˜๋ฐ/Next.js

[์ •๋ณด] NextAuth.js Type ์—๋Ÿฌ ์žก๊ธฐ - CredentialsProvider / prisma

์ˆ˜์ • ํฌ์ธํŠธ๋Š” 2๊ฐœ์ด๋‹ค. credentials์˜ type์„ ๋ช…์‹œ, ๋กœ๊ทธ์ธ ์„ฑ๊ณตํ•˜๊ณ  return ๋˜๋Š” user ๊ฐ’์„ any๋กœ ๋ฐ˜ํ™˜ import bcrypt from "bcrypt"; import NextAuth, { AuthOptions } from "next-auth"; import CredentialsProvider from "next-auth/providers/credentials"; import prismadb from "@/app/lib/prisma"; import { PrismaAdapter } from "@auth/prisma-adapter"; export const authOptions: AuthOptions = { providers: [ CredentialsProvider({ name: "..

๐Ÿžํ”„๋กœ๊ทธ๋ž˜๋ฐ/Next.js

[Nextjs] api return ๊ฐ’ ๊ฐฑ์‹  ์•ˆ๋˜๋Š” ์ด์œ 

์›์ธ fetch๋กœ api๋ฅผ ํ˜ธ์ถœ ์‹œ cache๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. dev ํ™˜๊ฒฝ์—์„œ๋Š” cache ์—†์ด ๊ฐฑ์‹ ๋˜์„œ ์ž˜๋˜์—ˆ์ง€๋งŒ production ํ™˜๊ฒฝ์—์„œ๋Š” cache๋กœ ๋ณ€๊ฒฝ์ด ๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค. prisma์˜ findMany findDelete๊ฐ€ ๊ณ ์žฅ๋‚œ์ค„ ์•Œ์•˜๋‹ค ํ•ด๊ฒฐ๋ฐฉ๋ฒ• api tsํŒŒ์ผ์— dynamic ์ง€์ • // /api/log/route.ts import prismadb from '@/app/libs/prismadb'; import { NextResponse } from 'next/server'; // ํ˜ธ์ถœ์‹œ cache ์—†์ด ์ˆ˜ํ–‰ export const dynamic = 'force-dynamic'; export async function GET(request: Request) { try { const l..

๐Ÿžํ”„๋กœ๊ทธ๋ž˜๋ฐ/Next.js

[nextjs] ์—‘์…€ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

nextjs์—์„œ ํ•˜๋„ api ๋‹จ์—์„œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๋ณ„ ์ง“์„ ํ•ด๋ณด์•˜์ง€๋งŒ ์ž˜ ๋˜์ง€์•Š์•„์„œ json ๋ฐฐ์—ด์„ ๋ฐ›์•„ ํ”„๋ก ํŠธ์—์„œ ์ €์žฅํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ๋‹ค. ์ถœ์ฒ˜ https://kwtjdtn.tistory.com/9 [Javascript] xlsx๋ฅผ ์ด์šฉํ•˜์—ฌ json data๋ฅผ ์—‘์…€ ํŒŒ์ผ๋กœ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ธฐ (์ดˆ๊ฐ„๋‹จ) ์–ด๋“œ๋ฏผ ์„œ๋น„์Šค์— JSON ๋ฐ์ดํ„ฐ๋ฅผ ์—‘์…€ ํŒŒ์ผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๊ฒ ์ง€๋งŒ xlsx ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. (๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ,,) ๋ผ kwtjdtn.tistory.com import * as XLSX from 'xlsx'; const downloadExcel = (data) => { const worksheet = XLSX.ut..

๐Ÿžํ”„๋กœ๊ทธ๋ž˜๋ฐ/Next.js

[Nextjs] ํŒŒ์ผ ์—…๋กœ๋“œ(file upload)

ํด๋ผ์ด์–ธํŠธ const fileUpload = async (file: Blob) => { const formData = new FormData(); formData.append('file', file, file.name); // ํŒŒ์ผ ์ด๋ฆ„์„ ๋ช…์‹œ try { const res = await fetch('/api/upload', { method: 'POST', body: formData, }); const data = await res.json(); console.log('์„œ๋ฒ„ ์‘๋‹ต:', data); } catch (error) { console.error('ํŒŒ์ผ ์—…๋กœ๋“œ ์ค‘ ์˜ค๋ฅ˜:', error); } }; export default fileUpload; ์„œ๋ฒ„(api/upload/route.ts. import..

๐Ÿžํ”„๋กœ๊ทธ๋ž˜๋ฐ/Next.js

[์ •๋ณด] next.js localhost:3000 ์ ‘์† ๋ถˆ๊ฐ€

ํ•ด๊ฒฐ๋ฐฉ๋ฒ• ํ”„๋กœ์ ํŠธ ํด๋”์•ˆ์˜ .next ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ  npm run dev ์ˆ˜ํ–‰ ์›์ธ์„ค๋ช… next.js์— ์ฒ˜์Œ ์ž…๋ฌธํ•˜๊ณ  intellij๋ฅผ ํ†ตํ•ด์„œ ์ƒ˜ํ”Œ ํ”„๋กœ์ ํŠธ๋ฅผ dev๋กœ ์‹คํ–‰ํ•˜๊ณ ์ž ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋‚˜๋Š” http://localhost:3000์—์„œ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๋งŒ ํ™•์ธํ•˜๊ณ  ์ž˜ ๋˜์—ˆ๋‚˜ ๋ณด๋‹ค๋ผ๊ณ  ํ•˜๊ณ  ์‹คํ–‰ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ ‘์†์ด ๋ถˆ๊ฐ€ํ•˜์˜€๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ์˜ฌ๋ผ์˜ค๋ ค๋ฉด ์œ„์˜ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๋‹ค ๋‚˜์™€์•ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์–ด์ฉŒ๋‹ค ๋ณด๋‹ˆ powershell ๋˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ์—์„œ ์ž˜ ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•„ ๋„ˆ๋ฌด ์˜์•„ํ•ด ํ–ˆ๋‹ค ๊ทธ๋Ÿฌ๋˜ ์™€์ค‘์— ํ•ด๊ฒฐ ๋ฒ•์„ ์ฐพ์•˜๋‹ค. ๋ฐ”๋กœ ํ”„๋กœ์ ํŠธ ํด๋”์•ˆ์˜ .next ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ  npm run dev ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. https://stackoverflow.com/questions/7..

TwoIceFish
'๐Ÿžํ”„๋กœ๊ทธ๋ž˜๋ฐ/Next.js' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก