Next.js๋ฅผ ์ฒ์ ์ ํ์ ๋ Routing์ ์ ์ผ ๋จผ์ ๋ฐฐ์ฐ๊ณ ๋ค์์ผ๋ก ๋ฐฐ์ ๋ ๊ฒ Image ์ปดํฌ๋ํธ์๋ค. Image ์ปดํฌ๋ํธ๋ img ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ ๋๋ณด๋ค ์ด๋ฏธ์ง ์ต์ ํ๋ผ๋ ์ฅ์ ์ด ๋๋ ทํ๋ค๊ณ ํ๋ค. ํ์ง๋ง ์ฌ์ฉํด๋ณด๋ ๋ถํธํ ๊ฒ ์ ๋ง ๋ง์๋ ๊ฒ ๊ฐ๋ค. ํ์ง ์ ํ ์ด์๋ ์์๊ณ , ๊ฐ๋์ฉ Image ์ปดํฌ๋ํธ์ ์ต์ ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ธ๋ค์ ๋ณด๋ฉด์ Image ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ์ฅ์ ์ด ๋ญ๊ณ , ์ด๋ป๊ฒ ์ฌ์ฉํด์ผ ์ ์ฌ์ฉํ๋์ง๋ฅผ ์ ๋๋ก ์๊ณ ์ฌ์ฉํด์ผ๊ฒ ๋ค๊ณ ์๊ฐ๋๋ค.
๊ทธ๋์ ์ข ๋ ๋ฆ์ด์ง๋ฉด ์์ ํ๊ธฐ ๊ท์ฐฎ๋ค๊ณ ๋ฏธ๋ฃฐ ๊ฒ ๊ฐ์์ ํ๋ก์ ํธ ์ด๋ฐ์ Image ์ปดํฌ๋ํธ์ ๋ํด ํ์คํ ์ ๋ฆฌํ๊ณ ๊ฐ๊ธฐ๋ก ํ๋ค.
Next.js์์ ์ด๋ฏธ์ง ์ต์ ํ๋ฅผ ์ํด ์ ๊ณต๋๋ ์ปดํฌ๋ํธ๋ก Next.js ์๋ฒ๋ฅผ ๊ฑฐ์ณ ์ต์ ํ๋ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์จ๋ค.
์๋์ ๊ฐ์ ์ฅ์ ์ ๊ฐ์ง๋ค.
์ต์ ํ
์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ค์ฌ์ฃผ์ด ์ฌ์ฉ์์ ์ด๋ฏธ์ง ๋ก๋ฉ ์๊ฐ์ ๋จ์ถ์์ผ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์์ํจ๋ค.
์ฌ์ฉ์ ๋๋ฐ์ด์ค ํฌ๊ธฐ ํน์ ํ๋ฉด ํด์๋์ ๋ง์ถฐ ์ ์ ํ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์๋ค. ๋๋ฐ์ด์ค๊ฐ ์์ ์๋ก ์ฑ๋ฅ ๊ฐ์ ์ด ํด ์ ์๋ค.
webp ๊ฐ์ ์ต์ ์ด๋ฏธ์ง ํฌ๋งท์ ์ง์ํ์ฌ ์ด๋ฏธ์ง ์ฉ๋์ ์ต์ ํํ๊ณ ์ด๋ฏธ์ง ๋ก๋ฉ ์๊ฐ์ ์ค์ธ๋ค.
์ง์ฐ ๋ก๋ฉ
์ด๋ฏธ์ง๊ฐ ๋ทฐํฌํธ์ ๊ทผ์ ํ ๋๊น์ง ๋ก๋ฉ์ ์ง์ฐ์ํจ๋ค. ์ด๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์ ํ์ํ์ง ์์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ์ง ์์์ผ๋ก์จ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
์๋ ์บ์ฑ
์๋ฒ์์ ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ๊ณ ์บ์ฑํ๋ค. ์บ์ฑ์ ํ๋ฉด ์์ฒญ ์ ๋น ๋ฅด๊ฒ ์ ๊ณตํ ์ ์์ด ๋ฐ๋ณต๋ ์์ฒญ์ ๋ํ ์๋ฒ์ ๋ถ๋ด์ ์ค์ธ๋ค.
placeholder ์ ๊ณต
Next/Image๋ ๋ ์ด์์์ด ํ๋ค๋ฆฌ๋ ํ์(CLS(Cumulative Layout Shift))์ ๋ฐฉ์งํ๋ค. ์ด๋ฏธ์ง๊ฐ ๋ก๋๋๊ธฐ ์ ์๋ ์ด๋ฏธ์ง ๋์ด๋งํผ ์์ญ์ ํ์ํด์ ์ด๋ฏธ์ง๊ฐ ๋ก๋๋ ํ์ ๋ ์ด์์์ด ํ๋ค๋ฆฌ์ง ์๋๋ก ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด Image ์ปดํฌ๋ํธ๋ฅผ import ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
import Image from 'next/image'
export default function Page() {
return (
<Image
src="/profile.png"
width={500}
height={500}
alt="Picture of the author"
/>
)
}
์ผ๋ฐ์ ์ธ img ํ๊ทธ์ ๋น์ทํ ํ์ ์์ฑ์ ๊ฐ์ง๋ค.
src : ์ด๋ฏธ์ง ๊ฒฝ๋ก
alt : ๋์ฒด ํ ์คํธ
width : ์ด๋ฏธ์ง ๊ฐ๋ก ํฌ๊ธฐ
height : ์ด๋ฏธ์ง ์ธ๋ก ํฌ๊ธฐ
์๋ ๋ด์ฉ๋ค์ ์ ํ ์์ฑ์ด๋ค.
1. fill : (boolean) ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ชจ ์ปจํ
์ด๋์ ํฌ๊ธฐ์ ๋ง์ถฐ์ ์๋์ผ๋ก ์ฑ์ฐ๋๋ก ์ค์ ํ๋ค.
fill ์์ฑ์ ์ฌ์ฉํ ๊ฒฝ์ฐ์๋ width/height ๊ฐ์ ์ง์ ํ์ง ์์๋ ๋๋ค. ์ด๋ฏธ์ง size๋ฅผ ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
fill์ ์๋์ผ๋ก position: absolute ์์ฑ์ด ๋ถ์ฌ๋๋ฏ๋ก, ๋ถ๋ชจ ์์์๋ position: relative ๋ฑ๊ณผ ๊ฐ์ ์์ฑ์ด ๋ถ์ฌ๋์ด ์์ด์ผ ํ๋ค.
object-fit: "contain"์ style์ ์ถ๊ฐํด์ฃผ๋ฉด, ์ด๋ฏธ์ง๊ฐ ์ปจํ
์ด๋์ ๋ง๊ฒ ๋์ด๋๋ค.
object-fit: "cover"์ style์ ์ถ๊ฐํด์ฃผ๋ฉด, ์ด๋ฏธ์ง๋ฅผ ์ ์ฒด ์ปจํ
์ด๋์ ์ฑ์ฐ๊ณ ์ข
ํก๋น๋ฅผ ์ ์งํ๊ธฐ ์ํด ์๋ผ๋ธ๋ค.

sizes : (String) ๋ฏธ๋์ด ์ฟผ๋ฆฌ์ ๊ฐ์ด ์ฌ์ฉํ์ฌ ๋ทฐํฌํธ์ ๋ฐ๋ผ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์ง์ ํ๋ค.import Image from 'next/image'
export default function Page() {
return (
<div className="grid-element">
<Image
fill
src="/example.png"
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
/>
</div>
)
}
quantity : (number) ์ด๋ฏธ์ง์ ํ์ง์ ์ง์ ํ๋ค. 1๋ถํฐ 100๊น์ง์ ์ ์ ๊ฐ์ ์ด์ฉํ๋ค. ๊ธฐ๋ณธ ๊ฐ์ 75์ด๋ค.
priority : (boolean) loading="lazy" ์์ฑ์ ์ฌ์ฉํ์ง ์๊ณ fetchPriority="high" ์์ฑ์ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ฐ์ ์ ์ผ๋ก ๋ก๋ฉํ๋ค.
placeholder : (String) ์ด๋ฏธ์ง์ ํ๋ ์ด์คํ๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ฉํ๋ค.
blur: ๋ธ๋ฌ ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ฉ ์ ์ ํ์ (์ฌ์ฉ ์ blurDataURL ํ์).
empty: ๋ณ๋์ ์๋ฆฌ ํ์์ ์์ด ๋ฐ๋ก ๋ก๋. ๊ณต๊ฐ์ ์ฐจ์งํ๋ค. (๊ธฐ๋ณธ๊ฐ)
data:image/... : ์ด๋ฏธ์ง๋ฅผ ํฌํจํ ๋ฐ์ดํฐ๋ฅผ Base64๋ก ์ธ์ฝ๋ฉ
onLoadingComplete : ์ด๋ฏธ์ง๊ฐ ์์ ํ ๋ก๋๋๊ณ ํ๋ ์ด์ค ํ๋๊ฐ ์ ๊ฑฐ๋๋ฉด ํธ์ถ๋๋ ์ฝ๋ฐฑ ํจ์.
onError : ์ด๋ฏธ์ง๊ฐ ๋ก๋๋์ง ์์ ๊ฒฝ์ฐ ํธ์ถ๋๋ ์ฝ๋ฐฑ ํจ์.
loading : (String) ์ด๋ฏธ์ง ๋ก๋ฉ ๋ฐฉ๋ฒ์ ์ง์ ํ๋ค. (๊ธฐ๋ณธ ๊ฐ = lazy)
eager ๊ฐ์ ์ค ๊ฒฝ์ฐ ์ฆ์ ๋ก๋ํ๋ค. ํ์ง๋ง, ์ด ์์ฑ์ ์ฑ๋ฅ์ ํ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก, priority ์์ฑ์ ์ฌ์ฉํ๋ ๊ฑธ ๊ถ๊ณ ํ๋ค.
unoptimized : (boolean) true์ด๋ฉด ์๋ณธ ์ด๋ฏธ์ง๊ฐ ํ์ง, ํฌ๊ธฐ ๋๋ ํ์์ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ทธ๋๋ก ์ ๊ณต๋๋ค.
Next.js 14์์ ์๊ฒฉ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋ณด์๊ณผ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด next.config.js ํ์ผ์์ ์ธ๋ถ ๋๋ฉ์ธ์ ํ์ฉํ๋ ์ค์ ์ ํด์ผ ํ๋ค.
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'example.com',
port: '',
pathname: '/account123/**',
},
],
},
}
pathname์ ์์ผ๋์นด๋(* ๋๋ ** )๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๋๋ฉ์ธ์์ ์ ๊ณต๋๋ ๋ชจ๋ ์ด๋ฏธ์ง๋ฅผ ํ์ฉํ ์ ์๋ค.
<Image>
Goodbye next/image
Next/Image๋ฅผ ํ์ฉํ ์ด๋ฏธ์ง ์ต์ ํ