Bundler
번들러(Bundler)란?
▶ 번들러(Bundler)는 여러 개의 파일과 모듈을 하나의 파일 또는 여러 개의 파일로 병합하여 웹 애플리케이션의 로드 시간을 최적화하고 관리 효율성을 높이는 도구입니다. 번들러는 주로 자바스크립트, CSS, 이미지 파일 등 다양한 자산을 포함한 웹 애플리케이션에서 사용되며, 가장 널리 사용되는 번들러로는 Webpack, Parcel, Rollup 등이 있습니다.
번들러의 필요성
- 모듈화된 코드 관리
- 현대적인 웹 개발에서는 모듈화된 코드가 중요합니다.
각 기능을 독립된 모듈로 분리하여 개발하면 유지보수성과 확장성이 높아지지만, 많은 파일을 브라우저가 각각 요청하게 되면 네트워크 성능에 큰 영향을 미치게 됩니다. 번들러는 이러한 모듈들을 하나의 파일로 합쳐 브라우저의 요청 수를 줄여줍니다.
- 의존성 관리
- 웹 애플리케이션은 여러 외부 라이브러리와 모듈에 의존합니다.
번들러는 이러한 의존성을 자동으로 해결하고, 필요한 파일들을 올바른 순서로 포함하여 번들링해줍니다.
- 코드 최적화
- 번들러는 코드 압축, 난독화, 중복 제거, 트리 쉐이킹(Tree Shaking) 등의 최적화 기능을 제공합니다. 이를 통해 번들 크기를 최소화하고 로딩 속도를 개선할 수 있습니다.
주요 번들러
01. Webpack
- Webpack은 가장 널리 사용되는 번들러 중 하나로, 높은 유연성과 다양한 플러그인을 지원합니다. 또한 Webpack은 자바스크립트뿐만 아니라 CSS, 이미지 파일 등도 처리할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// webpack.config.js 예시
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: './src/index.html'
})
]
};
- 위의 예시에서는 entry 속성으로 번들링의 시작점을 지정하고, output 속성으로 번들링된 파일의 출력을 설정했습니다.
- 여기에 module.rules를 통해 CSS 파일을 처리하도록 설정하고, HtmlWebpackPlugin을 사용하여 HTML 파일을 번들링 과정에 포함시킵니다.
02. Parcel
- Parcel은 설정이 거의 필요 없는 번들러로, 빠르고 간단하게 사용할 수 있는 것이 특징이며 Parcel은 파일 타입을 자동으로 감지하고 적절한 변환을 수행합니다.
또한 자동으로 의존성을 처리하고, 코드 스플리팅, 핫 모듈 교체(HMR) 등의 기능을 제공하기 때문에 초보자나 간단한 프로젝트에 적합한 도구입니다.
1
2
// Parcel을 사용한 예시 (설정 파일 불필요)
// 명령어: parcel src/index.html
03. Rollup
- Rollup은 주로 라이브러리 번들링에 사용되며, ES 모듈을 기반으로 동작합니다. Rollup은 트리 쉐이킹을 통해 불필요한 코드를 제거하여 효율적인 번들을 생성합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// rollup.config.js 예시
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'cjs'
},
plugins: [
resolve(),
commonjs(),
terser()
]
};
- 위의 예시에서는 resolve 플러그인을 통해 Node.js 모듈을 가져오고, commonjs 플러그인을 통해 CommonJS 모듈을 변환했으며, 이 때 terser 플러그인은 번들된 코드를 압축합니다.
번들러의 주요 기능
- 코드 스플리팅(Code Splitting)
- 코드 스플리팅은 애플리케이션의 각 부분을 별도의 파일로 분리하여 초기 로딩 시간을 줄이고, 필요한 시점에 필요한 부분만 로드할 수 있어 사용자 경험을 개선할 수 있습니다.
- 트리 쉐이킹(Tree Shaking)
- 트리 쉐이킹은 사용되지 않는 코드를 제거하여 번들 크기를 줄이는 기술입니다. Rollup이 이 기능으로 잘 알려져 있으며, Webpack도 이를 지원합니다.
- 로더(Loaders)
- 로더는 특정 파일 타입을 처리하여 번들에 포함시킬 수 있도록 도와줍니다. 예를 들어, CSS 파일을 처리하기 위해 css-loader와 style-loader를 사용할 수 있습니다.
- 플러그인(Plugins)
- 플러그인은 번들링 과정 중 특정 작업을 수행할 수 있도록 도와줍니다. 예를 들어, Webpack의 HtmlWebpackPlugin은 번들링된 자바스크립트를 HTML 파일에 자동으로 삽입합니다.
- 개발 서버(Dev Server)
- 번들러는 종종 개발 서버를 제공하여 로컬 환경에서 개발 중인 애플리케이션을 실시간으로 확인하고, 변경 사항을 자동으로 반영할 수 있게 합니다. Webpack Dev Server와 Parcel Dev Server가 그 예입니다.
번들러 사용의 장점
- 성능 향상
- 번들러는 코드 압축, 트리 쉐이킹, 코드 스플리팅 등을 통해 애플리케이션 성능을 향상시킵니다. 이는 최종 사용자의 로딩 시간을 줄이고, 애플리케이션 반응성을 높이는 데 기여합니다.
- 유지보수 용이성
- 모듈화된 코드와 의존성 관리를 통해 프로젝트 구조를 체계적으로 유지할 수 있습니다. 이는 코드의 가독성을 높이고, 유지보수를 용이하게 만듭니다.
- 개발 효율성
- 번들러는 개발 서버와 핫 모듈 교체(HMR)를 제공하여 개발자가 실시간으로 변경 사항을 확인할 수 있게 합니다. 이는 개발 속도를 높이고, 디버깅을 쉽게 만듭니다.
- 다양한 파일 처리
- 번들러는 자바스크립트 외에도 CSS, 이미지, 폰트 등 다양한 파일을 처리할 수 있습니다. 이를 통해 모든 자산을 일관된 방식으로 관리하고 최적화할 수 있습니다.
이렇게 오늘은 번들러(Bundler)에 대해 알아봤는데요,
면접에서도 충분히 나올 수 있는 질문이기 때문에 미리 공부해두면 좋을 것 같네요!
그렇다면 저는 다음에 또다른 면접에 대비한 내용을 들고오도록 하겠습니다 😁!
This post is licensed under CC BY 4.0 by the author.