WebPack이란 무엇인가? 기본 파헤치기
안녕하세요 :)
웹 개발을 할 때 빌드는 반드시 거쳐야 하는 과정입니다. 그렇기에 최적화된 빌드 도구의 중요성은 점점 더 커지고 있죠.

다양한 빌드 도구 중에서도 Webpack은 가장 널리 사용되는 모듈 번들러 중 하나로, 복잡한 프로젝트를 관리하고 최적화하는 데 있어서 주목받는 툴 중 하나입니다. 오늘은 이러한 WebPack의 개념부터 내부 작동 원리, 필요성까지 살펴보도록 하겠습니다.
WebPack이 뭘까?
웹 개발을 하다 보면 여러 가지 파일들이 한꺼번에 관리되어야 하는 상황을 자주 마주하게 되죠. 예를 들어, 자바스크립트 파일, 스타일 시트(CSS), 이미지 파일, 심지어 HTML 템플릿까지요. 이렇게 다양한 파일들을 효율적으로 관리하고 배포하는 일은 생각보다 복잡할 수 있습니다. WebPack이라는 건 바로 여기서 사용될 수 있습니다! 간단히 말해 보자면, WebPack은 프로젝트 내의 파일들(JS, CSS, HTML, IMG)을 하나 이상의 번들로 묶어주는 모듈 번들러(Module Bundler)입니다.

번들(bundle)이라는 건 뭘까요?
번들이라는 건 말 그대로 여러 파일을 하나로 합친 파일을 의미합니다. WebPack을 사용하면 프로젝트 내의 모든 자원을 체계적으로 관리할 수 있을 뿐만 아니라, 최적화된 형태로 배포할 수 있어서 웹 애플리케이션의 성능을 크게 향상시킬 수 있습니다. 이렇게 여러 파일을 하나로 합치는 걸 번들링(Bundling)이라고 하는데, 이 번들링 작업은 왜 필요할까요?

번들링 작업은 왜 필요할까?
웹 페이지를 로드할 때, 브라우저는 서버에 여러 번 요청을 보내 여러 파일을 받아오게 됩니다. 파일 수가 많아지면 그만큼 네트워크 요청도 많아지고, 로딩 속도도 느려지기 마련이죠. WebPack은 이러한 문제를 해결하기 위해 여러 파일을 하나의 번들로 합쳐 네트워크 요청 수를 줄여줍니다. 결과적으로 페이지 로딩 속도가 빨라지고, 사용자는 더 빠르게 페이지를 눈으로 볼 수 있게 되는 것이죠.
WebPack에는 번들링 기능 외 다른 기능들도 존재합니다. 어떤 기능들이 있을까요?
- 모듈 번들링(Module Bundling)
- 위에서 보았듯이, 다양한 파일들을 하나의 번들로 묶어 관리합니다. 이를 통해 파일 간의 의존성을 쉽게 관리할 수 있게 해주죠.
- 코드 스플리팅
- 필요할 때만 특정 코드를 로드할 수 있게 분리하여 초기 로딩 속도를 개선합니다.
- 로더와 플러그인
- JavaScript 외에도 CSS, 이미지 등 다양한 파일 형식을 처리하고 빌드 과정을 확장할 수 있습니다.
- 개발 도구 통합
- 핫 모듈 리플레이스먼트(HMR)와 같은 기능을 통해 개발 중 실시간으로 변경 사항을 반영할 수 있습니다.
- HMR이 뭘까요?
- Hot Module Replacement로 웹 개발에서, 코드를 수정했을 때 전체 페이지를 새로고침하지 않고도 변경된 모듈(코드)을 브라우저에 즉시 반영하는 기능입니다.

예를 들어볼까요?
만약, 여러분이 React로 어떠한 웹 애플리케이션을 만들고 있다고 상상해봅시다. 이때, 여러 개의 컴포넌트 파일, 스타일 시트, 이미지 파일 등이 필요하겠죠? 각각의 파일들 개별적으로 관리하고 브라우저에 로드하려면 번거로운 작업이 따릅니다. 하지만 여기서 WebPack을 사용하면, 이러한 모든 파일들을 자동으로 하나의 번들로 묶어주기 때문에 관리가 훨씬 수월해집니다. 뿐만 아니라, WebPack은 파일을 최적화하여 번들 크기를 줄여주기 때문에 로딩 속도도 빨리집니다.

이러한 가정 속, 실제 폴더구조에서 어떻게 WebPack이 동작하는지 살펴보려고 합니다. 그 전에 몇 가지 개념을 알고 넘어가야 이해하기 쉬울 거 같기 때문에 몇 가지 개념을 살펴보고 가겠습니다.
WebPack 사용 전 핵심 개념들
WebPack을 제대로 이해하려면, 먼저 WebPack을 사용하기 전에 알아두면 좋은 몇 가지 기본 개념들이 있습니다. 이 개념들을 미리 이해하면 WebPack이 왜 필요한지, 그리고 어떻게 작동하는지 훨씬 더 쉽게 이해할 수 있을 거에요. 위에서 봤던 개념들을 포함해서 하나씩 살펴볼까요?

- 모듈(Module)과 의존성(Dependency)
- 모듈은 애플리케이션을 구성하는 개별적인 코드 단위입니다. JavaScript 파일, CSS 파일, 이미지 파일 등이 모두 모듈이 될 수 있습니다. 현대 웹 개발에서는 애플리케이션을 작은 모듈들로 나누어 관리함으로써 코드의 재사용성과 유지보수성을 높입니다.
- 의존성은 한 모듈이 다른 모듈을 필요로 하는 관계를 말합니다. 예를 들어, App.tsx라는 컴포넌트가 Header.tsx와 Footer.tsx를 사용한다면, App.tsx는 Header.tsx와 Footer.tsx에 의존성을 가지게 됩니다.
- 번들링(Bundling)
- 이 개념은 위에서도 봤죠?
- 번들링은 여러 개의 모듈을 하나 또는 몇 개의 파일로 합치는 과정을 말합니다. 웹 브라우저는 한 번에 너무 많은 파일을 로드하면 성능에 문제가 생길 수 있기 때문에, 번들링을 통해 파일 수를 줄이고 로딩 속도를 개선합니다.
- 예를 들어보자면, 여러 개의 JS 파일과 CSS 파일을 하나의 bundle.js와 bundle.css 파일로 합칠 수 있습니다. 이렇게 하면 브라우저가 파일을 로드하는 데 필요한 요청 수가 줄어들어 전체적인 로딩 시간이 단축됩니다.
- 로더(Loader)
- 웹 애플리케이션은 JS 외에도 CSS, 이미지, 폰트 등 다양한 파일 형식을 사용합니다. 로더는 WebPack이 이러한 여러 파일 형식을 이해하고 처리할 수 있도록 도와주는 변환기입니다.
- 로더에는 종류가 있는데요,
- babel-loader : 최신 JS(ES6+) 코드를 구형 브라우저에서도 호환 가능한 형태로 변환합니다.
- css-loader: CSS 파일을 JS 모듈로 변환하여 번들에 포함시킵니다.
- style-loader: 변환된 CSS를 실제 스타일 태그로 삽입하여 브라우저에 적용합니다.
- file-loader 또는 url-loader: 이미지나 폰트 파일을 처리하여 번들에 포함시키거나 별도의 파일로 출력합니다.
- 플러그인(Plugins)
- 플러그인은 WebPack의 기능을 확장하고 빌드 과정을 제어할 수 있는 도구입니다. 로더가 개별 파일을 변환하는 역할을 한다면, 플러그인은 번들링 전체 과정에 영향을 미칩니다.
- HtmlWebpackPlugin: HTML 파일을 자동으로 생성하고 번들된 스크립트를 포함시킵니다.
- DefinePlugin: 전역 상수를 정의하여 코드 내에서 환경 변수 등을 사용할 수 있게 합니다.
- UglifyJsPlugin: JavaScript 코드를 압축하고 난독화하여 파일 크기를 줄입니다.
- 플러그인은 WebPack의 기능을 확장하고 빌드 과정을 제어할 수 있는 도구입니다. 로더가 개별 파일을 변환하는 역할을 한다면, 플러그인은 번들링 전체 과정에 영향을 미칩니다.
- 엔트리(Entry)와 아웃풋(Output)
- 엔트리는 WebPack이 번들을 시작하는 지점입니다. 보통 애플리케이션의 주요 파일, 예를 들어 src/index.js를 지정합니다.
- 아웃풋은 번들된 파일이 저장되는 위치와 파일 이름을 정하는 부분입니다. path와 filename 속성을 사용해서 설정할 수 있습니다.
- 종속성 그래프(Dependency Graph)
- 종속성 그래프는 애플리케이션 내 모든 모듈과 그 모듈 간의 의존성을 시각적으로 표현한 그래프입니다.
- WebPack은 엔트리 포인트에서 시작해서 모든 모듈을 분석하고, 이 그래프를 바탕으로 최적의 번들을 만들어냅니다. 덕분에 불필요한 코드가 포함되지 않고, 효율적인 번들링이 가능해지죠.
- 코드 스플리팅(Code Splitting)
- 코드 스플리팅은 애플리케이션을 여러 개의 chunk로 나누는 기법입니다. 이렇게 하면 필요한 시점에 필요한 코드만 로드할 수 있어서 초기 로딩 속도가 빨라지게 됩니다.
- 트리 쉐이킹(Tree Shaking)
- 트리 쉐이킹은 잘 사용되지 않는 코드를 제거해서 번들 크기를 줄이는 최적화 기법입니다.
- WebPack은 ES6 모듈 시스템을 기반으로 해서, 실제로 사용되는 코드만 번들에 포함시켜줘요. 덕분에 불필요한 코드가 번들에 포함되지 않아서 파일 크기가 작아지고, 로딩 속도가 빨라집니다.
- 환경 설정(Mode)
- WebPack은 mode 설정을 통해 빌드 모드를 지정할 수 있습니다. development와 production 모드를 사용하죠.
- development 모드는 개발에 최적화된 설정으로, 소스 맵 생성과 핫 모듈 리플레이스먼트(HMR) 등을 지원합니다.
- productioin 모드는 최적화된 빌드를 생성하여, 코드 압축과 트리 쉐이킹 등이 자동으로 적용됩니다.
- 개발 서버(Development Server)
- WebPack Dev Server는 개발 중에 빠르게 결과를 확인할 수 있게 해주는 도구입니다.
- 파일을 수정하면 자동으로 번들을 다시 생성하고, 브라우저를 새로고침해서 변경 사항을 바로 확인할 수 있습니다.
- 또한, HMR을 통해 페이지 전체를 새로고침하지 않고도 변경된 부분만 업데이트할 수 있어서 개발 효율이 올라갑니다.
이렇게 해서 WebPack을 사용하기 전에 알아두면 좋은 개념들을 알아보았습니다! 이해가 되셨을까요?
WebPack 동작 흐름
지금까지 WebPack의 기본 개념들을 알아보았으니, 본격적으로 어떻게 동작하는지 간단히 살펴보도록 하겠습니다.
WebPack의 동작흐름을 이해하면, 프로젝트가 빌드되는 과정을 좀 더 명확하게 파악할 수 있습니다. 크게 다섯 가지 단계로 나눌 수 있는데요, 하나씩 알아보겠습니다.
1단계: 엔트리 포인트(Entry Point) 설정
먼저, WebPack은 엔트리 포인트라고 불리는 파일에서부터 시작합니다. 이 파일은 보통 애플리케이션의 주요 진입점인 src/index.js나 src/main.js와 같은 파일이 됩니다. 엔트리 포인트는 WebPack에게 어디서부터 번들링을 시작해야 하는지를 알려주는 역할을 합니다.
2단계: 의존성 그래프(Dependency Graph) 생성

엔트리 포인트에서 시작한 WebPack은 애플리케이션 내의 모든 모듈과 그 모듈 간의 의존성을 추적합니다. 이를 통해 의존성 그래프를 생성하는데요, 이 그래프는 프로젝트 내의 모든 파일들이 어떻게 연결되어 있는지를 시각적으로 보여줍니다. 예를 들어, App.jsx가 Header.jsx와 Footer.jsx를 사용한다면, WebPack은 이 관계를 그래프로 표현하죠.
3단계: 로더(Loader)와 플러그인(Plugins) 적용
의존성 그래프가 완성되면, WebPack은 각 모듈에 대해 로더와 플러그인을 적용합니다. 로더는 특정 파일 형식을 변환하는 역할을 하고, 플러그인은 빌드 과정을 확장하거나 최적화하는 데 사용됩니다.

- 로더: 만약에, JSX 파일을 브라우저가 이해할 수 있는 일반 JavaScript 코드로 변환하거나, CSS 파일을 JavaScript 모듈로 변환하는 등의 작업을 수행합니다.
- 플러그인: HTML 파일 생성, 코드 압축, 환경 변수 설정 등 다양한 작업을 자동화할 수 있습니다.
4단계: 번들 생성(Bundle Creation)
로더와 플러그인이 모두 적용된 후, WebPack은 모든 모듈을 하나 이상의 번들로 합칩니다. 이 번들은
최적화된 상태로 만들어져, 브라우저가 효율적으로 로드할 수 있도록 도와줍니다. 번들링을 통해 파일 수가 줄어들어 네트워크 요청이 감소하고, 로딩 속도가 빨라지느 효과가 있죠.
5단계: 출력(Output) 및 배포 준비
마지막으로, WebPack은 생성된 번들을 지정된 출력 디렉토리에 저장합니다. 보통 dist 폴더가 이에 해당하죠. 이때, HtmlWebpackPlugin과 같은 플러그인을 사용하면, 번들된 스크립트를 자동으로 포함한 HTML 파일도 함께 생성됩니다. 이렇게 생성된 파일들은 서버에 배포하거나 로컬에서 테스트할 준비가 완료됩니다.
요약해보자면!
1. 엔트리 포인트 설정: 번들링의 시작점을 지정하고 ->
2. 의존성 그래프 생성: 프로젝트 내 모든 모듈과 의존성을 추척하고 ->
3. 로더와 플러그인 사용: 파일 형식 변환 및 빌드 과정을 확장하고 ->
4. 번들 생성: 모든 모듈을 하나 이상의 번들로 합치고 ->
5. 출력 및 배포 준비: 번들을 지정된 디렉토리에 저장하고 배포할 준비를 끝마치게 됩니다.
WebPack의 탄생 배경
지금까지 알아본 WebPack이라는 도구는 왜 생기게 되었을까요?
웹 개발이 발전하면서 프로젝트의 규모와 복잡성은 점점 커져만 갔습니다. 초창기 웹 개발 시절을 잠시 떠올려 보면, 그때는 간단한 HTML 파일에 몇 개의 JavaScript와 CSS 파일을 <script>와 <link> 태그로 직접 포함시키는 방식이 주로 사용되었습니다. 작은 프로젝트에서는 이 방식이 크게 문제가 되지 않았지만, 애플리케이션이 커지면서 여러 가지 어려움이 생기기 시작했습니다.
"복잡해지는 의존성 관리"
프로젝트가 커지면, 각기 다른 모듈들이 서로 의존성을 가지게 됩니다. 예를 들어, 하나의 컴포넌트가 다른 여러 컴포넌트나 유틸리티 함수를 필요로 할 때, 이를 효율적으로 관리하는 것이 점점 더 어려워졌습니다. 의존성 관리를 수동으로 처리하다 보면, 파일의 로드 순서 문제나 중복 코드가 발생하기 쉬웠습니다. 이렇게 의존성을 체계적으로 관리하지 못하면, 코드의 유지보수성과 재사용성이 떨어지게 되죠.
"파일 합치기와 최적화의 필요성"
여러 개의 파일을 브라우저가 한꺼번에 로드하면, 네트워크 요청이 그만큼 많아지기 때문에 페이지 로딩 수가 느려질 수 있습니다. 이를 해결하기 위해 파일을 합치고 최적화하는 작업이 필요했는데, 이 과정이 번거롭고 시간이 많이 걸렸습니다. 또한, 번들링을 통해 파일 크기를 줄여야 했지만, 수동으로 관리하기에는 한계가 있었습니다. 이런 문제들이 쌓이면서 개발자들에게는 큰 골칫거리로 자리잡게 되었죠.
"다양한 파일 형식의 등장"
모던 웹 개발에서는 JS 외에도 CSS, 이미지, 폰트, 심지어 웹 애셋 관리까지 다양한 파일 형식이 사용됩니다. 이러한 파일들을 효율적으로 관리하고, 필요한 형식으로 변환하는 작업도 필요했습니다. 기존의 간단한 빌드 도구로는 이러한 요구사항을 충족시키기 어려웠습니다. 예를 들어, CSS 파일을 JS 모듈로 변환하거나, 이미지를 최적화하는 작업은 별도의 도구를 사용해야 했죠. 이렇게 다양한 형식의 파일을 하나의 프로젝트에 관리하기란 정말 쉽지 않았을 겁니다.
이러한 문제들을 해결하기 위해 WebPack이 등장하게 되었습니다.

"WebPack의 등장"
2012년 Tobias Koppers에 의해 처음 개발된 WebPack은, 단순한 번들러를 넘어 모듈 시스템을 기반으로 한 빌드 도구로 발전했습니다. WebPack은 등장 이후로 많은 주목을 받게 되었는데요, 다음과 같은 기능들로 인해 주목을 받게 되었습니다.
▶ 모듈 시스템 지원:
CommonJS, AMD, ES6 모듈 등 다양한 모듈 시스템을 지원하여, 다양한 방식으로 작성된 코드를 하나로 통합할 수 있었습니다.
▶ 유연한 구성:
로더와 플러그인을 통해 빌드 과정을 세밀하게 제어할 수 있게 되었습니다.
▶ 자동 의존성 분석:
엔트리 포인트를 기준으로 의존성을 자동으로 분삭하여, 최적의 번들 생성을 도와줍니다.
▶ 커뮤니티와 생태계:
방대한 플러그인과 로더, 활발한 커뮤니티 지원 덕분에, 다양한 기능을 손쉽게 추가할 수 있습니다.
여기서 커뮤니티는 전세계 개발자들로 이루어진 모임을 말합니다. 개발자들이 WebPack의 개선과 발전을 위해 지속적으로 기여하고 있죠. Github 같은 플랫폼에서 WebPack의 소스 코드를 관리하고, 버그를 수정하거나 새로운 기능을 추가하는 작업을 진행합니다. 또한, 포럼, 블로그, 유튜브 같은 다양한 채널을 통해 질문에 답변하고, 팁과 트릭을 공유하여 WebPack 사용에 대한 지식을 넓혀가고 있습니다. 이런 커뮤니티 덕에 문제를 빠르게 해결할 수 있고, 최신 트랜드와 모범 사례를 쉽게 접할 수 있습니다.


생태계는 WebPack 자체뿐만 아니라, WebPack과 함께 사용되는 다양한 도구와 플러그인, 로더들로 이루어진 넓은 범위를 말합니다. 예를 들어, Babel과 같은 트랜스파일러, ESLint와 같은 린터, 그리고 다양한 CSS 처리 로더나 이미지 최적화 플러그인들이 WebPack 생태계의 일부입니다.
끝내는 말
오늘은 'WebPack이란 무엇인가'에 대해 알아보았습니다.
WebPack을 사용하는 이유는 단순히 파일을 묶는 거 이상으로, 빌드와 최적화를 책임지는 도구입니다.
다양한 파일들을 모듈 단위로 효율적으로 관리할 수 있어 유지보수가 쉬워집니다. 또한, 파일을 하나로 묶으면 페이지 로딩 속도도 빨라지죠. 이는 페이지를 사용하는 실사용자들에게 좋은 UX를 경험시켜줄 수 있습니다. 또한, 다양한 파일 형식 지원, HMR, 유연한 환경 설정 옵션 등 다양한 기능을 가지고 있어 많은 사랑을 받고 있습니다. 결과적으로, WebPack은 단순 번들링을 넘어 현대 웹 개발에 있어서 중요한 도구 중에 하나로 자리잡게 되었죠. 이러한 WebPack을 이해하고 활용한다면, 프로젝트의 품질 관리를 조금 더 잘할 수 있게 될 것입니다!
읽어주셔서 감사합니다 :)