컨텐츠를 불러오는 중...
HeroImage
로 만들어 달라고 요구했습니다.4267px * 1788px
나 되는 HeroImage로 설정하기에는 너무나도 큰 크기의 이미지였기 때문입니다.HeroImage
로 사용할 수 없다는 것을 깨닫게 된 것은 이미 많은 작업을 수행해 보고 난 후였고 개발자는 LCP
를 최적화 해야 한다는 것을 깨달을 수 있었다…LCP
로드 시간은 현재 사용하는 웹의 로드 속도가 얼마나 빠른지를 측정할 수 있습니다. 웹에서 간편하게 LCP
점수를 확인할 수 있는 방법은 Chrome
에서는 Lighthouse
를 이용하여 현재 페이지의 점수를 통해서 확인할 수 있습니다.LCP
가 중요할까요?LCP
가 사용되는 것입니다.LCP
에 대해 보고되는 요소의 크기는 일반적으로 표시 영역 내에서 사용자가 볼 수 있는 요소들의 크기를 기준으로 가장 큰 요소가 결정이 됩니다.LCP
를 측정하는 경우 한 번의 로드가 아닌 여러번의 시뮬레이션을 통해서 얻은 LCP 요소를 로드하는 시간 중 평균치의 시간을 구하는 것이 아닌 높은 백분위 수를 차지하고 있는 LCP의 경우 75번째 백분위수를 측정하는 것이 해당 페이지의 로드 시간을 측정하는데 유의미하기 때문입니다. 75번째 백분위수를 이용하는 이유가 무엇일까요?2.5초
이하가 되었을 경우 해당 페이지가 최적화가 잘 되어 있다고 판단할 수 있습니다.<img>
요소 (GIF 또는 애니메이션 PNG와 같은 애니메이션 콘텐츠)<svg>
요소 내의 <image>
요소<video>
요소url()
함수를 사용하여 로드된 배경 이미지가 있는 요소Document
, Stylesheet
, Image
, Script
를 개별적으로 최적화하는 것이 좋습니다. 왜냐하면 각각의 영역에서 사용할 수 있는 구체적인 최적화 기법들이 구분되어 있기 때문입니다. 하지만 경우에 따라 한 부분에 최적화를 적용해도 LCP가 개선되지 않고 절약된 시간이 다른 부분으로 옮겨지는 상황이 발생되기도 합니다.preload
를 이용하여 link
로 연결되어 있는 리소스는 중요하기 때문에 우선순위를 증가시킬 수 있게 끔 알려주고 브라우저가 HTML을 파싱하기 이전에 리소스를 로딩할 수 있게끔 하여 자원이 더 빠른 시간내에 검색되어 더 빠르게 로딩될 수 있게끔 할 수 있습니다.SSR(서버 측 렌더링)
을 사용하는 것입니다. SSR의 가장 큰 단점은 서버 처리 시간이 추가로 필요하여 TTFB가 느려질 수 있다는 점입니다. 하지만 서버 처리 시간은 개발자가 제어할 수 있는 반면 사용자의 네트워크 및 기기 기능은 제어할 수 없기 때문에 이러한 단점은 그만한 가치가 있습니다.4267px * 1788px
크기의 이미지를 절반의 크기인 2134px * 894px
로 줄이는 것입니다. 하지만 이럴 경우 피할 수 없는 문제가 발생합니다.webp
와 avif
입니다.avif
입니다! 이유는 단순합니다. 압축률
이 굉장히 뛰어나서 더 적은 크기의 이미지를 높은 화질
로 사용할 수 있기 때문입니다. 뿐만 아니라 png
와 같이 이미지의 알파 채널
을 지원하기 때문에 다양한 곳에서 사용이 가능하기 때문에 유용하다고 할 수 있습니다.AVIF
는 AV1
비디오 코덱을 이미지를 압축하는데 사용한 획기적인 이미지 포맷입니다. AVIF가 획기적인 이유는 비디오 코덱을 사용해서 이미지를 압축하려고 하였다는 점입니다. 이 과정에서 저는 왜 굳이 비디오 코덱을 이미지를 압축 하는데 사용했는지 의문이 생겼습니다.인터 프레임 압축 기술
은, 단일 이미지 내에서도 유사한 영역 간의 중복성을 효과적으로 제거하였습니다. 이외에더 많은 기술들을 활용하여 높은 압축률로 로딩 속도 향상과 대역폭 절약에 큰 도움을 줄 수 있었습니다.Y
는 휘도 U, V
는 색차 정보를 나타냅니다. 이러한 색공간의 변화로 인해서 얻을 수 있는 이점은 비디오 코덱과의 호환성이 좋아진다는 것입니다.엔트로피 코딩
, 이미지 분할
등의 여러 기술들이 적용됨으로써 AVIF는 기존의 다른 이미지 포맷들에 비해 높은 압축률과 높은 품질의 이미지를 웹에서 사용가능하게끔 하였습니다.249kB
, WebP는 153kB
, AVIF는 96kB
입니다. 위의 영상을 참고하면 가장 큰 크기의 이미지 파일인 JPEG가 프로그레시브 이미지 렌더링
, 이미지 데이터를 여러 스캔으로 나누어 점진적으로 표시함으로 인해서 가장 빠른 것 처럼 보입니다. WebP의 경우 위에서부터 아래로 렌더링이 되어 다른 이미지들이 로드되는 방식에 비해서 느리게 렌더가 되는 것처럼 보입니다. AVIF의 경우 전체가 렌더되거나 그렇지 않은 상태로 구분되어 렌더가 되는 것을 확인할 수 있습니다.sizes
속성과 srcset
속성을 눈여겨 볼 수 있습니다. 가장 먼저 sizes
속성을 살펴보겠습니다.뷰포트(viewport)
의 크기가 1351px 이상일 경우 이미지는 416px 폭으로 표시하고 뷰포트의 크기가 992px-1350px 사이일 경우 뷰포트 폭의 1/3에서 약간의 여백을 뺀 크기로 표시하라는 것을 의미합니다.w=100&auto=format
, w=200&auto=format
이 100w
일경우, 200w
일 경우로 구분이 되어 서로 다른 크기의 width와 height이 적용되어 있음을 알 수 있습니다.sizes
와 srcset
을 활용하여 뷰포트의 크기에 맞춰 로드 될 이미지의 크기를 미리 알려줌으로써 브라우저는 이미지의 크기를 미리 알고 있음으로 초기 페이지 렌더링을 더 빠르게 할 수 있을 뿐만 아니라 불필요한 크기의 이미지를 다운로드하는 것을 방지함으로써 로딩 시간을 단축 시킬 수 있습니다.CDN
을 사용하라는 것입니다. CDN
을 사용하는 것이 이미지의 최적화에 많은 영향을 주는 이유는 무엇일까요?CDN(Content Delivery Network)
은 지리적으로 분산 된 서버들을 연결한 네트워크입니다. CDN
의 많은 서버들은 네트워크 에지
라고 불리는 최종 사용자와 가까운 위치에 배치됩니다.네트워크 에지
는 주로 CDN 제공 업체가 운영하는 서버들을 의미하며, 이는 사용자와 원본 서버 사이의 중간 지점에 위치합니다. CDN은 사용자의 요청을 DNS 기반 라우팅 등의 방법을 통해 지리적으로 가장 가까운 또는 가장 효율적인 CDN 서버로 안내하여, 해당 서버에서 요청된 콘텐츠를 제공합니다. Unsplash 또한 CDN을 이용하여 이미지 최적화를 하고 있다는 것을 Unsplash Image의 Response Header 에서 확인할 수 있었습니다.x-cache
헤더는 사용자가 보낸 요청한 이미지가 CDN의 캐시 계층을 통과하면서 각각의 캐시 상태에 대한 정보를 포함하고 있습니다. x-served-by
는 각각의 캐시 계층의 서버 정보, 어느 나라의 서버가 데이터를 갖고 있었고 콘텐츠를 제공했는 지에 대한 정보를 알 수 있습니다. 위의 내용이 Unsplash 또한 CDN을 사용하고 있음을 알 수 있음을 알 수 있는 증거입니다. 위의 예시를 활용하여 CDN이 어떻게 이미지를 최적화 하는데 사용할 수 있는 지에 대해서 설명해보겠습니다.분산 캐싱
을 이용한다는 것입니다. 여러 지역에 위치한 캐시 서버들(ICN, CHI, TYO)이 콘텐츠를 저장하고 제공합니다. 이러한 분산 캐싱을 활용하여 사용자와 가장 가까운 위치의 네트워크 에지 서버를 발견 했을 경우 바로 이미지를 전달하고 프로세스를 종료하기 때문에 네트워크 대역폭에 대한 경합을 줄이고 네트워크 시간을 완전히 없애는 것이 가능하다는 장점을 갖고 있습니다.리소스의 거리 줄이기
라는 장점 만을 갖지 않습니다. 각각의 CDN은 Edge Computing 을 활용하여 동적으로 이미지 리사이징을 진행한다 거나 브라우저에서 사용이 가능한 호환성에 맞는 이미지 포맷으로 변환을 해주거나 자동으로 이미지를 개선해주는 등의 최신 기술들을 활용하여 더 빠른 로딩 시간, 낮은 대역폭 사용, 더 나은 사용자 경험을 얻을 수 있게 끔 하기 때문에 웹에서 이미지를 사용한다고 하면 CDN
은 항상 강조되는 이미지 최적화 수단이라고 할 수 있습니다.<link rel="preload" as="image" href="/path/to/hero-image.webp" />
<link
rel="preload"
fetchpriority="high"
as="image"
href="/path/to/hero-image.webp"
type="image/webp"
/>
<link
rel="preload"
href="/fonts/my-font.woff2"
as="font"
type="font/woff2"
crossorigin
/>
x-cache: HIT, HIT, HIT
x-served-by: cache-chi-klot8100071-CHI, cache-tyo11925-TYO, cache-icn1450040-ICN
x-cache: HIT, HIT, HIT
x-served-by: cache-sjc1000090-SJC, cache-tyo11935-TYO, cache-icn1450040-ICN
<img
src="data:image/bmp;base64,Qk32BAAAAAAAADYAAAAoAAAACAAAAAgAAAABABgAAAAAAMAAAAATCwAAEwsAAAAAAAAAAAAAAAAAAAAADQ0vP0BaW11yZ2h3YWFnTk1FAAAAAAAAAAAAAAA1NzlYTU5iTk5XQUA9AAAAAAAAAAAAAAAAAAA9OTlSRkZSRUVIAAAAAAAAAAAAAAAgNjZOVVVkYmJrZGRpREVHQ0NHSEhQW1tldHN9hoaNjY2TjY2Rf4CEfn+DgYGGj4+Uo6KnsbG1tLS4sLCzn5+lnp6koaGmrq6ywcDDzc3Qzs7Rx8fKqaqwqKmuq6uwuLi8y8rN19fZ19fZz8/R"
class="SpgDA"
/>
<img
sizes="(min-width: 1351px) 416px, (min-width: 992px) calc(calc(100vw - 88px) / 3), (min-width: 768px) calc(calc(100vw - 64px) / 2), 100vw"
srcset="
https://images.unsplash.com/photo-1721332155567-55d1b12aa271?w=100&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxmZWF0dXJlZC1waG90b3MtZmVlZHwxfHx8ZW58MHx8fHx8 100w,
https://images.unsplash.com/photo-1721332155567-55d1b12aa271?w=200&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxmZWF0dXJlZC1waG90b3MtZmVlZHwxfHx8ZW58MHx8fHx8 200w
"
alt="컴퓨터 앞에 앉아 휴대폰을 들고 있는 남자"
itemprop="thumbnailUrl"
data-perf="eager-loaded-img"
class="I7OuT DVW3V L1BOa"
data-test="photo-grid-masonry-img"
style="aspect-ratio: 11648 / 8736;"
/>
sizes="(min-width: 1351px) 416px, (min-width: 992px) calc(calc(100vw - 88px) /
3), (min-width: 768px) calc(calc(100vw - 64px) / 2), 100vw"
srcset="https://images.unsplash.com/photo-1721332155567-55d1b12aa271?w=100&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxmZWF0dXJlZC1waG90b3MtZmVlZHwxfHx8ZW58MHx8fHx8
100w,
https://images.unsplash.com/photo-1721332155567-55d1b12aa271?w=200&auto=format&fit=crop&q=60&ixlib=rb-4.0.3&ixid=M3wxMjA3fDF8MHxmZWF0dXJlZC1waG90b3MtZmVlZHwxfHx8ZW58MHx8fHx8
200w"