nextjs,tailwindcss,vercel 38

[์ธ์ฆ] ์„ธ์…˜, ์ฟ ํ‚ค,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..

[ react , nextJS ] ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ - props ์™€ children

๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง„ props, state ๊ฐœ๋…์— ๋Œ€ํ•ด ์•Œ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.  props๋Š” ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ’, ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ž์‹์—๊ฒŒ ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค.  ๋ถ€๋ชจ-์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹Œ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด์•ผํ•˜๋Š”๊ฒฝ์šฐ, context๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. props์“ฐ๊ธฐ ์•Š๊ณ ๋„ ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค. state๋Š” ๋‚ด๋ถ€์—์„œ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ์ž์‹ ๊ณผ ๊ทธ ํ•˜์œ„์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์นœ๋‹ค. const [count, setCount] = useState(0)1. make prop, give it a value 2. Use prop valuefunction Gretting(props){return {props.text}}*props๋Š” ์˜ค๋ธŒ์ ํŠธ์ž„,๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์—์„œ ๊ฐ’์„..

tailwind css ์—์„œ ์š”์†Œ๋“ค ๋ชจ๋‘ ๊ฐ€์šด๋ฐ ์ •๋ ฌํ•˜๊ธฐ

tailwind css์—์„œ ํ•˜์œ„ ์š”์†Œ๋ฅผ ๊ฐ€์šด๋ฐ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ๋ฒ•  ์ตœ๊ทผ ๋ฐฐ๋‹นํˆฌ์ž ๊ณ„์‚ฐ๊ธฐ ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœํ•˜๋Š” ์ค‘์— ๊ฐ€์šด๋ฐ ์ •๋ ฌ์„ ์ž๋™์œผ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ–ˆ๋‹ค. ์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ๊ฐœ๋ฐœํ•œ ๋ฐฐ๋‹นํˆฌ์ž ์‚ฌ์ดํŠธ!https://www.turtleinvest.site/ko ์ƒ์œ„div์— classname์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ฃผ๊ณ , flex-container items-center justify-center ํ•˜์œ„ ๊ฐ€์šด๋ฐ ์ •๋ ฌํ•  ์š”์†Œ๋“ค์— className = 'text-center" ๋ฅผ ์ฃผ๋ฉด๋œ๋‹คtext-center ์ผ์ผ์ด ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ ์•„์˜ˆ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์ด ์žˆ๋‚˜ ์ฐพ๋Š”์ค‘ ์“ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.  div className="my-3 flex-container items-center justify-center" >  h1 c..

๊ฐ€๋น„์•„์—์„œ ๋„๋ฉ”์ธ ์‚ฌ์„œ google search console ๋“ฑ๋กํ•˜๊ธฐ

์ €๋ฒˆ์—๋Š” ๋„๋ฉ”์ธ ์‚ฌ์„œ vercel ์— ๋“ฑ๋กํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ดค๋‹ค. ์ด๋ฒˆ์—๋Š” SEO ์ž‘์—…์„ ํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.  Google Search Console ์— ๋“ฑ๋กํ•˜๊ธฐhttps://search.google.com/search-console Google Search ConsoleSearch Console ๋„๊ตฌ์™€ ๋ณด๊ณ ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์ดํŠธ์˜ ๊ฒ€์ƒ‰ ํŠธ๋ž˜ํ”ฝ ๋ฐ ์‹ค์ ์„ ์ธก์ •ํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ, Google ๊ฒ€์ƒ‰๊ฒฐ๊ณผ์—์„œ ์‚ฌ์ดํŠธ๊ฐ€ ๋‹๋ณด์ด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.search.google.com์œผ๋กœ ์ ‘์†ํ•œ๋‹ค.  property๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ฐฝ์— ๊ตฌ๋งคํ•œ ๋„๋ฉ”์ธ ์ž…๋ ฅํ•œ๋‹ค. ํ•˜๋‹จ์— ๋‚˜์˜ค๋Š” txt record ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ , ๊ฐ€๋น„์•„๋กœ ์ ‘์†ํ•œ๋‹ค.  https://www.gabia.com/ ์›น์„ ๋„˜์–ด ํด๋ผ์šฐ๋“œ๋กœ. ๊ฐ€๋น„์•„๊ทธ๋ฃน์›จ์–ด๋ถ€ํ„ฐ ๋ฉ€ํ‹ฐํด๋ผ์šฐ๋“œ๊นŒ..

๊ฐ€๋น„์•„์—์„œ ๋„๋ฉ”์ธ ์‚ฌ์„œ vercel์— ์ ์šฉํ•˜๊ธฐ

https://www.gabia.com/ ์›น์„ ๋„˜์–ด ํด๋ผ์šฐ๋“œ๋กœ. ๊ฐ€๋น„์•„๊ทธ๋ฃน์›จ์–ด๋ถ€ํ„ฐ ๋ฉ€ํ‹ฐํด๋ผ์šฐ๋“œ๊นŒ์ง€ ํ•˜๋‚˜์˜ ํด๋ผ์šฐ๋“œ ํ—ˆ๋ธŒwww.gabia.com ๊ตญ๋‚ด์—์„œ๋„ ๋„๋ฉ”์ธ์„ ์‚ด ์ˆ˜ ์žˆ๋Š” ๊ณณ๋“ค์ด ์žˆ๋Š”๋ฐ ์‹œํ—˜์‚ผ์•„ ํ•œ๋ฒˆ ์‚ฌ๋ดค๋‹ค. ์›๋ž˜๋Š” cloudfare์—์„œ ๋„๋ฉ”์ธ์„ ์ƒ€์—ˆ๋Š”๋ฐ vercel์— ํ•˜๋ฉด ์…‹ํŒ…์ด ์กฐ๊ธˆ ๋ฒˆ๊ฑฐ๋กœ์›Œ์„œ ์ •์ฐฉํ•  ๊ณณ์„ ์ฐพ๋Š”์ค‘์ด๋‹ค ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค๋„๋ฉ”์ธ์„ ์‚ฌ๊ณ ๋‚œ ๋’ค, dns๋ฅผ ๋“ฑ๋กํ•ด์ฃผ๋ฉด ๋œ๋‹ค.  vercel ์—์„œ ๋‚ด ํ”„๋กœ์ ํŠธ์—์„œ ๋„๋ฉ”์ธ์œผ๋กœ ์ด๋™ํ•œ๋‹ค. ๋‚ด๊ฐ€ ๊ตฌ๋งคํ•œ ๋„๋ฉ”์ธ์„ ๋“ฑ๋กํ•ด์ค€๋‹ค 2. ๊ฐ€๋น„์•„์—์„œ DNS๊ด€๋ฆฌ์—์„œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค ์ด๋Ÿฌ๊ณ  ๋ฐ”๋กœ๋˜์ง€๋Š” ์•Š๊ณ  ์กฐ๊ธˆ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋œ๋‹ค ์ฒด๊ฐ์ƒ 15๋ถ„ ์ •๋„?๊ตญ๋‚ด์—์„œ ๋„๋ฉ”์ธ ์‚ฌ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์‹œ๊ฐ„๋„ ์˜ค๋ž˜๊ฑธ๋ฆฌ๊ณ  ๋ถˆ์•ˆ์ •ํ•˜๋‹ค๋Š” ๋ง์ด ์žˆ๋Š”๋ฐ ์ผ๋‹จ ์—ฐ๊ฒฐ์€ ๊ดœ์ฐฎ๊ฒŒ ๋œ๋“ฏํ•˜๋‹ค๊ทธ์น˜๋งŒ ๋ถˆ์•ˆํ•œ..

JSX expressions must have one parent element. NextJS ์˜ค๋ฅ˜ ํ•ด๊ฒฐ

NextJS ์—์„œ ํ”„๋ก ํŠธ ๊ฐœ๋ฐœํ•˜๋‹ค๊ฐ€ JSX expressions must have one parent element. ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์˜ฌ๋•Œ๊ฐ€ ์žˆ๋‹ค.  ์ด๋•Œ ํ•ด๋‹น ๋ถ€๋ถ„์„ , ์™€ ๊ฐ™์ด ๊ฐ์‹ธ์ฃผ๋ฉด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ๋กœ ๊ฐ์‹ธใ…œ๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.  ๋งจ๋‚  ๊นŒ๋จน์–ด์„œ ๊ธฐ๋ก!