์ „์ฒด ๊ธ€

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
https://github.com/shadcn-ui/ui/issues/607
ยท Project
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..
ยท IT
vercel์€ ์„œ๋ฒ„๋ฆฌ์Šค ๋ฐฉ์‹์œผ๋กœ cold start๊ฐ€ ์žˆ์–ด EC2์— ๋น„ํ•ด 5๋ฐฐ ์ •๋„ ๋А๋ฆฌ๋‹ค. ์ด ๋ง์„ ํ™•์ธํ•ด ๋ณด๊ธฐ ์œ„ํ•ด ๊ฐ™์€ Next.js ํ”„๋กœ์ ํŠธ๋ฅผ EC2์™€ Vercel์— ๊ฐ๊ฐ ๋ฐฐํฌํ•ด ๋ดค๋‹ค.์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ๊ฐ๊ฐ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ๋‹ค. ๊ฐ™์€ ํ”„๋กœ์ ํŠธ๋ฅผ Vercel๊ณผ EC2์— ๋ฐฐํฌํ•ด์„œ ๋น„๊ต ์™ผ์ชฝ์€ Vercel์— ์˜ค๋ฅธ์ชฝ์€ EC2์— ๋ฐฐํฌํ–ˆ๋‹ค.๋ฐฐํฌํ•˜๊ณ  ๋‚˜๋ฉด ๋ˆˆ์œผ๋กœ ๋ด๋„ ํฐ ์ฐจ์ด๊ฐ€ ๋А๊ปด์งˆ ์ค„ ์•Œ์•˜๋Š”๋ฐ ์•„๋‹ˆ์—ˆ๋‹ค. ๋น„์Šทํ–ˆ๋‹ค!DOMContentLoaded๋ž‘ Load ์‹œ๊ฐ„์„ ๋น„๊ตํ•ด ๋ณด๋ฉด ๋˜๋‚˜? ํ–ˆ๋Š”๋ฐ ์ด๊ฑด cold start๋ž‘ ๊ด€๋ จ์ด ์—†๋‹ค.DOMContentLoaded๋Š” HTML ๋ฌธ์„œ๊ฐ€ ๋กœ๋“œ๋œ ์‹œ๊ฐ„, Load๋Š” ํŽ˜์ด์ง€์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. networkํƒญ์˜ timing์— ์žˆ..
ยท IT
๋‚ด๊ฐ€ ๋งŒ๋“  foliohub ์„œ๋น„์Šค ํ”„๋ก ํŠธ๋Š” ํ˜„์žฌ vercel์— ๋ฐฐํฌ๋˜์–ด ์žˆ๋‹ค.์™œ vercel์— ๋ฐฐํฌํ–ˆ๋Š”๊ฐ€?ํ•˜๋ฉด๋ฐฐํฌ๊ฐ€ ๊ฐ„๋‹จํ•˜๊ณ  ๋ฌด๋ฃŒ ํ”Œ๋žœ์ •๋„๋ฉด ์ถฉ๋ถ„ํžˆ ๋‚ด ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•  ์ˆ˜ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.Next.js์˜ SSR, ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— vercel์— ๋ฐฐํฌํ–ˆ๋‹ค.  ์•„๋ž˜์™€ ๊ฐ™์€ ๋ง์„ ๋“ฃ๊ฒŒ ๋˜์–ด ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค...vercel์€ ์„œ๋ฒ„๋ฆฌ์Šค ๋ฐฉ์‹์œผ๋กœ cold start๊ฐ€ ์žˆ์–ด EC2์— ๋น„ํ•ด 5๋ฐฐ ์ •๋„ ๋А๋ฆฌ๋‹ค. ๋ฐฐํฌ ๋ฐฉ์‹๋งŒ ๋‹ค๋ฅธ ๊ฒŒ ์•„๋‹ˆ๋ผ ์‹คํ–‰ ๋ฐฉ์‹๋„ ๋‹ฌ๋ž๋˜ ๊ฑฐ์•ผ?!cold start ๋•Œ๋ฌธ์— EC2์— ๋น„ํ•ด ๋А๋ฆฌ๋‹ค๊ณ ?! ์ด ์˜๋ฌธ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ™์€ ํ”„๋กœ์ ํŠธ๋ฅผ vercel๊ณผ EC2์— ๊ฐ๊ฐ ๋ฐฐํฌํ•ด์„œ ๋น„๊ตํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Next.js ํ”„๋กœ์ ํŠธ๋ฅผ EC2์— ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ๋‹ด์•˜..
ยท IT/React
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) ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์ข‹์€ ๋ฌด์†์‹ค ์••์ถ•๊ณผ ๊ณ ํ’ˆ์งˆ์„ ์ž๋ž‘ํ•œ..
์†”B
sollog