https://github.com/shadcn-ui/ui/issues/607
์ ์ฒด ๊ธ
๐ฉ๐ป๐ป4์ ํ ๋ฌ ๋์ ๋ฒ ํ ํ๋ก์ ํธ๋ฅผ ์ธํ
ํ๊ณ ๋ฐฐํฌ๊น์ง ๋ง๋ฌด๋ฆฌํ๋ค. โ๏ธ ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์น ๊ธฐ๋ฐ ์๋น์ค์น UI ๋ด์์ ์นด๋ฉ๋ผ๋ฅผ ํตํด ์ฌ์ง ์ดฌ์์นด์นด์ค ๋งต์ด๋ ๊ตฌ๊ธ๋งต์ด ์๋ ์์ฒด ์ ์ํ ์ง๋ ์ด๋ฏธ์ง ์์ ํ์ผ๋ก ์์น๋ฅผ ํ์ํน์ ์์น์ ๋ํ ๋ฆฌ๋ทฐ ์์ฑ ๋ฐ ์ข์์ ๊ธฐ๋ฅ์ฌ์ฉ์ ํ๋ ๋ถ์์ ์ํ Mixpanel ์ฐ๋๐ค ์น์์ ์นด๋ฉ๋ผ ์ดฌ์์ด ๋๋ค๊ณ ?์ฒ์์๋ ์น UI์์์ ์นด๋ฉ๋ผ ์ดฌ์์ ํ ์ ์๋ ๊ฑด๊ฐ ํ๋ค..? ์ฐพ์๋ณด๋ ๊ฐ๋ฅํ๊ณ ๋๋ react-webcam์ ํ์ฉํด์ ๊ตฌํํ๋ค.์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ํ๊ทธ๋ฅผ ์ฌ์ฉํด ์นด๋ฉ๋ผ ํ๋ฉด์ ์ค์๊ฐ์ผ๋ก ๋ณด์ฌ์ค๋ค.๊ตฌ์ฒด์ ์ผ๋ก๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ํ์ค Web API์ธ navigator.mediaDevices.getUserMedia()๋ฅผ ํธ์ถํด์ ์ฌ์ฉ์์ ์นด๋ฉ๋ผ ์คํธ๋ฆผ(strea..
Next.js14๋ฅผ ๊ธฐ์ค์ผ๋ก App router์ Pages router๋ฅผ ๊ฐ๊ฐ CSR/SSR/SSG/ISR์ ๊ตฌํํด ๋ดค๋ค.์ ๊ตณ์ด ๋ ๋ค ํ ๊ฑฐ์ฃ ...?๋ผ๊ณ ํ๋ค๋ฉด ์ฒ์์๋ App router๋ก ๊ตฌํํ์ฌ ๋์๊ณผ์ ์ ํ์ธํ๋ ค๊ณ ํ๋ค. ํ์ง๋ง ๋ด ์์๊ณผ ๋ค๋ฅด๊ฒ ๋์ํด ๋ ๋ค ๊ตฌํํ๋ค.์ค์ ๋ก ๋ ๋ค ๊ตฌํํด ๋ณด๋... ์ฐจ์ด์ ์ด ์์๋ค!๊ตฌํ์ ์ฌ์ฉํ ์์๋ API์์ ์๊ฐ์ ๋ฐ์์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง์ด๋ค. CSR (Client Side Rendering)์ฌ์ฉ์๊ฐ ํ์ด์ง์ ์ง์
ํ ๋, ์๋ฒ๋ก๋ถํฐ ๋น HTML์ ๋ฐ์์ค๊ณ ์ดํ ๋ธ๋ผ์ฐ์ ์์ JS๋ฅผ ํตํด ํ์ํ ๋ฐ์ดํฐ๋ฅผ API๋ก ๋ฐ์์ ํ๋ฉด์ ๊ทธ๋ฆฐ๋ค. ์ฆ, ์ด๊ธฐ ๋ก๋ฉ ์์๋ ๋น ํ๋ฉด์ด ๋ํ๋๊ณ JS๊ฐ ์คํ๋๊ณ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋ ํ์ ์ฝํ
์ธ ๊ฐ ๋ํ๋๋ค.์์ ์ฝ๋impo..
vercel์ ์๋ฒ๋ฆฌ์ค ๋ฐฉ์์ผ๋ก cold start๊ฐ ์์ด EC2์ ๋นํด 5๋ฐฐ ์ ๋ ๋๋ฆฌ๋ค. ์ด ๋ง์ ํ์ธํด ๋ณด๊ธฐ ์ํด ๊ฐ์ Next.js ํ๋ก์ ํธ๋ฅผ EC2์ Vercel์ ๊ฐ๊ฐ ๋ฐฐํฌํด ๋ดค๋ค.์ด๋ฒ ๊ธ์์๋ ๊ฐ๊ฐ์ ์ฐจ์ด์ ๋ํด์ ์์๋ณด๊ฒ ๋ค. ๊ฐ์ ํ๋ก์ ํธ๋ฅผ Vercel๊ณผ EC2์ ๋ฐฐํฌํด์ ๋น๊ต ์ผ์ชฝ์ Vercel์ ์ค๋ฅธ์ชฝ์ EC2์ ๋ฐฐํฌํ๋ค.๋ฐฐํฌํ๊ณ ๋๋ฉด ๋์ผ๋ก ๋ด๋ ํฐ ์ฐจ์ด๊ฐ ๋๊ปด์ง ์ค ์์๋๋ฐ ์๋์๋ค. ๋น์ทํ๋ค!DOMContentLoaded๋ Load ์๊ฐ์ ๋น๊ตํด ๋ณด๋ฉด ๋๋? ํ๋๋ฐ ์ด๊ฑด cold start๋ ๊ด๋ จ์ด ์๋ค.DOMContentLoaded๋ HTML ๋ฌธ์๊ฐ ๋ก๋๋ ์๊ฐ, Load๋ ํ์ด์ง์ ๊ด๋ จ๋ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ๋ก๋๋์์ ๋ ์๊ฐ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ด๋ค. networkํญ์ timing์ ์..
๋ด๊ฐ ๋ง๋ foliohub ์๋น์ค ํ๋ก ํธ๋ ํ์ฌ vercel์ ๋ฐฐํฌ๋์ด ์๋ค.์ vercel์ ๋ฐฐํฌํ๋๊ฐ?ํ๋ฉด๋ฐฐํฌ๊ฐ ๊ฐ๋จํ๊ณ ๋ฌด๋ฃ ํ๋์ ๋๋ฉด ์ถฉ๋ถํ ๋ด ์๋น์ค๋ฅผ ์ด์ํ ์ ์์๊ธฐ ๋๋ฌธ์ด๋ค.Next.js์ SSR, ์ด๋ฏธ์ง ์ต์ ํ ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ง์ํ๊ณ ์์๊ธฐ ๋๋ฌธ์ vercel์ ๋ฐฐํฌํ๋ค. ์๋์ ๊ฐ์ ๋ง์ ๋ฃ๊ฒ ๋์ด ์๋ฌธ์ด ๋ค์๋ค...vercel์ ์๋ฒ๋ฆฌ์ค ๋ฐฉ์์ผ๋ก cold start๊ฐ ์์ด EC2์ ๋นํด 5๋ฐฐ ์ ๋ ๋๋ฆฌ๋ค. ๋ฐฐํฌ ๋ฐฉ์๋ง ๋ค๋ฅธ ๊ฒ ์๋๋ผ ์คํ ๋ฐฉ์๋ ๋ฌ๋๋ ๊ฑฐ์ผ?!cold start ๋๋ฌธ์ EC2์ ๋นํด ๋๋ฆฌ๋ค๊ณ ?! ์ด ์๋ฌธ์ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฐ์ ํ๋ก์ ํธ๋ฅผ vercel๊ณผ EC2์ ๊ฐ๊ฐ ๋ฐฐํฌํด์ ๋น๊ตํด ๋ณด๊ธฐ๋ก ํ๋ค.์ด๋ฒ ๊ธ์์๋ Next.js ํ๋ก์ ํธ๋ฅผ EC2์ ๋ฐฐํฌํ๋ ๊ณผ์ ์ ๋ด์..
Toast ์๋ฆผ์ ๊ตฌํํ๋ฉด์ ์ด๋์๋ ๊ฐํธํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๊ธฐ ์ํด ์ ์ญ ์ํ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค.์์ฆ Zustand๊ฐ ํซํ ๊ฑฐ ๊ฐ์์ ์ฌ์ฉํด ๋ดค๋ค! (+ ๊ณฐ์ด ๊ท์ฝ๊ธฐ๋ ํ๊ณ ใ
ใ
)์ถ๊ฐ๋ก ๋๋ Next.js 14 App router๋ฅผ ์ฌ์ฉ ์ค์ด๋ค. Zustand๋ค๋ฅธ ์ํ๊ด๋ฆฌ ํด๊ณผ ๋น๊ตํ์ ๋ ์ฅ์ ์Context API์ ๋ฌ๋ฆฌ ์ํ ๋ณ๊ฒฝ ์ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋์ง ์๋๋ค.๋์์ ์ดํดํ๊ธฐ ์ํด ์์์ผ ํ๋ ์ฝ๋ ์์ด ์ ๋ค. ํ ๊ฐ์ ์ค์์ ์ง์ค๋ ํ์์ ์คํ ์ด ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ฉด์ ์ํ๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ๋จ์ํ๋ค.์ค์น# npmnpm install zustand# yarnyarn add zustand ์ ์ญ์ํ๊ด๋ฆฌ๋ฅผ ํตํด Toast ์๋ฆผ ๋ง๋ค๊ธฐstore ์์ฑtoast ์๋ฆผ์ ์ฌ๋ฌ ๊ฐ๊ฐ ๋ํ๋ ์ ์..
์๋ฒ ์ธก์์ data๋ฅผ fetch ํ๋๋ก ํ ์ดํ vercel์ ๋ฐฐํฌํ๋ ์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋ ๋ง์ด ํ๋ค ใ
ใ
(์ ๋ง ์์ง๋ ์๋ฌธ์ธ๊ฑด ์ ๊ฐ๋ฐ๋จ์์ ๋ฐ๊ฒฌ์ ์๋๊ณ ๋ฐฐํฌ ์์๋ง console ์ฐฝ์ ๋ํ๋๋ ๊ฑธ๊น...? ) ์๋ฌ ์ํฉ ์๋ฌ์ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์๋ค.Uncaught Error: Minified React error #418;์๋ฒ์์ ๋ ๋๋ง ๋ HTML์ด ํด๋ผ์ด์ธํธ์ ์ผ์นํ์ง ์์ Hydration์ ์คํจํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ํด๋ผ์ด์ธํธ์์ ๋ค์ ์์ฑ๋ฉ๋๋ค. ์ด๋ ์๋ฒ ๋ ๋๋ง๋ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๊ฐ ๋ค์์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.์๋ฒ/ํด๋ผ์ด์ธํธ ๋ถ๊ธฐ if (typeof window !== 'undefined')Date.now()๋ Math.random()์ ํธ์ถํ ๋๋ง๋ค ๋ณ๊ฒฝ๋๋ ๋ณ์ ์
๋ ฅ์..
Next.js ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ SSR์ ์ ํ์ฉํ์ง ๋ชปํ ๊ฑฐ ๊ฐ์์ ๋ง์ ํ๊ตฌ์์ด ์ฐ์ฐํ๋ค...๐๊ทธ๋์ ์ด๋ฒ ๊ธฐํ์ SSR์ ํ์ฉํ์ฌ ๋ฆฌํฉํ ๋ง ํด๋ดค๋ค. Next.js์์ ์ ๊ณตํ๋ data fetch๊ณผ ์บ์ฑ ๋ฑ์ ์ด์ฉํ ์ ์์ง๋ง ๋ฌดํ์คํฌ๋กค, ๋ก๋ฉ ์ฒ๋ฆฌ ๋ฑ ๋ ๋ค์ํ ๊ธฐ๋ฅ์ด ์์ด react query๊ฐ ๋ ์ ์ฉํ ๊ฑฐ ๊ฐ์ react query๋ฅผ ์ ํํ๋ค.(+ Next.js 14 App router์ react query v5๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค!) ํด๋ผ์ด์ธํธ ๋ ๋๋ง๊ณผ ์๋ฒ ๋ ๋๋ง์๋ฒ ๋ ๋๋ง์ ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ๋ก๋ํ๋ ์ฆ์ ๋ณผ ์ ์๋ ๋ด์ฉ์ ์ ๊ณตํ๊ธฐ ์ํด ์ด๊ธฐ HTML์ ์๋ฒ์์ ์์ฑํ๋ ๊ฒ์ ๋งํ๋ค. ์ด๋ ํ์ด์ง ์์ฒญ ์๋ง๋ค ๋ฐ์(SSR)ํ ์ ์๊ณ ๋น๋ ์ ๋ฏธ๋ฆฌ ๋ฐ์(SSG)ํ ์ ๋ ์๋ค. ์ผ๋ฐ..
๐จ ๊ฒฝ๊ณ ๋ฐ์ Image with src "~~" has "fill" but is missing "sizes" prop. Please add it to improve page performance. Read more: https://nextjs.org/docs/api-reference/next/image#sizes ๐ค ์์ธ ํด๋น ๋งํฌ๋ก ๋ค์ด๊ฐ ๋ณด๋ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์๋ค. sizes์ ๊ฐ์ fill์ ์ฌ์ฉํ๋ ์ด๋ฏธ์ง๋ ๋ฐ์ํ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์ด๋ฏธ์ง์ ๋ํ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ๋ฏธ์น๋ค. "fill" ์์ฑ์ด ์๋ ์ด๋ฏธ์ง์ "sizes"๊ฐ์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ผ๋ก 100vw๊ฐ ์ฌ์ฉ๋๋ค. ์ด๊ฒ ๋ฌด์จ ๋ป์ธ์ง ์ข ๋ ์ฐพ์๋ดค๋๋ฐ fill ์์ฑ์ ์ฌ์ฉํ ์ด๋ฏธ์ง์ ๊ฒฝ์ฐ ์ด๋ฏธ์ง๊ฐ ์ ์ฒด ๋ทฐํฌํธ๋ฅผ ์ฑ์ฐ๋๋ก ํ์ฅ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ..
์ค๋์ Next.js์์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๊ฒ ๋ค. ์ด ๊ธ์ Next.js 14๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑ๋์๋ค. ์ด๋ฏธ์ง ์ต์ ํ ์ ๋ต ์ด๋ฏธ์ง๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ์ ๋ต์๋ ์๋์ ๊ฐ์ด ๋ค์ํ ๋ฐฉ๋ฒ์ด ์๋ค. png, jpeg ํ์๋ณด๋ค๋ webp, avif ํ์์ ์ด๋ฏธ์ง ํ์ผ ์ฌ์ฉํ๊ธฐ ์ด๋ฏธ์ง Lazy Loading ์ฒ๋ฆฌํ๊ธฐ ๋๋ฐ์ด์ค ํฌ๊ธฐ์ ์๋ง์ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ก ๋ฆฌ์ฌ์ด์ง ์ด๋ฏธ์ง ์บ์ฑํ๊ธฐ ์ด๋ฌํ ์์
์ Next.js์์ ํด์ฃผ๊ณ ์๋๋ฐ ์ด๋ป๊ฒ ์ ์ฉํ ์ ์๋์ง ์์๋ณด๊ฒ ๋ค! 1. webp๋ก ๋ณํ next/image๋ png, jpeg ๋ฑ ํ์์ webp๋ก ๋ณํํด ์ด๋ฏธ์ง ์ฉ๋์ ์ค์ฌ์ค๋ค. webp๋ณด๋ค 2019๋
์ ๋ง๋ค์ด์ง avif๊ฐ ์ฌ๋ฌ ํ์(jpeg, webp) ๋ณด๋ค ํจ์ฌ ๋ ์ข์ ๋ฌด์์ค ์์ถ๊ณผ ๊ณ ํ์ง์ ์๋ํ..