HooneyLog

프론트엔드 성능 최적화를 시켜줄 8가지 방법!!

프로필 이미지

Seunghoon Shin

2022년 4월 28일 12:50

안녕하세요!! 이번 시간에는 프론트엔드 개발자로서 중요하게 생각해야할 클라이언트의 성능 향상을 시켜줄 대표적인 몇가지 방법들에 대해 소개해볼까 합니다!!

리소스를 압축하여 최소화하자!!

기본적으로 저희가 IDE에서 HTML, CSS 그리고 자바스크립트에 마크업과 코드들을 작성할때 띄어쓰기, 엔터 , 주석등 불필요한 공간들이 매우 매우 많이 생기게 됩니다!!

// minify 안한 상태
export function Hello(name) {
  console.log(`Hellooo ${name}`)
}
//minify 한 상태
export function Hello(o){console.log(`Hellooo ${o}`)}

그래서 위와같이 공백같은 불필요한 것들을 모두 날리고 꽉 꽉 압축하여 리소스를 최대한 줄이는 것이 핵심입니다!! 일반적으로 저희가 webpack과 같은 번들러를 사용할때 env가 production인 경우 minify해주는 옵션을 넣어 번들링을 해주게됩니다.


서버에 대한 요청을 최대한 줄여보자!

기본적으로 프론트에서 서버로 요청이 많이 들어가면 많이 들어갈수록 로드하는 속도는 더욱 더 오래걸리게 됩니다! 왜냐하면 서버에 어떠한 요청을 한다는것은 페이지가 렌더링이 되기전에 이루어져야하는 경우가 있기 때문입니다. 그렇기때문에 이러한 요청을 줄이기 위한 몇가지 방법들이 있습니다

CSS Sprites를 사용하자!

  • 이 방법이 일반적으로 서버의 요청을 줄일 수 있는 가장 쉬운 방법중 하나입니다! 만약 10가지의 이미지가 필요하다면 10가지의 개인적인 이미지를 요청해서 로드하는 대신에, 여러 이미지가 결합된 스프라이트 이미지 하나만을 요청해서 그곳에서 background-image와 background-position의 css 속성을 이용해서 보여주는 방식을 사용하는 것입니다! 이렇게 함으로써 서버한테의 요청을 획기적으로 줄일 수 가 있습니다
  • 외부의 요청이 빈번하게 일어나는 써드파티 사용을 줄이자!

  • 만약 사용하는 써드파티 라이브러리가 외부에서 많은 요청이 발생하는 경우 다른 방안을 고려해봐야겠죠?

  • 필요하지 않는 커스텀 폰트는 줄이자!

    최근 커스텀 폰트에 대한 인기가 굉장히 많아졌습니다! 직접 제작한 폰트는 웹사이트에 개성을 더해주기 때문이죠 ㅎㅎㅎ 하지만 이러한 폰트들은 높은 퍼포먼스를 요구합니다

    커스텀 폰트들은 사이즈들이 꽤 큽니다.. 구글 폰트와 같은 웹 폰트들은 HTTP에 추가 요청을 하게되는데 이것들은 페이지 렌더링 속도를 저하시키게 됩니다.

    웹사이트에서 폰트를 사용하면서 웹 성능을 개선 시키고 싶다면 다음과 같은 방법을 취해주시면 됩니다

  • 폰트의 format을 WOFF2 형태로 변환해주세요. 이것만 해도 다른 폰트 format들보다 일반적으로 30%까지나 파일 사이즈를 줄일 수 있습니다!
  • 폰트에서 사용하지 않는 것들은 다 날려버리세요! 파일 사이즈가 큰 폰트들을 보면 절대 사용하지 않을 많은 언어들을 포함하는 폰트들이 있습니다. 굳이 사용하지 않을 폰트의 언어들은 날려버리는게 좋겠죠?
  • 사용되어야하는 폰트들을 미리 로드를 시키는것입니다 → 아래와 같이 head에 font를 미리 로드해달라고 요청을 보내면 브라우저가 저 파일을 더 일찍 로드해야한다고 인지하고 미리 로드를 시켜 성능 개선에 도움을 줄 수 있습니다
  • <link rel="preload" href="/assets/Pacifico-Bold.woff2" as="font" type="font/woff2" crossorigin>


    파일을 압축하자!!

    개발자들이 열심히 개발한 코드들을 배포를 할때 이 파일 사이즈들이 커지면 커질수록 로드하는데는 더 많은 시간이 걸리게 됩니다! 시간이 지날 수록 웹서비스의 규모가 거대해지면서 HTML, CSS, 자바스크립트의 파일들이 계속 무거워져만갑니다.. ㅠ

    하지만 이것들을 최대한 압축할 수 있을만큼 압축해서 획기적인 속도 개선을 만들 수 있습니다.

    일반적으로 압축하는 대표적인 알고리즘이 2가지가 있는데 Gzip과 Brotli 방법입니다

  • Gzip이 현재 가장 대중화된 데이터 압축 방법인데 모든 브라우저에서 지원되는 것으로 알고 있습니다. 사이트의 HTML, CSS 그리고 번들링된 자바스크립트를 서버사이드에서 압축을 해주며 클라이언트에서 압축을 풀어 컨텐츠로 만들어줍니다
  • Brotli은 구글에서 개발한 압축 알고리즘으로 Gzip을 포함해서 다른 방법들 대비 가장 좋은 압축 성능을 보여줍니다. Gzip 대비 15%~20% 를 더 압축해주게 됩니다. 요청 헤더에 Accept-Encoding: brAccept-Encoding: gzip 과 같이 요청을 할 수 있습니다
  • 위의 사진은 후니로그 네트워크 탭에서 확인한 헤더인데 content-encoding이 br로 되어있는것을 보실 수 있습니다. 이말은 제 홈페이지의 압축 알고리즘이 Brotli로 이루어져있음을 볼 수 있습니다


    이미지 최적화를 해줍니다!

    아마 전세계의 모든 웹사이트에서 이미지가 안들어간 곳은 거의 없을거라고 생각이 됩니다! 그만큼 이미지는 웹사이트에서 빼놓을 수 없는 요소중 하나인데, 이 이미지들의 사이즈가 생각보다 엄청나게 크고 웹서비스를 굉장히 느리게 만들어버립니다! 때문에 이미지 최적화 작업이 엄청 중요하다고 볼 수 있습니다

    이미지를 최적화하기 위한 방법이 몇가지 존재하는데 그것은 바로

    WebP 나 AVIF 의 확장자 이미지를 사용하는 것입니다

    후니로그의 메인 backgroudn image가 초기에 jpg 확장자로 되어있었습니다. 당시 크롬에서 Lighthouse 측정을 해봤었을때

    background image 확장자가 jpg 였을때

    background image 확장자가 webp 인 상태

    보이시나요?? 퍼포먼스 차이가?! 저는 background image 확장자를 변경해서 업로드 했을 뿐인데 엄청난 성능 개선을 보여줬습니다.

    webp가 png나 jpeg대비 25%~35% 더 가볍다고 하며, avif는 50% 나 더 가볍고 webp보다도 20%나 더 가볍다고 합니다

    최적화 성능만 본다면 avif가 제일 좋지만 단점이 있습니다. webp는 대부분의 브라우저에서 지원하지만 avif는 아직 지원하는 브라우저가 적은걸로 알고있습니다. 때문에 이러한것을 고려하고 사용하면 되겠습니다!

    또 이미지 최적화에 중요한 작업이 반응형이미지를 사용하는 것입니다!

    일반적인 html에서 img 태그 안에 무거운 고해상도 이미지를 넣어버린 후 모바일에서 그 이미지를 사용하게 된다면 너무 불필요한 트래픽을 보여줍니다. 예를들어 데스크탑에서 보여줄 width가 1920 인 해상도 이미지를 넣었는데 모바일에서는 굳이 1920 짜리가 필요가 없습니다. 훨씬 더 작은 이미지를 넣어도 똑같이 보여지기 때문에 용량이 더 낮아진 이미지를 로드시키는게 훨씬 더 빠른 로드를 불러일으킬 것입니다.

    Next.js에서 지원해주는 Image 컴포넌트를 사용하면 큰 설정 없이 이미지 최적화가 이루어지고 (lazy loading 포함) 그게 아니라면 img 에 srcset 속성을 넣거나 picture 태그를 사용하여 반응형 이미지를 만들어내면 됩니다!


    지연 로딩(Lazy Loading)을 사용해주세요!

    지연로딩도 웹 최적화를 위해 많이 사용되는 기법입니다! 사용자가 굳이 안보고 있는곳에는 렌더링을 시키지 않는것입니다!

    예를들어 후니로그 페이지에 처음 방문했을때 굳이 아래에 있는 아이템 카드들을 미리 다 로드할 필요가 없겠죠?

    후니로그 첫 방문

    스켈레톤 컴포넌트로 UX 향상

    아래와 같이 스켈레톤 컴포넌트를 넣어 최대한 웹페이지 렌더를 가볍게 만들어놓은 상태입니다. 그리고 저기서 스크롤바를 조금 더 내리면 상대방이 이제 저 컨텐츠를 봐야하니까 그때 진짜 컨텐츠를 로드해서 사용자가 볼 수 있게 만드는 것입니다!

    스켈레톤 컴포넌트가 사라지고 메인 컨텐츠가 등장

    위와 같이 스켈레톤 기법과 지연로딩을 같이 사용하게 되면 웹 퍼포먼스도 올리고 UX까지 개선시킬 수 있습니다


    CDN을 사용합시다!!

    CDN은 Content Delivery Network 의 약자입니다.

    유저가 지리적으로 굉장히 멀리 있을때, 컨텐츠를 전송하는 속도에 영향이 가게됩니다. 때문에 지리적으로 서버를 여러곳에 분산시켜 사용자와 가까운곳에서 웹컨텐츠를 전송시켜서 사용자가 컨텐츠를 빨리 받아 볼 수 있게 전송 속도를 높여주는 네트워크입니다.

    예를들어 한국 사람이 미국에서 호스팅된 서버에 접속했을때 한국에 위치한 네트워크 서버에서 해당 사이트의 컨텐츠를 받는 것입니다.

    또한 CDN을 사용함으로써 HTML, CSS, 자바스크립트 파일 그리고 이미지들까지도 최적화를 할 수 있다고 합니다.


    마지막으로 JAMSTACK을 활용하자!

    jamstack은 javascript, api, markup의 약자입니다!

    클라이언트의 모든 처리는 자바스크립트가 담당하고

    모든 비즈니스 로직은 재사용 가능한 api로 처리하고

    SSG를 사용하여 미리 Markup을 하는 것입니다

    JAMSTACK 개념에서 제일 중요한것이 바로 마크업입니다!

    후니로그를 만들때 사용한 Next.js도 대표적인 JAMSTACK을 위한 react 프레임워크이며

    빌드할때 미리 markup을하여 pre rendering을 하게 됩니다!

    말 그대로 사용자가 볼 요소들을 미리 그려놨기 때문에 서버에서 html을 응답받았을때 사용자는 훨씬 더 빠른 속도로 웹서비스를 볼 수 있게 됩니다!

    때문에 향상된 퍼포먼스를 경험 할 수 있게 되는 것입니다

    이로써 프론트엔드에서 성능 향상을 시켜줄 8가지 방법에 대해 알아보았습니다.

    하나 하나 다 자세하게 학습하여 자세하게 다루고 싶었지만 하나의 게시글에서는 모든 내용을 다 담기 버거워 간략하게만 내용을 다루었습니다.

    추후에 더 자세하게 학습 후 자세한 내용 공유드리도록 하겠습니다!

    감사합니다 🙂