๋ฐ˜์‘ํ˜•

nextjs,tailwindcss,vercel 74

[๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค] nextjs app router ์—์„œ google tag manager ์‰ฝ๊ฒŒ ์ ์šฉํ•˜๊ธฐ

https://tagmanager.google.com/๊ตฌ๊ธ€ ํƒœ๊ทธ๋งค๋‹ˆ์ €๋กœ ๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค ์ ์šฉํ•˜๋ ค๋ฉด, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š”๋ฐ, ๊ณ ๋Œ€๋กœ ๋ณต๋ถ™ํ•˜๋ฉด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค. https://nextjs.org/docs/app/building-your-application/optimizing/third-party-libraries Optimizing: Third Party Libraries | Next.jsOptimize the performance of third-party libraries in your application with the `@next/third-parties` package.nextjs.org ์„ค์น˜npm install @next/third-parties@latest..

Vercel์—์„œ ํŒŒ์ผ ์ฝ๊ณ  ์“ฐ๊ธฐ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? (์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ)

Vercel๋กœ ๋ฐฐํฌํ•˜๊ณ ๋‚˜์„œ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ ๋‹ค๋˜๊ฐ€, ํŒŒ์ผ์„ ์ €์žฅํ•œ๋‹ค๋˜๊ฐ€, ์ฝ๊ณ  ์“ด๋‹ค๋˜๊ฐ€ ํ•˜๋Š” fs ํ™œ๋™์— ์ œ์•ฝ์ด ์žˆ๋‹ค.์‹ค์ œ๋กœ ๋ง‰์ƒ ๋ฐฐํฌ๋ฅผ ํ•ด๋ณด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋งŽ์ด ์ƒ๊ธด๋‹ค.  ๋กœ์ปฌ์—์„œ๋Š” ๋˜์ง€๋งŒ, vercel์— ๋ฐฐํฌํ•˜๋ฉด ์„œ๋ฒ„๋ฆฌ์Šค ํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ตฌ์กฐ์ ์œผ๋กœ ์ด๋ฏธ์ง€ ๋‚˜ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ์„œ๋ฒ„๋ฅผ ํ•˜๋‚˜ ๋” ๋‘”๋‹ค. (์•„๋งˆ์กด์˜ S3 ๊ฐ™์€)๊ทธ์น˜๋งŒ ๋‚˜๋Š” ์ด๋ ‡๊ฒŒ ํ•˜๊ธฐ ์‹ซ์—ˆ๋‹ค. ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์ด๋ฏธ์ง€ ์„œ๋ฒ„๋Š” ๋” ์„œ๋น„์Šค๊ฐ€ ์ปค์ง€๋ฉด ๋„์ž…ํ•˜๊ณ  ์‹ถ์—ˆ๊ธฐ ๋–„๋ฌธ์ด๋‹ค(๋ฌผ๋ก  ํ•ด๋ณด๋Š” ๊ฒฝํ—˜๋„ ์ข‹์„๊ฒƒ์ด๊ณ  ๋‚˜์ค‘์— ์„œ๋น„์Šค๋ฅผ ๋” ๋งŒ๋“ค๋‹ค๋ณด๋ฉด ์–ธ์  ๊ฐ€ ํ•˜๊ฒŒ๋˜๋ฆฌ๋ผ๋Š” ์ƒ๊ฐ์ด ์žˆ๋‹ค. ) ๋‹ค์Œ์„ ์ฐธ๊ณ ํ•ด์„œ ์‹œ๋„ํ•ด๋ณด์•˜๋‹ค. https://vercel.com/guides/how-can-i-use-files-in-serverless-functionshttps://vercel.com..

์นจ์ฐฉ๋งจ ๋กœ๋˜ ๋ถ„์„์—์„œ ์˜๊ฐ๋ฐ›์•„ ๋กœ๋˜๋ฒˆํ˜ธ ์ƒ์„ฑ๊ธฐ ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•˜๊ธฐ

ํ›„๋”ฑ ๋งŒ๋“ค์–ด๋ณธ ๋กœ๋˜๋ฒˆํ˜ธ์ƒ์„ฑ๊ธฐ๋ญ”๊ฐ€ ๊ฒฝ์ œ์  ์ž์œ ๋ฅผ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํˆฌ์ž, ๋กœ๋˜, ๋ถ€์—…, ์„ธ๊ธˆ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๋„์™€์ฃผ๋Š” ๊ณ„์‚ฐ๊ธฐ ํ”Œ๋žซํผ ๊ฐ™์ด ํ™•์žฅ์‹œ์ผœ๋ณด๊ณ ์ž ํ•œ๋‹ค. ๋ญ ์ด๊ฒƒ์ €๊ฒƒ ํ•˜๋‹ค๋ณด๋ฉด ๊นจ๋‹ซ๋Š”๊ฒŒ ์žˆ์ง€ ์•Š์„๊นŒ?๋žœ๋ค์œผ๋กœ 6๊ฐœ ์ˆซ์ž๋ฅผ ๋ฝ‘๋Š”๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ 1,2,3,4,5,6์„ ๋ฝ‘์„๋ฆฌ๋Š” ์—†๊ณ ์˜ˆ์ „์— ์นจ์ฐฉ๋งจ์ด ๋กœ๋˜ ๋ฒˆํ˜ธ ์—ฐ๊ตฌํ•˜๋Š” ๊ฒƒ์—์„œ ์˜๊ฐ์„ ๋ฐ›์•˜๋‹ค. ์ทจํ•  ๊ฒƒ๋งŒ ์ทจํ•˜๊ณ  ๋ฒ„๋ฆด๊ฑด ๋ฒ„๋ฆฌ๋ ค๊ณ ์ผ๋‹จ 1๋ฒˆ๋Œ€ 20๋ฒˆ๋Œ€ 30๋ฒˆ๋Œ€๋Š” ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จํ•œ๋‹ค10, 40๋ฒˆ๋Œ€๋Š” 1๊ฐœ ์ดํ•˜๋กœ ๋ฝ‘๋Š”๋‹ค ๋‚˜๋จธ์ง€๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์ˆซ์ž ์ค‘์—์„œ ๋žœ๋ค์œผ๋กœ ๋ฝ‘์•„ ์ตœ์ข… 6๊ฐœ๋ฅผ ๋งŒ๋“ ๋‹ค, 1๋ฒˆ๋Œ€ 20๋ฒˆ๋Œ€ 30๋ฒˆ๋Œ€๋Š” ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜ ์ด์ƒ ํฌํ•จํ•œ๋‹คconst num1 = Math.floor(Math.random() * 9) + 1; // 1๋ถ€ํ„ฐ 9๊นŒ์ง€์˜ ์ˆซ์žconst num20 ..

nextjs ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ธฐ, ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์— ์‚ฌ์ดํŠธ ๋“ฑ๋ก

nextjs์—์„œ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ธฐ 1. ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ๋กœ๊ทธ์ธhttps://console.cloud.google.com/ Google ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ๋กœ๊ทธ์ธ Google ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์œผ๋กœ ์ด๋™accounts.google.com   2. New Project ๋งŒ๋“ค๊ธฐ์ด๋ฆ„ ์ž…๋ ฅ ํ›„ create   3. API ๋ฉ”๋‰ด๋กœ ์ ‘์† - OAuth consent screen์œผ๋กœ ์ ‘์†  4. ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ•ด๋‹น ์นธ์„ ์ฑ„์šด๋‹ค. ๊ตฌ๊ธ€๋กœ๊ทธ์ธํ• ๋•Œ ๋ณด์ด๋Š” ํ™”๋ฉด ๊ตฌ์„ฑ   5. Credentials - Create Credentials - Oauth Client ID   6. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณ„์† ์ง„ํ–‰  7. ์ €์žฅํ•˜๋ฉด ๋‚˜์˜ค๋Š” Client id ๋ณต์‚ฌํ•ด์„œ .env.local์— ์ €์žฅํ•œ๋‹ค.   .env.localGOOGLE_CLIENT_ID ..

[react-icon] nextjs์—์„œ ์•„์ด์ฝ˜ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ (๋ฌด๋ฃŒ)

๊ตฌ๊ธ€๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜, ๋žœ๋”ฉํŽ˜์ด์ง€๋ฅผ ๊พธ๋ฐ€๋•Œ ์•„์ด์ฝ˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข…์žˆ๋‹ค. ์ œ์ผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ react-icons๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.  https://react-icons.github.io/react-icons React Icons react-icons.github.io  ์›ํ•˜๋Š” ์•„์ด์ฝ˜์„ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ณต์‚ฌ ํ›„ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๋ฉด ๋œ๋‹ค.    ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. import { BiCoinStack } from "react-icons/bi"; ์‹ค์ œ ์ ์šฉํ•œ ์˜ˆ์‹œ div className="bg-white dark:bg-gray-800 rounded-2xl shadow-xl overflow-hidden transform hover:scale-105 transition-transform duration..

NEXTAUTH_SECRET ๋ฐœ๊ธ‰๋ฐ›๋Š” ๋ฒ• (NextAuth)

NEXTAUTH_SECRET ์–ป๋Š” ๋ฒ•์€ ์•„์ฃผ ์‰ฝ๋‹คํ„ฐ๋ฏธ๋„์—์„œ $ openssl rand -base64 32 ์ˆ˜ํ–‰ํ•˜๋ฉด ๋‚˜์˜ค๋Š” ๊ฐ’์„ ๋ณต์‚ฌํ•ด .env.local์— ๋„ฃ์œผ๋ฉด ๋œ๋‹ค.  vercel์— deplpyํ•  ๋•Œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ๋กํ•ด์ฃผ๋Š” ๊ฒƒ์„ ์žŠ์ง€๋ง์ž! ์ถœ์ฒ˜ https://next-auth.js.org/configuration/options#nextauth_secret

[์ธ์ฆ] ์„ธ์…˜, ์ฟ ํ‚ค,jwt, ํ† ํฐ ์ •๋ฆฌ (nextjs getSession, jwt)

๊ตฌ๊ธ€๋กœ๊ทธ์ธ ๊ตฌํ˜„ ํ›„ vercel์— deployํ–ˆ๋Š”๋ฐ middleware์—๋Š” SSR์ธ getsession์„ ์“ธ ์ˆ˜ ์—†๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์™”๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ์›น ์—ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ธ์ฆ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋‹ค. [ ์ธ์ฆ์ด๋ž€? ]์ธ์ฆ๊ณผ ์ธ๊ฐ€์— ๋Œ€ํ•ด ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.  Authentication - ์ธ์ฆ- ์œ ์ €์‹๋ณ„, ์‹ ์›๊ฒ€์ฆ , ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.  Authorization - ์ธ๊ฐ€- ์ธ์ฆ ํ›„, ์œ ์ €๊ฐ€ ์–ด๋””๊นŒ์ง€ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ๋ฝํ•  ๊ฒƒ์ธ๊ฐ€- ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์œ ์ €๋งŒ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€์— ์—‘์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.  [์ฟ ํ‚ค์™€ ์„ธ์…˜]์ฟ ํ‚ค์„œ๋ฒ„ -> ๋ธŒ๋ผ์šฐ์ €๋กœ ์ „์†กํ•ด ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•  ์ž‘์€ ํŒŒ์ผ๋ธŒ๋ผ์šฐ์ €(ํด๋ผ์ด์–ธํŠธ)๋Š” ๋ฐ›์€ ์ฟ ํ‚ค๋ฅผ ์š”์ฒญ์‹œ ๊ฐ™์ด ์ „์†กํ•จ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋ฉด ์„œ๋ฒ„๋Š” ์•„์ด๋””, ๋น„๋ฒˆ์„ ์ฟ ํ‚ค์— ๋‹ด์•„ ์„œ๋ฒ„..

SEO ๊ธฐ๋ณธ์„ค์ • : ๋ฉ”ํƒ€ํƒœ๊ทธ์™€ ๊ตฌ๊ธ€์„œ์น˜์ฝ˜์†”, ๋„ค์ด๋ฒ„์— ๋“ฑ๋กํ•˜๊ธฐ

SEO - ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ƒ๋‹จ์— ๋œจ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ๊ตฌ๊ธ€๊ณผ ๊ฐ™์€ ๊ฒ€์ƒ‰์—”์ง„์€ ๋ด‡์„ ํ†ตํ•ด ์‚ฌ์ดํŠธ๋“ค์„ ํฌ๋กค๋งํ•˜๊ณ  ์ €์žฅ(์ธ๋ฑ์‹ฑ)ํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋ด‡๋“คํ•œํ…Œ ์ด ์‚ฌ์ดํŠธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž˜ ๋ณด์—ฌ์ค˜์„œ ๋†’์€ ์ˆœ์œ„์— ์ฐจ์ง€ํ•˜๋„๋กํ•ด์•ผ ํ•œ๋‹ค.  ์Šฌํ”„๊ฒŒ๋„ ์ •ํ•ด์ง„ ๊ณต์‹์€ ์—†๋‹ค. ์ด๋ ‡๊ฒŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ๊ฒ€์ƒ‰๊ฒฐ๊ณผ ์ฒซ๋ฒˆ์งธ๋กœ ๋œฌ๋‹ค. ์ด๋Ÿฐ๊ฒŒ ์žˆ์œผ๋ฉด ๋„ˆ๋„๋‚˜๋„ ํ•˜๊ธฐ๋–„๋ฌธ์— ๊ณต์‹์ด ๋  ์ˆ˜ ์—†์„๊ฒƒ์ด๋‹ค..๊ทธ๋ƒฅ ์ตœ๋Œ€ํ•œ ํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋“ค์„ ์„ธํŒ…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•œ๋‹ค.  ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋ณด๋‹ˆ ๊ตฌ๊ธ€ ๊ฒ€์ƒ‰ ์ƒ๋‹จ์— ๋œจ๊ฒŒํ•˜๋Š”๊ฒŒ ์—„์ฒญ ์–ด๋ ต๋‹ค ๊ทธ๋ž˜๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ธํŒ…ํ•ด์•ผํ•˜๋Š” ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.  nextjs app router ๋ฅผ ์“ฐ๊ณ  ์žˆ์–ด์„œ ์ด๋ฅผ ์˜ˆ์‹œ๋กœ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค. layout.tsx์—์„œ ๊ตฌ์„ฑํ•œ๋‹ค. [ ์‚ฌ์ดํŠธ ๋“ฑ๋กํ•˜๊ธฐ ]์ผ๋‹จ ๊ฐ€์žฅ ๋จผ์ € ํ•  ์ผ์€ ๊ตฌ๊ธ€ ์„œ์น˜์ฝ˜์†”์— ๋‚ด ์‚ฌ..

[NextJS ๋นŒ๋“œ ์—๋Ÿฌ] Error: `"` can be escaped with `"`, `“`, `"`, `”

๋กœ์ปฌ์—์„œ๋Š” ์•ˆ๋‚˜๋Š”๋ฐ vercel์— ๋นŒ๋“œํ• ๋•Œ ๋‚˜๋Š” ์—๋ŸฌError: `"` can be escaped with `"`, `“`, `"`, `”   .eslintrc.json ์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋ฉด ๋œ๋‹ค. "rules": { "react/no-unescaped-entities": 0 },"rules": {    "react/no-unescaped-entities": 0  }, ์ „์ฒด eslinttrc.json {  "rules": {    "react/no-unescaped-entities": 0  },  "extends": "next/core-web-vitals"}

[๋ฆฌ์•กํŠธ, nextJS] state์™€ useSate ๊ฐœ๋…๊ณผ ์‚ฌ์šฉ๋ฒ•

๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด state์— ๋Œ€ํ•ด ์•Œ์•„์•ผํ•œ๋‹ค. state๋Š” useState() const [likes,setLikes] =useState(0)0์—์„œ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ( [likes,setLikes])likes : state๋ณ€์ˆ˜setLikes : function to update it function Likes() {const [likes, setLikes] = useState(0)const handleClick = () => {setClicks(likes+1)}return(Likes: {likes})};  Controlled ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ,form์—์„œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ด๋‹ค. const [value,setValue] =useState('') function Controll..

๋ฐ˜์‘ํ˜•