JavaScript μμ€ λ§΅μ κ°λ ₯ν κΈ°λ₯μ νμ©νμ¬ λλ²κΉ μ κ°μννμΈμ. μ΄ μ’ ν© κ°μ΄λλ μ μΈκ³ κ°λ°μλ₯Ό μν΄ μμ€ λ§΅ μμ±, ν΄μ, κ³ κΈ κΈ°μ λ° λͺ¨λ² μ¬λ‘λ₯Ό νꡬν©λλ€.
λΈλΌμ°μ λλ²κΉ μ¬ν: ν¨μ¨μ μΈ κ°λ°μ μν JavaScript μμ€ λ§΅ λ§μ€ν°νκΈ°
νλ μΉ κ°λ°μμ JavaScript μ½λλ νλ‘λμ μ λ°°ν¬λκΈ° μ μ λ³νλλ κ²½μ°κ° λ§μ΅λλ€. μ΄ λ³ν κ³Όμ μλ μΌλ°μ μΌλ‘ μ½λ μ΅μν(minification), λ²λ€λ§(bundling), κ·Έλ¦¬κ³ λλ‘λ νΈλμ€νμΌλ§(transpilation, μ: Babelμ μ¬μ©νμ¬ ESNext μ½λλ₯Ό ES5λ‘ λ³ν)μ΄ ν¬ν¨λ©λλ€. μ΄λ¬ν μ΅μ νλ μ±λ₯κ³Ό νΈνμ±μ ν₯μμν€μ§λ§, λλ²κΉ μ μ λͺ½μΌλ‘ λ§λ€ μ μμ΅λλ€. μ΅μνλκ±°λ λ³νλ μ½λμμ μ€λ₯λ₯Ό μ΄ν΄νλ €λ μλλ νμ΄μ§κ° λΉ μ§κ³ λ¬Έμ₯μ΄ λ€μμΈ μ± μ μ½μΌλ €λ κ²κ³Ό κ°μ΅λλ€. λ°λ‘ μ΄λ JavaScript μμ€ λ§΅(source maps)μ΄ κ΅¬μν¬μλ‘ λ±μ₯ν©λλ€.
JavaScript μμ€ λ§΅μ΄λ 무μμΈκ°?
JavaScript μμ€ λ§΅μ λ³νλ μ½λλ₯Ό μλ³Έ μμ€ μ½λλ‘ λ€μ λ§€ννλ νμΌμ λλ€. μ΄λ λΈλΌμ°μ μμ μ€νλλ μ½λκ° λ³νλ λ²μ μΌ λμλ λΈλΌμ°μ μ κ°λ°μ λκ΅¬κ° μ¬λμ΄ μ½μ μ μλ μλ³Έ μ½λλ₯Ό 보μ¬μ€ μ μλλ‘ νλ λ€λ¦¬ μν μ ν©λλ€. μ¦, μ΅μνλ μ½λμ μνΈ κ°μ μΆλ ₯μ μλ³Έ μμ€ μ½λμ νμ΄ν μΈμ΄λ‘ λ€μ λ²μν΄μ£Όλ ν΄λ κΈ°λΌκ³ μκ°ν μ μμ΅λλ€.
ꡬ체μ μΌλ‘ μμ€ λ§΅μ λ€μκ³Ό κ°μ μ 보λ₯Ό μ 곡ν©λλ€:
- μλ³Έ νμΌ μ΄λ¦κ³Ό μ€ λ²νΈ.
- λ³νλ μ½λμ μμΉμ μλ³Έ μ½λμ μμΉ κ°μ λ§€ν.
- μλ³Έ μμ€ μ½λ μ체 (μ ν μ¬ν).
μμ€ λ§΅μ΄ μ μ€μνκ°?
μμ€ λ§΅μ μ¬λ¬ κ°μ§ μ΄μ λ‘ λ§€μ° μ€μν©λλ€:
- ν¨μ¨μ μΈ λλ²κΉ : μ½λκ° λ³νλμ§ μμ κ²μ²λΌ λλ²κΉ ν μ μκ² ν΄μ€λλ€. μ΅μνλκ±°λ λ²λ€λ§λ λ²μ μ μ€νν λμλ μλ³Έ μμ€ νμΌμμ μ€λ¨μ (breakpoint)μ μ€μ νκ³ , μ½λλ₯Ό λ¨κ³λ³λ‘ μ€ννλ©°, λ³μλ₯Ό κ²μ¬ν μ μμ΅λλ€.
- ν₯μλ μ€λ₯ μΆμ : Sentry, Bugsnag, Rollbarμ κ°μ μ€λ₯ λ³΄κ³ λꡬλ μμ€ λ§΅μ μ¬μ©νμ¬ μλ³Έ μμ€ μ½λλ₯Ό κ°λ¦¬ν€λ μ€ν νΈλ μ΄μ€(stack trace)λ₯Ό μ 곡ν μ μμ΄ μ€λ₯μ κ·Όλ³Έ μμΈμ ν¨μ¬ μ½κ² μλ³ν μ μμ΅λλ€. κ±°λνκ³ μ΅μνλ JavaScript νμΌμ μ μ μλ ν μ€ λμ , μ ꡬ쑰νλ TypeScript μ½λμ λ¬Έμ μ§μ μ μ§μ κ°λ¦¬ν€λ μ€λ₯ λ³΄κ³ μλ₯Ό λ°λλ€κ³ μμν΄ λ³΄μΈμ.
- ν₯μλ μ½λ μ΄ν΄: λͺ μμ μΈ λλ²κΉ μμ΄λ μμ€ λ§΅μ μ¬μ©νλ©΄ λ³νλ μ½λκ° μλ³Έ μ½λμ μ΄λ»κ² κ΄λ ¨λλμ§ λ μ½κ² μ΄ν΄ν μ μμ΅λλ€. μ΄λ ν¬κ±°λ 볡μ‘ν μ½λλ² μ΄μ€λ‘ μμ ν λ νΉν μ μ©ν©λλ€.
- μ±λ₯ λΆμ: μ±λ₯ λΆμ λꡬμμλ μμ€ λ§΅μ μ¬μ©νμ¬ μ±λ₯ μ§νλ₯Ό μλ³Έ μμ€ μ½λμ κ·μμν¬ μ μμ΄ μ ν리μΌμ΄μ μ μ±λ₯ λ³λͺ© νμμ μλ³νλ λ° λμμ΄ λ©λλ€.
μμ€ λ§΅μ μλ λ°©μ: κΈ°μ μ κ°μ
μμ€ λ§΅μ ν΅μ¬μ νΉμ νμμ λ°λ₯΄λ JSON νμΌμ
λλ€. μμ€ λ§΅μ ν΅μ¬ κ΅¬μ± μμλ mappings νλλ‘, μ¬κΈ°μλ λ³νλ μ½λμ μλ³Έ μ½λ κ°μ λ§€νμ λνλ΄λ base64 VLQ(Variable Length Quantity)λ‘ μΈμ½λ©λ λ¬Έμμ΄μ΄ ν¬ν¨λ©λλ€. VLQ μΈμ½λ©μ 볡μ‘ν μΈλΆ μ¬νμ μ΄ν΄νλ κ²μ΄ μμ€ λ§΅μ ν¨κ³Όμ μΌλ‘ μ¬μ©νλ λ° νμ νμν κ²μ μλμ§λ§, λμ μμ€μ μ΄ν΄λ λμμ΄ λ μ μμ΅λλ€.
λ§€νμ΄ μλνλ λ°©μμ κ°λ¨ν μ€λͺ νλ©΄ λ€μκ³Ό κ°μ΅λλ€:
- webpack, Parcel λλ Rollupκ³Ό κ°μ λκ΅¬κ° μ½λλ₯Ό λ³νν λ λ³νλ JavaScript νμΌκ³Ό ν¨κ» μμ€ λ§΅μ μμ±ν©λλ€.
- μμ€ λ§΅μλ μλ³Έ νμΌ, ν΄λΉ λ΄μ©(μ ν μ¬ν), κ·Έλ¦¬κ³ μλ³Έκ³Ό λ³νλ μ½λ κ°μ λ§€ν μ λ³΄κ° ν¬ν¨λ©λλ€.
- λ³νλ JavaScript νμΌμλ λΈλΌμ°μ μ μμ€ λ§΅μ μ΄λμ μ°Ύμ μ μλμ§ μλ €μ£Όλ νΉλ³ν μ£Όμ(μ:
//# sourceMappingURL=main.js.map)μ΄ ν¬ν¨λ©λλ€. - λΈλΌμ°μ κ° λ³νλ JavaScript νμΌμ λ‘λν λ
sourceMappingURLμ£Όμμ λ³΄κ³ μμ€ λ§΅ νμΌμ μμ²ν©λλ€. - κ·Έλ¬λ©΄ λΈλΌμ°μ μ κ°λ°μ λκ΅¬κ° μμ€ λ§΅μ μ¬μ©νμ¬ μλ³Έ μμ€ μ½λλ₯Ό νμνκ³ λλ²κΉ ν μ μλλ‘ ν©λλ€.
μμ€ λ§΅ μμ±νκΈ°
λλΆλΆμ μ΅μ JavaScript λΉλ λꡬλ μμ€ λ§΅ μμ±μ μν λ΄μ₯ μ§μμ μ 곡ν©λλ€. λ€μμ λͺ κ°μ§ μΈκΈ° μλ λꡬμμ μμ€ λ§΅μ νμ±ννλ λ°©λ²μ λλ€:
Webpack
webpack.config.js νμΌμμ devtool μ΅μ
μ μ€μ ν©λλ€:
module.exports = {
// ...
devtool: 'source-map', // λλ 'eval-source-map', 'cheap-module-source-map' κ°μ λ€λ₯Έ μ΅μ
λ€
// ...
};
devtool μ΅μ
μ μμ€ λ§΅ μμ± λ°©μκ³Ό μλ³Έ μμ€ μ½λ ν¬ν¨ μ¬λΆλ₯Ό μ μ΄ν©λλ€. λ€μν devtool μ΅μ
μ λΉλ μλ, λλ²κΉ
κ²½ν, μμ€ λ§΅ ν¬κΈ° κ°μ μλ‘ λ€λ₯Έ μ₯λ¨μ μ μ 곡ν©λλ€. νλ‘λμ
νκ²½μμλ λ³λμ .map νμΌμ μμ±νλ 'source-map' μ¬μ©μ κ³ λ €νμΈμ.
Parcel
Parcelμ κ°λ° λͺ¨λμμ κΈ°λ³Έμ μΌλ‘ μμ€ λ§΅μ μλμΌλ‘ μμ±ν©λλ€. νλ‘λμ
λΉλμ κ²½μ° --source-maps νλκ·Έλ₯Ό μ¬μ©νμ¬ μμ€ λ§΅μ νμ±νν μ μμ΅λλ€:
parcel build index.js --dist-dir dist --no-content-hash --source-maps
Rollup
rollup.config.js νμΌμμ μΆλ ₯ μ΅μ
μ ꡬμ±νμ¬ μμ€ λ§΅μ μμ±ν©λλ€:
import terser from '@rollup/plugin-terser';
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
sourcemap: true, // μμ€ λ§΅ μμ± νμ±ν
plugins: [
terser(), // μΆλ ₯λ¬Ό μ΅μν (μ ν μ¬ν)
],
},
};
TypeScript μ»΄νμΌλ¬ (tsc)
TypeScript μ»΄νμΌλ¬(tsc)λ₯Ό μ¬μ©ν λ tsconfig.json νμΌμμ μμ€ λ§΅ μμ±μ νμ±νν©λλ€:
{
"compilerOptions": {
// ...
"sourceMap": true, // μμ€ λ§΅ μμ± νμ±ν
// ...
}
}
λΈλΌμ°μ μμ μμ€ λ§΅ μ€μ νκΈ°
λλΆλΆμ μ΅μ λΈλΌμ°μ λ μμ€ λ§΅μ μλμΌλ‘ μ§μν©λλ€. κ·Έλ¬λ λΈλΌμ°μ κ°λ°μ λꡬ μ€μ μμ μμ€ λ§΅ μ§μμ νμ±νν΄μΌ ν μλ μμ΅λλ€.
Chrome
- Chrome DevTools μ΄κΈ° (λ§μ°μ€ μ€λ₯Έμͺ½ ν΄λ¦ -> κ²μ¬).
- ν±λλ°ν΄ μμ΄μ½(μ€μ ) ν΄λ¦.
- Preferences ν¨λμμ "Enable JavaScript source maps"κ° μ²΄ν¬λμ΄ μλμ§ νμΈ.
Firefox
- Firefox κ°λ°μ λꡬ μ΄κΈ° (λ§μ°μ€ μ€λ₯Έμͺ½ ν΄λ¦ -> κ²μ¬).
- ν±λλ°ν΄ μμ΄μ½(μ€μ ) ν΄λ¦.
- Sources ν¨λμμ "Show original sources"κ° μ²΄ν¬λμ΄ μλμ§ νμΈ.
Safari
- Safari μ΄κΈ°.
- Safari -> νκ²½μ€μ -> κ³ κΈμΌλ‘ μ΄λ.
- "λ©λ΄ λ§λμμ κ°λ°μμ© λ©λ΄ 보기" 체ν¬.
- κ°λ°μμ© λ©λ΄ μ΄κΈ° -> μΉ μμ± λ³΄κΈ°.
- μΉ μμ± μ°½μμ ν±λλ°ν΄ μμ΄μ½(μ€μ ) ν΄λ¦.
- General ν¨λμμ "Show Source Map Resources"κ° μ²΄ν¬λμ΄ μλμ§ νμΈ.
κ³ κΈ μμ€ λ§΅ κΈ°μ
κΈ°λ³Έμ μΈ μμ€ λ§΅ μμ± λ° κ΅¬μ± μΈμλ μμ€ λ§΅μ μ΅λν νμ©νλ λ° λμμ΄ λλ λͺ κ°μ§ κ³ κΈ κΈ°μ μ΄ μμ΅λλ€.
μ¬λ°λ₯Έ devtool μ΅μ
μ ννκΈ° (Webpack)
Webpackμ devtool μ΅μ
μ λ€μν ꡬμ±μ μ 곡ν©λλ€. κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ λͺ κ°μ§ μ΅μ
κ³Ό κ·Έ μ₯λ¨μ μ λΆμν΄ λ³΄κ² μ΅λλ€:
'source-map': λ³λμ.mapνμΌμ μμ±ν©λλ€. κ°λ° μ€ λΉλ μλμ μν₯μ μ£Όμ§ μμΌλ©΄μ κ³ νμ§μ μμ€ λ§΅μ μ 곡νλ―λ‘ νλ‘λμ νκ²½μ κ°μ₯ μ ν©ν©λλ€.'inline-source-map': μμ€ λ§΅μ λ°μ΄ν° URLλ‘ JavaScript νμΌμ μ§μ ν¬ν¨μν΅λλ€. κ°λ°μλ νΈλ¦¬νμ§λ§ JavaScript νμΌμ ν¬κΈ°λ₯Ό μ¦κ°μν΅λλ€.'eval':eval()μ μ¬μ©νμ¬ μ½λλ₯Ό μ€νν©λλ€. λΉλ μκ°μ λΉ λ₯΄μ§λ§ λλ²κΉ κΈ°λ₯μ΄ μ νμ μ λλ€. νλ‘λμ νκ²½μλ κΆμ₯λμ§ μμ΅λλ€.'cheap-module-source-map':'source-map'κ³Ό μ μ¬νμ§λ§ μ΄(column) λ§€νμ μλ΅νμ¬ λΉλ μκ°μ λ λΉ λ₯΄μ§λ§ λλ²κΉ μ μ λ°λλ λ¨μ΄μ§λλ€.'eval-source-map':'eval'κ³Ό'source-map'μ κ²°ν©ν λ°©μμ λλ€. κ°λ° μ€ λΉλ μλμ λλ²κΉ κ²½ν μ¬μ΄μ κ· νμ΄ μ’μ΅λλ€.
μ¬λ°λ₯Έ devtool μ΅μ
μ μ ννλ κ²μ νΉμ μꡬ μ¬νκ³Ό μ°μ μμμ λ°λΌ λ€λ¦
λλ€. κ°λ° νκ²½μμλ 'eval-source-map'μ΄λ 'cheap-module-source-map'μ΄ μ’
μ’
μ’μ μ νμ
λλ€. νλ‘λμ
νκ²½μμλ μΌλ°μ μΌλ‘ 'source-map'μ΄ κΆμ₯λ©λλ€.
μλνν° λΌμ΄λΈλ¬λ¦¬ λ° μμ€ λ§΅ μμ νκΈ°
λ§μ μλνν° λΌμ΄λΈλ¬λ¦¬λ μ체 μμ€ λ§΅μ μ 곡ν©λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν λ, ν΄λΉ μμ€ λ§΅μ΄ λΉλ νλ‘μΈμ€μμ μ¬λ°λ₯΄κ² ꡬμ±λμλμ§ νμΈνμΈμ. μ΄λ κ² νλ©΄ λΌμ΄λΈλ¬λ¦¬μ μ½λλ₯Ό λ§μΉ μμ μ μ½λμΈ κ²μ²λΌ λλ²κΉ ν μ μμ΅λλ€.
μλ₯Ό λ€μ΄, npmμμ μμ€ λ§΅μ μ 곡νλ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νλ κ²½μ°, λΉλ λκ΅¬κ° μλμΌλ‘ μ΄λ₯Ό κ°μ§νμ¬ μμ±λ μμ€ λ§΅μ ν¬ν¨ν΄μΌ ν©λλ€. κ·Έλ¬λ μλνν° λΌμ΄λΈλ¬λ¦¬μ μμ€ λ§΅μ μ¬λ°λ₯΄κ² μ²λ¦¬νλλ‘ λΉλ λꡬλ₯Ό ꡬμ±ν΄μΌ ν μλ μμ΅λλ€.
μΈλΌμΈ μμ€ λ§΅ μ²λ¦¬νκΈ°
μμ μΈκΈνλ―μ΄, μμ€ λ§΅μ 'inline-source-map' μ΅μ
μ μ¬μ©νμ¬ JavaScript νμΌμ μ§μ μΈλΌμΈμΌλ‘ ν¬ν¨λ μ μμ΅λλ€. μ΄λ κ°λ°μλ νΈλ¦¬ν μ μμ§λ§, νμΌ ν¬κΈ° μ¦κ° λλ¬Έμ νλ‘λμ
νκ²½μμλ μΌλ°μ μΌλ‘ κΆμ₯λμ§ μμ΅λλ€.
νλ‘λμ
νκ²½μμ μΈλΌμΈ μμ€ λ§΅μ λ°κ²¬ν κ²½μ°, source-map-explorerμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ μΈλΌμΈ μμ€ λ§΅μ΄ νμΌ ν¬κΈ°μ λ―ΈμΉλ μν₯μ λΆμν μ μμ΅λλ€. λν λꡬλ₯Ό μ¬μ©νμ¬ JavaScript νμΌμμ μμ€ λ§΅μ μΆμΆνκ³ λ³λλ‘ μ 곡ν μλ μμ΅λλ€.
μ€λ₯ λͺ¨λν°λ§ λꡬμ μμ€ λ§΅ μ¬μ©νκΈ°
Sentry, Bugsnag, Rollbarμ κ°μ μ€λ₯ λͺ¨λν°λ§ λꡬλ μμ€ λ§΅μ μ¬μ©νμ¬ μλ³Έ μμ€ μ½λλ₯Ό κ°λ¦¬ν€λ μμΈν μ€λ₯ λ³΄κ³ μλ₯Ό μ 곡ν μ μμ΅λλ€. μ΄λ νλ‘λμ νκ²½μμ μ€λ₯λ₯Ό μλ³νκ³ μμ νλ λ° λ§€μ° μ μ©ν©λλ€.
μ΄λ¬ν λꡬμ ν¨κ» μμ€ λ§΅μ μ¬μ©νλ €λ©΄ μΌλ°μ μΌλ‘ μμ€ λ§΅μ μ€λ₯ λͺ¨λν°λ§ μλΉμ€μ μ λ‘λν΄μΌ ν©λλ€. μμ€ λ§΅μ μ λ‘λνλ ꡬ체μ μΈ λ¨κ³λ μ¬μ©νλ λꡬμ λ°λΌ λ€λ¦ λλ€. μμΈν μ 보λ μ¬μ© μ€μΈ μ€λ₯ λͺ¨λν°λ§ λꡬμ μ€λͺ μλ₯Ό μ°Έμ‘°νμΈμ.
μλ₯Ό λ€μ΄, Sentryμμλ sentry-cli λꡬλ₯Ό μ¬μ©νμ¬ μμ€ λ§΅μ μ
λ‘λν μ μμ΅λλ€:
sentry-cli releases files upload-sourcemaps --dist dist --url-prefix '~/' ./dist
μμ€ λ§΅μΌλ‘ νλ‘λμ μ½λ λλ²κΉ νκΈ°
μμ€ λ§΅μ μ£Όλ‘ κ°λ°μ μ¬μ©λμ§λ§, νλ‘λμ μ½λ λλ²κΉ μλ λ§€μ° μ μ©ν μ μμ΅λλ€. νλ‘λμ νκ²½μμ μμ€ λ§΅μ μ¬μ©νλ©΄ μμΈν μ€λ₯ λ³΄κ³ μλ₯Ό λ°κ³ κ°λ° νκ²½μ μλ κ²μ²λΌ μ½λλ₯Ό λλ²κΉ ν μ μμ΅λλ€.
κ·Έλ¬λ νλ‘λμ νκ²½μμ μμ€ λ§΅μ μ 곡νλ©΄ μμ€ μ½λκ° λμ€μκ² λ ΈμΆλ μ μμ΅λλ€. λ°λΌμ νλ‘λμ νκ²½μμ μμ€ λ§΅μ μ 곡νκΈ° μ μ 보μμμ μν₯μ μ μ€νκ² κ³ λ €νλ κ²μ΄ μ€μν©λλ€.
ν κ°μ§ μ κ·Ό λ°©μμ μΉμΈλ μ¬μ©μμκ²λ§ μμ€ λ§΅μ μ 곡νλ κ²μ λλ€. μΉ μλ²λ₯Ό ꡬμ±νμ¬ μμ€ λ§΅μ μ 곡νκΈ° μ μ μΈμ¦μ μꡬν μ μμ΅λλ€. λλ Sentryμ κ°μ΄ μμ€ λ§΅ μ μ₯ λ° μ κ·Ό μ μ΄λ₯Ό μ²λ¦¬ν΄μ£Όλ μλΉμ€λ₯Ό μ¬μ©ν μλ μμ΅λλ€.
μμ€ λ§΅ μ¬μ©μ μν λͺ¨λ² μ¬λ‘
μμ€ λ§΅μ ν¨κ³Όμ μΌλ‘ μ¬μ©νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄μΈμ:
- λͺ¨λ νκ²½μμ μμ€ λ§΅ μμ±νκΈ°: κ°λ° λ° νλ‘λμ νκ²½ λͺ¨λμμ μμ€ λ§΅μ μμ±νμΈμ. μ΄λ κ² νλ©΄ νκ²½μ κ΄κ³μμ΄ μ½λλ₯Ό λλ²κΉ νκ³ μ€λ₯λ₯Ό ν¨κ³Όμ μΌλ‘ μΆμ ν μ μμ΅λλ€.
- μ μ ν
devtoolμ΅μ μ¬μ©νκΈ°: μꡬ μ¬νκ³Ό μ°μ μμμ κ°μ₯ μ ν©νdevtoolμ΅μ μ μ ννμΈμ. κ°λ° νκ²½μμλ'eval-source-map'μ΄λ'cheap-module-source-map'μ΄ μ’μ μ νμ΄λ©°, νλ‘λμ νκ²½μμλ'source-map'μ΄ μΌλ°μ μΌλ‘ κΆμ₯λ©λλ€. - μ€λ₯ λͺ¨λν°λ§ λꡬμ μμ€ λ§΅ μ λ‘λνκΈ°: μ€λ₯ λͺ¨λν°λ§ λꡬμ μμ€ λ§΅μ μ λ‘λνμ¬ μλ³Έ μμ€ μ½λλ₯Ό κ°λ¦¬ν€λ μμΈν μ€λ₯ λ³΄κ³ μλ₯Ό λ°μΌμΈμ.
- νλ‘λμ νκ²½μμ μμ νκ² μμ€ λ§΅ μ 곡νκΈ°: νλ‘λμ νκ²½μμ μμ€ λ§΅μ μ 곡νκΈ°λ‘ μ νν κ²½μ°, 보μμμ μν₯μ μ μ€νκ² κ³ λ €νκ³ μμ€ μ½λλ₯Ό 보νΈνκΈ° μν μ μ ν μ‘°μΉλ₯Ό μ·¨νμΈμ.
- μ κΈ°μ μΌλ‘ μμ€ λ§΅ ν μ€νΈνκΈ°: μμ€ λ§΅μ΄ μ¬λ°λ₯΄κ² μλνλμ§ μ κΈ°μ μΌλ‘ ν μ€νΈνμΈμ. μ΄λ κ² νλ©΄ λ¬Έμ λ₯Ό μ‘°κΈ°μ λ°κ²¬νκ³ λμ€μ λλ²κΉ μΌλ‘ μΈν 골칫거리λ₯Ό μλ°©ν μ μμ΅λλ€.
- λΉλ λꡬλ₯Ό μ΅μ μνλ‘ μ μ§νκΈ°: μ΅μ μμ€ λ§΅ κΈ°λ₯κ³Ό λ²κ·Έ μμ μ νμ©νλ €λ©΄ λΉλ λꡬλ₯Ό μ΅μ μνλ‘ μ μ§νμΈμ.
μΌλ°μ μΈ μμ€ λ§΅ λ¬Έμ λ° ν΄κ²° λ°©λ²
μμ€ λ§΅μ μΌλ°μ μΌλ‘ μ λ’°ν μ μμ§λ§, λλλ‘ λ¬Έμ κ° λ°μν μ μμ΅λλ€. λ€μμ μΌλ°μ μΈ μμ€ λ§΅ λ¬Έμ μ ν΄κ²° λ°©λ²μ λλ€:
- μμ€ λ§΅μ΄ λ‘λλμ§ μμ: μμ€ λ§΅μ΄ λ‘λλμ§ μλ κ²½μ°, JavaScript νμΌμ
sourceMappingURLμ£Όμμ΄ μμ€ λ§΅ νμΌμ μ¬λ°λ₯Έ μμΉλ₯Ό κ°λ¦¬ν€κ³ μλμ§ νμΈνμΈμ. λν λΈλΌμ°μ μ κ°λ°μ λꡬ μ€μ μμ μμ€ λ§΅ μ§μμ΄ νμ±νλμ΄ μλμ§ νμΈνμΈμ. - λΆμ νν μ€ λ²νΈ: μμ€ λ§΅μ΄ μλͺ»λ μ€ λ²νΈλ₯Ό νμνλ κ²½μ°, λΉλ λκ΅¬κ° μμ€ λ§΅μ μ¬λ°λ₯΄κ² μμ±νκ³ μλμ§ νμΈνμΈμ. λν Webpackμμ μ¬λ°λ₯Έ
devtoolμ΅μ μ μ¬μ©νκ³ μλμ§ νμΈνμΈμ. - μμ€ μ½λ λλ½: μμ€ λ§΅μ μλ³Έ μμ€ μ½λκ° λλ½λ κ²½μ°, λΉλ λκ΅¬κ° μμ€ λ§΅μ μμ€ μ½λλ₯Ό ν¬ν¨νλλ‘ κ΅¬μ±λμ΄ μλμ§ νμΈνμΈμ. Webpackμ μΌλΆ
devtoolμ΅μ μ μ±λ₯μμ μ΄μ λ‘ μμ€ μ½λλ₯Ό μλ΅ν©λλ€. - CORS λ¬Έμ : λ€λ₯Έ λλ©μΈμμ μμ€ λ§΅μ λ‘λνλ κ²½μ° CORS(Cross-Origin Resource Sharing) λ¬Έμ κ° λ°μν μ μμ΅λλ€. μλ²κ° μμ€ λ§΅μ λν κ΅μ°¨ μΆμ² μμ²μ νμ©νλλ‘ κ΅¬μ±λμ΄ μλμ§ νμΈνμΈμ.
- μΊμ± λ¬Έμ : λΈλΌμ°μ μΊμ±μ΄ λλλ‘ μμ€ λ§΅ λ‘λ©μ λ°©ν΄ν μ μμ΅λλ€. λΈλΌμ°μ μΊμλ₯Ό μ§μ°κ±°λ μΊμ λ²μ€ν (cache-busting) κΈ°μ μ μ¬μ©νμ¬ μ΅μ λ²μ μ μμ€ λ§΅μ΄ λ‘λλλλ‘ νμΈμ.
μμ€ λ§΅μ λ―Έλ
μμ€ λ§΅μ μ§ννλ κΈ°μ μ λλ€. μΉ κ°λ°μ΄ κ³μ λ°μ ν¨μ λ°λΌ μμ€ λ§΅μ λμ± μ κ΅νκ³ κ°λ ₯ν΄μ§ κ²μ λλ€.
λ―Έλ κ°λ°μ μ μ¬μ μΈ μμ μ€ νλλ μ»΄νμΌλ¬μ νΈλμ€νμΌλ¬κ° μννλ κ²κ³Ό κ°μ 볡μ‘ν μ½λ λ³ν λλ²κΉ μ λν μ§μ κ°μ μ λλ€. μ½λλ² μ΄μ€κ° μ μ λ 볡μ‘ν΄μ§μ λ°λΌ λ³νλ μ½λλ₯Ό μλ³Έ μμ€ μ½λλ‘ μ ννκ² λ§€ννλ κΈ°λ₯μ΄ λμ± μ€μν΄μ§ κ²μ λλ€.
λ λ€λ₯Έ μ μ¬μ μΈ κ°λ° μμμ λλ²κΉ λꡬ λ° μ€λ₯ λͺ¨λν°λ§ μλΉμ€μμ ν΅ν© κ°μ μ λλ€. μ΄λ¬ν λκ΅¬κ° λμ± μ κ΅ν΄μ§μ λ°λΌ μμ€ λ§΅μ νμ©νμ¬ μ½λμ λμμ λν ν¨μ¬ λ μμΈνκ³ μ€ν κ°λ₯ν ν΅μ°°λ ₯μ μ 곡ν μ μκ² λ κ²μ λλ€.
κ²°λ‘
JavaScript μμ€ λ§΅μ νλ μΉ κ°λ°μ νμμ μΈ λꡬμ λλ€. μ΄λ₯Ό ν΅ν΄ μ½λλ₯Ό ν¨μ¨μ μΌλ‘ λλ²κΉ νκ³ , μ€λ₯λ₯Ό ν¨κ³Όμ μΌλ‘ μΆμ νλ©°, λ³νλ μ½λκ° μλ³Έ μμ€ μ½λμ μ΄λ»κ² κ΄λ ¨λλμ§ μ΄ν΄ν μ μμ΅λλ€.
μμ€ λ§΅μ μλ λ°©μμ μ΄ν΄νκ³ μ΄ κ°μ΄λμμ μ€λͺ ν λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ μμ€ λ§΅μ νμ λ°ννκ³ κ°λ° μν¬νλ‘μ°λ₯Ό κ°μνν μ μμ΅λλ€. μμ€ λ§΅μ μ±ννλ κ²μ μ’μ μ΅κ΄μΌ λΏλ§ μλλΌ, μ€λλ μ 볡μ‘ν κ°λ° νκ²½μμ κ²¬κ³ νκ³ μ μ§λ³΄μ κ°λ₯νλ©° λλ²κΉ κ°λ₯ν μΉ μ ν리μΌμ΄μ μ ꡬμΆνκΈ° μν νμ μμμ λλ€. κ·Έλ¬λ λ°μ΄λ€μ΄ μ€ννκ³ μμ€ λ§΅ νμ© κΈ°μ μ λ§μ€ν°νμΈμ. λ―Έλμ λλ²κΉ μΈμ μ΄ λΉμ μκ² κ°μ¬ν κ²μ λλ€!