WOK-AT(워캣) 개발을 하면서 성능 측정을 위해 오늘도 어김없이 Lighthouse를 돌려보았습니다.
워캣의 메인 페이지에서 가장 취약했던 지표는 LCP(Largest Contentful Paint)였습니다. LCP는 페이지가 처음으로 로드를 시작한 시점을 기준으로 뷰포트 내에 있는 가장 큰 이미지 또는 텍스트 블록의 렌더링 시간을 보고하는 지표입니다. LCP 수치가 좋으면, 그만큼 메인 콘텐츠가 빠르게 로드되어 사용자가 해당 페이지를 빠르게 이용할 수 있다고 인지하게 돕습니다.
따라서 사용자에게 빠른 속도의 페이지를 제공하기 위해 LCP를 개선하고자 했습니다.
Next.js 공식문서에 따르면 v12.0.0부터 avif 포맷의 이미지를 지원하기 시작했다고 합니다.
next.config.js 파일을 다음과 같이 수정하면 avif 지원을 활성화할 수 있습니다.
공식문서가 알려주는 대로 워캣에도 적용해 보았습니다.
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
images: {
domains: ['wokat-place-image.s3.ap-northeast-2.amazonaws.com'],
formats: ['image/avif', 'image/webp'],
},
};
module.exports = nextConfig;
💡 Next.js의 Image Optimization API는 요청의
Accept
헤더를 통해 브라우저에서 지원되는 이미지 형식을 자동으로 감지합니다. 만일Accept
헤더가 설정한 포맷 중 둘 이상과 일치하는 경우 배열에서 첫 번째로 일치하는 포맷이 사용됩니다. 일치하는 항목이 없다면 Image Optimization API는 원본 이미지의 포맷으로 fallback 합니다. - Next.js 공식문서
💡 (참고)
- AVIF generally takes 20% longer to encode but it compresses 20% smaller compared to WebP. This means that the first time an image is requested, it will typically be slower and then subsequent requests that are cached will be faster.
- If you self-host with a Proxy/CDN in front of Next.js, you must configure the Proxy to forward the
Accept
header.
AVIF는 일반적으로 인코딩하는 데 20%
더 오래 걸리지만 압축률은 WebP에 비해 20%
더 작습니다. 즉, 이미지가 처음 요청될 때는 일반적으로 속도가 느리지만 캐시 된 후속 요청이 더 빠릅니다.
이러한 특징을 이용해서 메인 페이지의 온보딩 모달에 사용되는 이미지들을 avif로 변경했습니다.
정교하거나 좋은 화질을 제공하는 svg보다는 이미지를 빠르게 인코딩하고 더 많이 압축해 주는 webp나 avif가 성능 개선에 도움이 될 거라고 생각했습니다.
참고로 avif로 포맷을 바꾸기 위해 Squoosh 사이트를 이용했습니다.
제가 가장 애용하는 이미지 압축 + 사이즈 조정 + 포맷 변경 툴이에요.
- 출처 : https://web.dev/learn/images/avif/
위 사진처럼 변경 전/후 비교가 간편하고 직관적이라 이미지를 다루기 좋습니다.
1) webp 이미지 크기 및 로딩 시간
2) avif 이미지 크기 및 로딩 시간
avif가 webp보다 훨씬 용량이 작고, 더 빨리 이미지를 불러오네요.
여러 가지 최적화를 적용하여 72점에서 84점까지 올렸었는데,
이미지 포맷 변경으로 인해 위와 같이 94점까지 성능을 개선했습니다. 👏
메인 페이지와 마찬가지로 공간 리스트 페이지에도 이미지 최적화를 적용했더니 LCP가 2.5초 이하로 줄어들어 더 나은 사용자 경험을 제공하게 되었습니다.
아직 개선해야 할 부분이 많기에, 이미지 최적화 이외에도 다양한 최적화 방법을 동원하여 페이지 성능을 개선해 볼 계획입니다.
좋은 정보 감사합니다