From a88e6b5267c66188dd66f191e2c28f894f1b3a75 Mon Sep 17 00:00:00 2001 From: deun Date: Sat, 8 Feb 2025 21:46:50 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=96=8B=EF=B8=8F=20NextJS=EB=8A=94=20?= =?UTF-8?q?=EC=96=B4=EB=96=BB=EA=B2=8C=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=EB=A5=BC=20=EC=B5=9C=EC=A0=81=ED=99=94=ED=95=A0=EA=B9=8C=3F=20?= =?UTF-8?q?=ED=8F=AC=EC=8A=A4=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierrc.mjs | 6 + .../nextjs-image-optimization/img-test.png | Bin 0 -> 29032 bytes .../post/blog/nextjs-image-optimization.mdx | 330 ++++++++++++++++++ 3 files changed, 336 insertions(+) create mode 100644 public/images/nextjs-image-optimization/img-test.png create mode 100644 src/content/post/blog/nextjs-image-optimization.mdx diff --git a/.prettierrc.mjs b/.prettierrc.mjs index bf43c6c..36a1fbf 100644 --- a/.prettierrc.mjs +++ b/.prettierrc.mjs @@ -17,5 +17,11 @@ export default { parser: 'astro', }, }, + { + files: '*.mdx', + options: { + printWidth: 80, + }, + }, ], } diff --git a/public/images/nextjs-image-optimization/img-test.png b/public/images/nextjs-image-optimization/img-test.png new file mode 100644 index 0000000000000000000000000000000000000000..2224643b23c9951298592f339479827cc5d8c8b4 GIT binary patch literal 29032 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 literal 0 HcmV?d00001 diff --git a/src/content/post/blog/nextjs-image-optimization.mdx b/src/content/post/blog/nextjs-image-optimization.mdx new file mode 100644 index 0000000..3883261 --- /dev/null +++ b/src/content/post/blog/nextjs-image-optimization.mdx @@ -0,0 +1,330 @@ +--- +title: NextJS는 어떻게 이미지를 최적화할까? +date: 2025-02-08 +updatedDate: 2025-02-08 +tags: [nextjs, next Image, nextjs 이미지 최적화] +image: '' +--- + +:::note +이 글은 NextJS **14.2.23** 버전을 기준으로 작성되었습니다. +::: + +웹에서 이미지는 **페이지 로딩 속도**와 **사용자 경험**에 큰 영향을 미친다. 최적화되지 않은 이미지는 페이지 로딩을 느리게 하고 사용자 이탈률을 높이며, SEO에도 부정적인 영향을 미칠 수 있다. + +이를 해결하기 위해 NextJS는 `next/image` 컴포넌트를 제공해 자동으로 최적화를 수행한다. +공식 문서와 소스 코드를 기반으로 `next/image`의 이미지 최적화 원리를 알아보자. + +## 무엇을 최적화할까? + +[NextJS 공식 문서](https://nextjs.org/docs/app/building-your-application/optimizing/images)에 따르면 `next/image` 컴포넌트는 다음과 같이 이미지를 최적화한다. + +- **이미지 크기 최적화**: 브라우저에 따라 적절한 크기의 이미지를 제공 +- **최신 포맷으로 변환**: WebP, AVIF 등 브라우저가 지원하는 최적의 포맷으로 변환 +- **Lazy Loading** 기본 지원: 필요할 때만 이미지를 로드하여 성능 최적화 (뷰포트에 진입할 때 이미지 로드) +- **Placeholder Blur** 지원: 이미지가 로드되기 전에 블러 효과 제공 +- **CDN 최적화**: Vercel 배포 시 자동으로 CDN을 활용한 최적화 수행 + +## 어떤 포맷으로 변환할까? + +```ts title="next/src/server/image-optimizer.ts" +function getSupportedMimeType(options: string[], accept = ''): string { + const mimeType = mediaType(accept, options) + return accept.includes(mimeType) ? mimeType : '' +} + +const mimeType = getSupportedMimeType(formats || [], req.headers['accept']) +``` + +`next/image`의 이미지 최적화를 담당하는 `image-optimizer.ts` 코드를 살펴보면 브라우저의 **Accept** 헤더 값과 config의 **formats**로 변환할 포맷을 결정한다. + +브라우저의 **Accept** 헤더는 클라이언트가 처리할 수 있는 **MIME 타입**을 서버에 알리는 역할을 한다. 쉽게 설명하자면 Accept 헤더에 **브라우저가 지원하는 포맷 정보**가 담겨있다. + +`getSupportedMimeType` 함수를 실행해 **formats** 배열 값 중 클라이언트가 지원하는 최적의 포맷으로 `mimeType`을 결정하는데, 만약 formats 배열의 값을 **모두 지원하지 않는다면 원본 포맷을 유지**한다. + +```js title="next.config.mjs" +/** @type {import('next').NextConfig} */ +const nextConfig = { + images: { + formats: ['image/avif', 'image/webp'], // [!code highlight] + }, +} + +export default nextConfig +``` + +options는 `nextConfig`에서 설정할 수 있으며 **기본값**은 `['image/webp']`이다. + +## 최적화되지 않는 이미지 + +```ts title="next/src/server/image-optimizer.ts" +// ANIMATABLE_TYPES = [WEBP, PNG, GIF] +if (ANIMATABLE_TYPES.includes(upstreamType) && isAnimated(upstreamBuffer)) { + Log.warnOnce( + `The requested resource "${href}" is an animated image so it will not be optimized. Consider adding the "unoptimized" property to the .` + ) + return { + buffer: upstreamBuffer, + contentType: upstreamType, + maxAge, + } +} +``` + +GIF 등 **Animatable 이미지**는 최적화가 이루어지지 않는다. 이미지 최적화 과정을 건너뛰기 위해 `unoptimized={true}`를 권장한다. + +```ts title="next/src/server/image-optimizer.ts" +if ( + upstreamType.startsWith('image/svg') && + !nextConfig.images.dangerouslyAllowSVG +) { + Log.error( + `The requested resource "${href}" has type "${upstreamType}" but dangerouslyAllowSVG is disabled` + ) + throw new ImageError( + 400, + '"url" parameter is valid but image type is not allowed' + ) +} + +// VECTOR_TYPES = [SVG] +if (VECTOR_TYPES.includes(upstreamType)) { + return { + buffer: upstreamBuffer, + contentType: upstreamType, + maxAge, + } +} +``` + +**벡터 이미지**인 SVG도 마찬가지인데, `next/image`에서 SVG를 사용하려면 `unoptimized={true}`를 **반드시 적용**해야 한다. + +{/* prettier-ignore-start */} +```js title="next.config.mjs" +const nextConfig = { + images: { + formats: ['image/avif', 'image/webp'], + dangerouslyAllowSVG: true, // [!code highlight] + contentSecurityPolicy: "default-src 'self'; script-src 'none'; sandbox;", // [!code highlight] + }, +} +``` +{/* prettier-ignore-end */} + +프로젝트 전체에 적용하고 싶다면 위처럼 `dangerouslyAllowSVG` 설정이 필요하다. +SVG는 JavaScript를 포함할 수 있어 **XSS 공격 등 보안상의 위험** 때문에 'dangerous'라는 이름이 붙었으며, `contentSecurityPolicy` 설정을 통해 보안 정책을 설정할 수 있다. + +## 최적화는 언제 이루어질까? + +`next/image`의 최적화는 빌드 시점이 아닌, 브라우저에서 **이미지를 요청**할 때 이루어진다. +최적화 과정은 다음과 같다. + +1. HTML에 이미지 태그 렌더링 +1. 브라우저가 서버에 이미지 요청 (이때 Accept 헤더에 지원하는 이미지 포맷 정보 전송) + + - 예) `Accept: image/avif,image/webp,image/*,*/*;q=0.8` + +1. 서버가 이미지 최적화 수행 +1. 최적화된 이미지 응답 + +다음 예시를 통해 살펴보자. + +```tsx +import Image from 'next/image' +import testImage from '../public/test.png' + +export default function Page() { + return ( + <> + 테스트 이미지 + 테스트 이미지 + + ) +} +``` + +위 코드는 다음과 같이 렌더링 된다. + +```html highlight={2,16} + +테스트 이미지 + +테스트 이미지 +``` + +`img` 태그와 달리 `next/image` 컴포넌트는 이미지 URL을 `/_next/image?url=...` 형태로 변환한다. 이 URL로 **요청이 들어오면** Next.js의 이미지 최적화 미들웨어가 동작하여 다음과 같은 결과를 반환한다. + +![slow 4g 환경에서 테스트한 결과](/images/nextjs-image-optimization/img-test.png) + +네트워크 탭을 살펴보면 기본 `img` 태그의 요청은 원본 PNG 이미지(794 KB)를 그대로 전송하고 `next/image` 컴포넌트의 요청은 WebP 형식(45.7 KB)으로 **최적화되어 전송**되는 것을 확인할 수 있다. +`next/image`의 두 번째 요청부터는 **캐시에서 즉시 응답**한다. + +최적화 과정을 다시 한번 요약해 보자면 다음과 같다. + +1. 클라이언트가 `/_next/image?url=...` 경로로 요청을 보냄 +1. 서버가 Sharp(또는 Squoosh)를 사용해 리사이징 및 포맷 변환 수행 +1. 변환된 이미지를 `/.next/cache/images/`에 저장 (같은 요청이 오면 캐싱된 파일 반환) +1. 최적화된 이미지가 브라우저로 전달됨 + +이처럼 **요청 시점(런타임)에 최적화**하기 때문에 디바이스나 브라우저 등 **클라이언트의 상황에 맞춰 최적화**가 가능하다. +최적화된 이미지는 **캐시에 저장**되어 같은 요청이 왔을 때 최적화 과정 없이 바로 응답한다. + +### 캐시 정책 + +`next/image`의 이미지 캐시는 다음과 같은 정책으로 운영된다. + +- **캐시 저장**: 최적화된 이미지는 `/cache/images` 디렉토리에 저장됨 +- **캐시 유효 기간** + - `minimumCacheTTL` 설정값과 원본 이미지의 `Cache-Control` 헤더 중 **더 큰 값**을 사용 + - 기본적으로 **60초** 동안 캐시 되며, `next.config.js`에서 `minimumCacheTTL` 설정으로 조절 가능 + - 별도의 캐시 무효화 메커니즘이 없기 때문에 `minimumCacheTTL`을 너무 길게 설정하지 않는 것을 권장 + - 만약 강제로 갱신하려면 `src`를 변경하거나 캐시 파일을 직접 삭제해야 함 + +```js title="next.config.mjs" +const nextConfig = { + images: { + minimumCacheTTL: 60, // 캐시 유효 기간을 60초로 설정 // [!code highlight] + }, +} +``` + +캐시의 유효 기간이 만료된 이미지를 요청할 경우 **만료된(stale) 이미지를 즉시 제공**하고 백그라운드에서 새로운 이미지를 가져와 **캐시를 업데이트**한다. +캐시의 상태에 따라 `x-next-cache` 응답 헤더의 값이 `MISS`, `STALE`, `HIT`로 결정된다. + +- `MISS`: 캐시에 이미지가 없는 경우 (최초 요청 시) +- `STALE`: 캐시는 있지만 유효 기간이 만료된 경우 +- `HIT`: 유효한 캐시가 있는 경우 + +## 빌드 타임 최적화 + +런타임에 이미지 최적화가 진행되지만, 빌드 시점(또는 개발 환경의 컴파일 시점)에 미리 준비할 수도 있다. + +```jsx +import testImage from '../public/test.png' + +export default function Page() { + return ( + 테스트 이미지 + ) +} +``` + +이렇게 정적으로 이미지를 불러오면 NextJS는 다음과 같은 메타데이터 객체를 생성한다. + +```js +{ + src: '/_next/static/media/test.5a33257e.png', + height: 743, + width: 1048, + blurDataURL: '/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Ftest.5a33257e.png&w=8&q=70', + blurWidth: 8, + blurHeight: 6 +} +``` + +빌드 시점에 이미지 메타데이터와 blur 이미지가 생성되기 때문에 **런타임에 추가 계산이 필요 없고**, 미리 생성된 메타데이터를 바탕으로 최적화를 수행하므로 `width`와 `height` 속성을 별도로 전달할 필요가 없다. + +```jsx +테스트 이미지 +``` + +만약 위처럼 문자열로 직접 경로를 지정하면 Layout Shift를 방지하기 위해 `width`와 `height`를 **반드시 지정**해야 한다. +또한 미리 `blurDataURL` 데이터를 가지고 있는 정적 import 방식과 달리 `placeholder="blur"` 옵션을 사용하면 **첫 요청 시점**에 `blurDataURL`이 생성된다. + +## Sharp VS Squoosh + +`next/image` 컴포넌트는 Sharp 또는 Squoosh 라이브러리를 사용해 이미지를 최적화한다. + +```tsx title="next/src/server/image-optimizer.ts" +let showSharpMissingWarning = process.env.NODE_ENV === 'production' + +if (sharp) { + // sharp 패키지가 있으면 sharp로 최적화 + const transformer = sharp(buffer, { + sequentialRead: true, + }) + // ... +} else { + // production 모드이고 output: "standalone" 이면 Sharp 패키지 필수 + if (showSharpMissingWarning && nextConfigOutput === 'standalone') { + Log.error( + `Error: 'sharp' is required to be installed in standalone mode for the image optimization to function correctly. Read more at: https://nextjs.org/docs/messages/sharp-missing-in-production` + ) + throw new ImageError(500, 'Internal Server Error') + } + + // production 모드에서 Sharp 패키지 권장 + if (showSharpMissingWarning) { + Log.warnOnce( + `For production Image Optimization with Next.js, the optional 'sharp' package is strongly recommended. Run 'npm i sharp', and Next.js will use it automatically for Image Optimization.\n` + + 'Read more: https://nextjs.org/docs/messages/sharp-missing-in-production' + ) + showSharpMissingWarning = false + } + + // Squoosh 변환 로직 + const orientation = await getOrientation(buffer) + const { processBuffer } = + require('./lib/squoosh/main') as typeof import('./lib/squoosh/main') + // ... +} +``` + +Sharp가 설치되어 있지 않다면 Squoosh를 사용해 최적화를 진행한다. 단, 개발 모드에서는 Sharp 없이도 경고가 발생하지 않지만 production 모드에서는 **Sharp 설치를 권장**한다. +특히 output: "standalone" 설정이 되어 있다면 Sharp가 필수이며, 없을 경우 에러가 발생한다. + +:::warning{title="Next15부터 달라진 점"} +[NextJS 15부터는 **기본적으로 sharp를 사용**](https://github.com/vercel/next.js/blob/canary/packages/next/src/server/image-optimizer.ts)하기 때문에 sharp를 수동 설치할 필요 없다. +소스 코드를 살펴보면 이전과 달리 조건문 없이 Sharp를 사용해 최적화를 진행하는 것을 확인할 수 있다. +::: + +### Sharp를 권장하는 이유 + +[Sharp](https://github.com/lovell/sharp)는 C++ 라이브러리인 `libvips` 이미지를 최적화해 **속도가 빠르다**. 반면 Squoosh는 웹 브라우저에서 실행되는 이미지 최적화 도구로 시작했고 WebAssembly 기반으로 만들어져 상대적으로 느리다. + +`next/image`는 런타임에 최적화를 진행하는 만큼 속도가 빠른 `Sharp`를 권장한다. + +| | Sharp (권장) | Squoosh (대체 옵션) | +| ---------- | ------------------------------- | ---------------------- | +| **구현** | 네이티브 C++ 기반 | WebAssembly(WASM) 기반 | +| **성능** | 빠름 | 상대적으로 느림 | +| **리소스** | CPU 사용량과 메모리 효율이 좋음 | CPU 부하가 큼 | + +## 요약 + +- **런타임 최적화**: 요청 시점에 클라이언트의 상황(브라우저, 디바이스)에 맞춰 이미지를 최적화 +- **포맷 변환**: 브라우저의 Accept 헤더를 확인해 지원하는 최신 포맷(AVIF, WebP 등)으로 자동 변환 +- **성능 최적화**: Sharp를 사용한 빠른 이미지 처리와 효율적인 캐싱 전략으로 성능 향상 +- **특수케이스 처리**: SVG나 애니메이션 이미지(GIF 등)는 최적화 대상에서 제외되며, unoptimized 옵션 사용을 권장 +- **빌드 타임 최적화**: 정적 import를 통해 이미지 메타데이터를 미리 생성하고, 이를 바탕으로 최적화 수행 가능 + +## 맺으면서 + +지금까지 NextJS의 이미지 최적화 기능을 살펴봤다. `next/image`를 사용하면 다양한 최적화 전략을 자동으로 적용해 웹 성능을 향상시킬 수 있다. + +이번 포스팅을 작성하며 공식 문서와 소스 코드를 살펴보고 이미지 최적화 원리에 대해 깊이 있게 학습할 수 있었다. 단순히 컴포넌트를 사용하는 것을 넘어 **내부 동작 원리**를 이해할 수 있는 좋은 기회였다. + +`next/image` 컴포넌트 사용법은 [공식 문서](https://nextjs.org/docs/app/api-reference/components/image#configuration-options)에서 더 자세하게 살펴볼 수 있다. From ec9f9701fa50547395156ca6ff2533ddf29c61ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 8 Feb 2025 12:49:42 +0000 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=96=BC=EF=B8=8F=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=B5=9C=EC=A0=81=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nextjs-image-optimization/img-test.avif | Bin 0 -> 6442 bytes .../nextjs-image-optimization/img-test.png | Bin 29032 -> 0 bytes .../post/blog/nextjs-image-optimization.mdx | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/images/nextjs-image-optimization/img-test.avif delete mode 100644 public/images/nextjs-image-optimization/img-test.png diff --git a/public/images/nextjs-image-optimization/img-test.avif b/public/images/nextjs-image-optimization/img-test.avif new file mode 100644 index 0000000000000000000000000000000000000000..900e116e1c978a87f14587ada1b9158a2fbcc5d3 GIT binary patch literal 6442 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�qJxh$oJ213T2;G9O6dR$S7MIapeS|U1`DB1g z`$lguQttMJ*LdvNOFF1+x$LAC;6*j@+CRF#Puo=Z=#6)ST;IZO_Sz2zp%cir}enxHq%v#EApw zS7^E<5fw9ZP?;lsPU1vc@}X>*i)fg@?$KppMz=^mS>66CZ-1fROW7fFM7NJdnq`3I z4}xzZF8p{kgroN4wIeMFc1FTJ`g#ObYHtC`*-JoX{<7S|y-EQB;kt9M05mmOQ~e zg`26PBDwZN@sKOcONyn~2d=?jn*fV$aPDQe*z$ExT*}wGNy%J$wcpwZfP1fH;($16 zx-(PlqeD%d?nF{FQ4xj$X908()qjZZca=BU%G+`v4D)V=vQXFdkhx^n5+;&VN|zsj zw2B{sV8xz%Wu_@sv6fP^7)*QBmpE7FPV_eG75`arz2jJJdiyVcMi zz4c!P1;x2J1$u_)02;T2;Sxa^5798?PR1qAoDO2p7o1QbtZ;-UOt+*0AN=tR%-}#A zLsmDEBdABNt`Jkez5`>Ld)&S=k_UGWKxa;o&&EG?kg+S+63^ra~+m{Ww&+~ z=dufgBKd8w*`UF%Mxi_j$@v4<$IH)V@Xn?L3WBNwJ5VvrUNS3r)1 zQrDJ7Qe@S5tJ^}bzJf-fOy$eWhX$wU`byBg*{EGmzY3)iPxmNiA+J#Y>k^odHIjD1 zGK-xk{1rL5H4!S1uBh5y#u#}Wl+d|nOX{Qkpoj*dg?;Uwz!1Ne=pDEhYeBFJ3`K#* z*I4^#fx2rl<>bZN`@WdpfnEkhDz%>()27Lg1$^sgY#WcpL$$$@6nij{<{+SE^mO4F zKAat(zyWHgWvG|(rZwb?#WJ9%wW{#SvQn*tnqlysD=-xWM5Az-<3$RO>e3S|g|C1N zq&?_k_mZO{tr2aMe60O5y!>;1BVnNLr)%;RjJh5sfu~Ft(=>xDcf!ft$25jUam#ue z$t5BY&XqIJxpr+Vd3Pb5;s~T{yVatbUd=xOsoWL^nyk0R8duyjq^Ts|sJ;qPo!x%w zeFyHxE6gkQY2;;G$x{Rc7i!+{oF$MPn!~<>31w$W3=Q@M1hGP8-xyOfgJ+t_0iy~s znVqKn+dfhZjC_9tWiQU;NxZ&2J7!U&?fMAwF&xN$H-yT{={oAnxi=8UY;@V|&*W-k z;O|?W19NGXX=C{)(LZ>{SWU$Gn?xfO%`-<8lDVG#@e#&Gnj>>o`EsAk{*6;}^6C8Z ztDC48cFpLP5x%T9ON%^3s`Z!Ri)IpWq-&o#%eHJ7#c0p-u}m+&mFRslU1%O_)W3Wn zI|UK>ANdf{U-;1^R-;dE`f-$9b?p@|ri*2s1SLM6Ij!FM`+lZ5yrnWP(YX=rLKRQq zOYRD?ovW@c*$I+rYU0Gijos@HaL}YUYE};2Sz*ptuz38*s)F0Jw%vknWrxO%;g*^K zn=3(W0ywvuCgjO!)UsuC)TNNX%2!JvD5hle4W1LP@i`GJ;#h8a6iv>x}oMUdDldD}CmfK{#K1Y;dt94wy zx)#^2pH9JR>&dC@ANga)N%5D@iIQxWjwndgpn0M3<8P(ewv}h>SGvv8aK3x45TAW# zXAg7kj{HGWumJE~ry^;}zF}OK*U7$AQ0rhTLT9d4np}1uE)D%= z#L?DDZJwTt)+zM#DyS_a~n*` z_H3qSrl(`y#<^4ocE88AI1nA}{*gLd4fTP9chG5MZH3TYd5Cz(`^$#KTc@3lL#=bI z^-(KPyN6nF?q+XBnY;9@sp&jECzx dkmO1F3HW9sqrFJUUWnd`ZkHcB7O}m&^nbt)_OSo} literal 0 HcmV?d00001 diff --git a/public/images/nextjs-image-optimization/img-test.png b/public/images/nextjs-image-optimization/img-test.png deleted file mode 100644 index 2224643b23c9951298592f339479827cc5d8c8b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29032 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 diff --git a/src/content/post/blog/nextjs-image-optimization.mdx b/src/content/post/blog/nextjs-image-optimization.mdx index 3883261..420d7a1 100644 --- a/src/content/post/blog/nextjs-image-optimization.mdx +++ b/src/content/post/blog/nextjs-image-optimization.mdx @@ -167,7 +167,7 @@ export default function Page() { `img` 태그와 달리 `next/image` 컴포넌트는 이미지 URL을 `/_next/image?url=...` 형태로 변환한다. 이 URL로 **요청이 들어오면** Next.js의 이미지 최적화 미들웨어가 동작하여 다음과 같은 결과를 반환한다. -![slow 4g 환경에서 테스트한 결과](/images/nextjs-image-optimization/img-test.png) +![slow 4g 환경에서 테스트한 결과](/images/nextjs-image-optimization/img-test.avif) 네트워크 탭을 살펴보면 기본 `img` 태그의 요청은 원본 PNG 이미지(794 KB)를 그대로 전송하고 `next/image` 컴포넌트의 요청은 WebP 형식(45.7 KB)으로 **최적화되어 전송**되는 것을 확인할 수 있다. `next/image`의 두 번째 요청부터는 **캐시에서 즉시 응답**한다.