공부/CS

[CS] 프론트엔드 성능 최적화 방법 알아보기 🔍

y_flm 2025. 4. 22. 16:48
반응형

 

웹 개발을 하면서 중요하다고 생각하는 것은 UI/UX인 것 같다.

그렇다면 프론트엔드에서 성능을 최적화할 수 있는 방법은 뭐가 있을까? 🤔


이미지 최적화

     문제: 큰 이미지 파일은 페이지 로딩을 느리게 만듦.

     

     [해결방법]

  • 이미지 압축: TinyPNG 같은 도구로 용량 줄이기
  • WebP 포맷 사용: JPEG/PNG보다 훨씬 가볍고 품질 좋음
  • 필요한 크기만 로딩: 너무 큰 이미지 불러오지 말고, 사용 위치에 맞는 크기로 리사이즈
<!-- 나쁜 예 -->
<img src="/images/hero-original.png" width="300" height="200">

<!-- 좋은 예 -->
<img src="/images/hero-optimized.webp" width="300" height="200" loading="lazy">

지연 로딩 (Lazy Loading)

     문제: 사용자가 안 보는 부분의 리소스를 처음부터 다 불러오면 느림.

     

     [해결방법]

  • 이미지나 컴포넌트는 필요할 때만 로딩
<!-- 이미지 지연 로딩 -->
<img src="product.jpg" loading="lazy">

<!-- React에서 컴포넌트 lazy load -->
const ProductPage = React.lazy(() => import('./ProductPage'));

DOM 조작 최소화

     문제: DOM을 자주 건드리면 렌더링 성능이 떨어짐.

 

     [해결방법]

  • 변경 사항 한 번에 적용 (ex: documentFragment)
  • React/Vue 같은 프레임워크 사용 시, state 변경 최소화
// 나쁜 예
list.forEach(item => {
  const el = document.createElement('li');
  el.textContent = item;
  document.body.appendChild(el); // 매번 DOM 수정
});

// 좋은 예
const fragment = document.createDocumentFragment();
list.forEach(item => {
  const el = document.createElement('li');
  el.textContent = item;
  fragment.appendChild(el);
});
document.body.appendChild(fragment); // 한 번만 DOM 수정

비동기 처리 활용

     문제: 모든 스크립트를 동기로 실행하면 로딩 막힘.

 

     [해결방법]

  • <script async> 또는 <script defer> 사용
  • API 요청은 fetch나 axios로 비동기 처리
<!-- 좋은 예: HTML 렌더링 끝나고 스크립트 실행 -->
<script src="main.js" defer></script>

[script 실행 순서에 관한 내용은 아래 글의 '자바스크립트 코드는 언제 실행될까?' 부분 참고!] ⤵️

https://y-flm.tistory.com/79

 

[CS] 브라우저의 렌더링 과정

브라우저의 렌더링 과정은 웹 개발자라면 필수적으로 알아야 할 지식 중 하나이다!간단히 말하자면, 우리가 작성한 HTML / CSS / JS를 브라우저가 화면에 그리는 과정을 말한다. 쉽게 이해해보기 위

y-flm.tistory.com


이 외에도 불필요 라이브러리 제거, CSS Animation 활용 등이 있고, LightHouse를 이용해서 성능을 측정할 수도 있다!


[최종 요약]

방법 효과
이미지 최적화 로딩 속도 개선
코드 최소화/압축 파일 사이즈 ↓
지연 로딩 처음 로딩 빠르게
캐싱 재방문 시 빠르게
라이브러리 정리 불필요한 용량 ↓
DOM 조작 최소화 렌더링 부드럽게
비동기 처리 브라우저 멈춤 방지
Core Web Vitals 최적화 SEO와 UX 개선
반응형