트리 쉐이킹(Tree-Shaking)과 사이드 이펙트(Side Effect) 쉽게 정리하기 😊

HMJ·2025년 6월 1일

개념정리

목록 보기
1/8

1. 트리 쉐이킹이란? 🌳✨

  • 트리 쉐이킹은 사용하지 않는 코드를 제거해서 최종 파일을 가볍게 만드는 기술이에요.
  • “나무(tree)를 흔들면 낙엽(leaves)이 떨어지는” 모습처럼, 코드에서도 “안 쓰는 부분만 털어내는” 과정을 생각하면 돼요.
  • ES2015 모듈(import/export) 방식을 기반으로 동작하며, 대표적인 번들러들이 이 기능을 지원해요.

2. 사이드 이펙트(Side Effect)란? 🎭

  • 사이드 이펙트는 모듈을 불러오기만 해도 외부 상태나 화면에 변화를 일으키는 코드입니다.
    • 예를 들어, 파일을 import 하는 순간 데이터베이스에 접근하거나 전역 변수를 바꾸는 경우가 해당돼요.
  • 순수한 로직(pure function)처럼 “입력값만 가지고 결과값을 내는” 코드와 달리, 사이드 이펙트가 있으면 번들러가 “이 모듈이 필요할지도 몰라”라고 판단해서 제거하지 못할 수 있어요.

3. 트리 쉐이킹 장점 😊👍

1. 번들 크기 줄이기

  • 안 쓰는 코드를 제거해 주니까 최종 파일이 훨씬 작아져요.
  • 예시: 라이브러리 중 일부 함수만 쓰면, 나머지는 배포 파일에 포함되지 않아요.

2. 로딩 속도 개선

  • 파일 용량이 작아지면 웹페이지 로딩이 빨라져요.
  • 사용자들이 “사이트가 빨리 열린다”라고 느끼면 만족도가 높아집니다.

3. 코드 관리의 명확성

  • 어떤 코드가 실제로 사용되는지 분명해지니까, 불필요한 코드가 쌓이지 않아요.
  • 협업 중에도 “이 부분은 왜 남아 있지?” 하고 쉽게 확인할 수 있습니다.

4. 트리 쉐이킹 단점 😅👎

1. ES 모듈 방식만 지원

  • 반드시 import/export를 사용해야 해요.
  • 예전 require/module.exports 방식으로 작성된 코드에서는 제대로 동작하지 않을 수 있어요.

2. 사이드 이펙트가 있는 코드 제외 안 될 수 있음

  • 코드 안에 외부를 바꾸는 동작이 있으면, 번들러가 “언제 쓰일지 몰라”라고 생각해 제거를 하지 않아요.
  • 이때는 모듈을 순수 로직(pure)으로 분리하거나, package.json에서 사이드 이펙트 설정을 적절히 해줘야 합니다.

3. 설정 복잡도 증가

  • package.json"sideEffects": false 등을 적어 주어야 해요.
  • 이 설정을 안 하면 번들러가 “모든 파일은 사이드 이펙트가 있을 수 있다”라고 간주해 일부 코드를 남길 수 있어요.

5. 사이드 이펙트 장점 & 단점 😊👎

  • 장점
    • 1. 필요한 동작(사이드 이펙트)을 보장
      • 예를 들어, 페이지가 로드될 때 특정 설정을 초기화해야 한다면 사이드 이펙트가 꼭 필요합니다.
      • 화면에 “환영합니다”를 자동으로 표시하거나 전역 상태를 세팅하는 코드가 여기에 해당해요.
  • 단점
    • 1. 트리 쉐이킹 방해
      • 사이드 이펙트가 있는 모듈은 번들러가 “혹시 사용될지도 몰라”라고 남겨 놓아서 최적화에서 빠질 수 있어요.
    • 2. 예측이 어려움
      • 코드가 로딩되는 순간 외부 상태를 바꾸면, 언제 어떤 순서로 동작할지 정확히 알기 어렵습니다.
      • 디버깅이나 유지보수가 복잡해질 수 있어요.

6. 왜 꼭 사용해야 할까? 🎯

1. 빠르고 가벼운 웹페이지

  • 트리 쉐이킹 덕분에 배포 파일 크기가 작아지고, 페이지 로딩 속도가 빨라집니다.
  • 사용자들이 기다림 없이 사이트를 사용할 수 있어요.

2. 서버 트래픽 비용 절감

  • 작은 파일을 전송하면 서버에서 소비하는 네트워크 비용도 줄어듭니다.
  • 결국 비용과 시간을 모두 아낄 수 있어요.

3. 불필요한 코드 관리

  • 프로젝트가 커지면 안 쓰는 코드가 쌓이게 되는데, 트리 쉐이킹은 자동으로 정리해 줍니다.
  • 협업할 때 “이 코드 어디 쓰이는 거야?”라는 고민이 줄어듭니다.

7. 실제 사용 방법 🌐

7-1. Webpack

  • 프로덕션 모드(mode: "production")로 빌드하면 자동으로 트리 쉐이킹을 시도합니다.
  • package.json에 아래의 코드를 추가하면, “이 프로젝트 안에는 사이드 이펙트가 없다”라고 Webpack에 알려줘서, 쓰이지 않는 파일을 더 적극적으로 제거할 수 있어요.
	{
	  "sideEffects": false
	}

7-2. Rollup

  • ES 모듈 기반으로 처음부터 트리 쉐이킹을 염두에 두고 설계되었습니다.
  • rollup.config.js에서 treeshake 옵션을 조정하여 세부 설정이 가능합니다.
  • 공식 문서

7-3. Vite

  • 내부적으로 Rollup을 사용하므로, Vite로 빌드할 때도 트리 쉐이킹이 자동 적용됩니다.
  • vite.config.js에서 build.rollupOptions 옵션을 통해 사이드 이펙트 제외 대상 등을 설정할 수 있어요.
  • 공식 문서

8. 정리 ✨

  • 트리 쉐이킹
    • 나무 흔들듯 “쓰지 않는 코드만 털어내는” 최적화 기술
    • 장점: 파일 크기 감소, 로딩 속도 개선, 코드 관리 명확화
    • 단점: ES 모듈 필요, 사이드 이펙트 포함 모듈은 제외하지 못할 수 있음
  • 사이드 이펙트
    • 모듈 실행 시 화면이나 데이터에 영향을 주는 행동
    • 장점: 꼭 필요한 동작(예: 초기화, 로그 남기기)에 필수
    • 단점: 트리 쉐이킹 방해, 예측/디버깅 어려움
  • 왜 써야 할까?
    1. 빠르고 가벼운 웹페이지
    2. 서버 트래픽 비용 절감
    3. 불필요한 코드 자동 정리
  • 참고 설정
    • package.json"sideEffects": false 또는 특정 파일만 제외 지시
    • Webpack, Rollup, Vite 등 주요 번들러에서 자동 지원

9. 출처 (References) 📚

1. Webpack 공식 문서

2. Rollup 공식 문서

3. Vite 공식 문서

4. MDN – 사이드 이펙트 설명

5. 블로그 아티클

  • “Practical Tree Shaking” (검색어 예시)
  • “Tree Shaking with Side Effects” (검색어 예시)

바렐(Barrel)을 공부하다가 나온 모르는 단어들을 정리해보았습니다!
이 글이 프로젝트 최적화나 웹사이트 성능 개선에 도움이 되었기를 바랍니다! 😊

0개의 댓글