κ³ μ±λ₯ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ λΉλ°μ νμ΄λ³΄μΈμ. μ΄ μ’ ν© κ°μ΄λλ μ μΈκ³ κ°λ°μλ₯Ό μν΄ μ±λ₯ νλ‘νμΌλ§ λꡬλ₯Ό μ¬μ©ν V8 μμ§ μ΅μ ν κΈ°μ μ μ¬λ μκ² λ€λ£Ήλλ€.
μλ°μ€ν¬λ¦½νΈ μ±λ₯ νλ‘νμΌλ§: V8 μμ§ μ΅μ ν λ§μ€ν°νκΈ°
μ€λλ λΉ λ₯΄κ² λ³ννλ λμ§νΈ μΈμμμ κ³ μ±λ₯ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μ 곡νλ κ²μ μ¬μ©μ λ§μ‘±κ³Ό λΉμ¦λμ€ μ±κ³΅μ λ§€μ° μ€μν©λλ€. λ‘λ©μ΄ λλ¦° μΉμ¬μ΄νΈλ λ°μμ΄ μλ μ ν리μΌμ΄μ μ μ¬μ©μμ λΆλ§μ μΌκΈ°νκ³ μμ΅ μμ€λ‘ μ΄μ΄μ§ μ μμ΅λλ€. λ°λΌμ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό νλ‘νμΌλ§νκ³ μ΅μ ννλ λ°©λ²μ μ΄ν΄νλ κ²μ λͺ¨λ νλ κ°λ°μμκ² νμμ μΈ κΈ°μ μ λλ€. μ΄ κ°μ΄λλ Chrome, Node.js λ° κΈ°ν μΈκΈ° μλ νλ«νΌμμ μ¬μ©νλ V8 μμ§μ μ΄μ μ λ§μΆ° μλ°μ€ν¬λ¦½νΈ μ±λ₯ νλ‘νμΌλ§μ λν ν¬κ΄μ μΈ κ°μλ₯Ό μ 곡ν©λλ€. λ³λͺ© νμμ μλ³νκ³ , μ½λ ν¨μ¨μ±μ κ°μ νλ©°, κΆκ·Ήμ μΌλ‘ μ μΈκ³ μ¬μ©μλ₯Ό μν΄ λ λΉ λ₯΄κ³ λ°μμ±μ΄ λ°μ΄λ μ ν리μΌμ΄μ μ λ§λλ λ€μν κΈ°μ κ³Ό λꡬλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
V8 μμ§ μ΄ν΄νκΈ°
V8μ ꡬκΈμ μ€νμμ€ κ³ μ±λ₯ μλ°μ€ν¬λ¦½νΈ λ° μΉμ΄μ λΈλ¦¬ μμ§μΌλ‘, C++λ‘ μμ±λμμ΅λλ€. μ΄λ Chrome, Node.js λ° Microsoft Edge, Brave, Operaμ κ°μ κΈ°ν ν¬λ‘λ―Έμ κΈ°λ° λΈλΌμ°μ μ ν΅μ¬μ λλ€. V8μ μν€ν μ²μ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ€ννλ λ°©μμ μ΄ν΄νλ κ²μ ν¨κ³Όμ μΈ μ±λ₯ μ΅μ νμ κΈ°λ³Έμ λλ€.
V8μ μ£Όμ κ΅¬μ± μμ:
- νμ(Parser): μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μΆμ ꡬ문 νΈλ¦¬(AST)λ‘ λ³νν©λλ€.
- μ΄κ·Έλμ (Ignition): ASTλ₯Ό μ€ννλ μΈν°ν리ν°μ λλ€. μ΄κ·Έλμ μ λ©λͺ¨λ¦¬ μ¬μ©λκ³Ό μμ μκ°μ μ€μ λλ€.
- ν°λ³΄ν¬(TurboFan): μμ£Ό μ€νλλ μ½λ(ν« μ½λ)λ₯Ό κ³ λλ‘ μ΅μ νλ λ¨Έμ μ½λλ‘ λ³ννλ μ΅μ ν μ»΄νμΌλ¬μ λλ€.
- κ°λΉμ§ 컬λ ν°(GC): λ μ΄μ μ¬μ©λμ§ μλ κ°μ²΄λ₯Ό νμνμ¬ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ κ΄λ¦¬ν©λλ€.
V8μ λ€μκ³Ό κ°μ λ€μν μ΅μ ν κΈ°μ μ μ¬μ©ν©λλ€:
- Just-In-Time (JIT) μ»΄νμΌ: λ°νμ μ€μ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ»΄νμΌνμ¬ μ€μ μ¬μ© ν¨ν΄μ κΈ°λ°ν λμ μ΅μ νλ₯Ό κ°λ₯νκ² ν©λλ€.
- μΈλΌμΈ μΊμ±(Inline Caching): μμ± μ κ·Ό κ²°κ³Όλ₯Ό μΊμνμ¬ λ°λ³΅μ μΈ μ‘°ν μ€λ²ν€λλ₯Ό μ€μ λλ€.
- νλ ν΄λμ€(Hidden Classes): V8μ κ°μ²΄μ ννλ₯Ό μΆμ νκΈ° μν΄ νλ ν΄λμ€λ₯Ό μμ±νμ¬ λ λΉ λ₯Έ μμ± μ κ·Όμ κ°λ₯νκ² ν©λλ€.
- κ°λΉμ§ 컬λ μ (Garbage Collection): λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκ³ μ±λ₯μ ν₯μμν€κΈ° μν΄ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ κ΄λ¦¬ν©λλ€.
μ±λ₯ νλ‘νμΌλ§μ μ€μμ±
μ±λ₯ νλ‘νμΌλ§μ μ½λ μ€νμ λΆμνμ¬ μ±λ₯ λ³λͺ© νμκ³Ό κ°μ μμμ μλ³νλ κ³Όμ μ λλ€. μ¬κΈ°μλ CPU μ¬μ©λ, λ©λͺ¨λ¦¬ ν λΉ, ν¨μ μ€ν μκ°μ λν λ°μ΄ν° μμ§μ΄ ν¬ν¨λ©λλ€. νλ‘νμΌλ§ μμ΄λ μ΅μ νκ° μ’ μ’ μΆμΈ‘μ κΈ°λ°νκ² λλλ°, μ΄λ λΉν¨μ¨μ μ΄κ³ ν¨κ³Όκ° μμ μ μμ΅λλ€. νλ‘νμΌλ§μ ν΅ν΄ μ±λ₯ λ¬Έμ λ₯Ό μΌμΌν€λ μ νν μ½λ λΌμΈμ μ°Ύμλ΄μ΄ κ°μ₯ ν° μν₯μ λ―ΈμΉ μ μλ λΆλΆμ μ΅μ ν λ Έλ ₯μ μ§μ€ν μ μμ΅λλ€.
μΉ μ ν리μΌμ΄μ μ λ‘λ© μκ°μ΄ λλ¦° μλ리μ€λ₯Ό μκ°ν΄ λ΄ μλ€. νλ‘νμΌλ§ μμ΄λ κ°λ°μλ€μ΄ μλ°μ€ν¬λ¦½νΈ νμΌ μΆμλ μ΄λ―Έμ§ μ΅μ νμ κ°μ λ€μν μΌλ°μ μΈ μ΅μ νλ₯Ό μλν μ μμ΅λλ€. νμ§λ§ νλ‘νμΌλ§μ ν΅ν΄ μ£Όλ λ³λͺ© νμμ΄ ν μ΄λΈμ λ°μ΄ν°λ₯Ό νμνλ λ° μ¬μ©λλ μ΅μ νλμ§ μμ μ λ ¬ μκ³ λ¦¬μ¦μ΄λΌλ κ²μ λ°κ²¬ν μ μμ΅λλ€. μ΄ νΉμ μκ³ λ¦¬μ¦ μ΅μ νμ μ§μ€ν¨μΌλ‘μ¨ κ°λ°μλ€μ μ ν리μΌμ΄μ μ μ±λ₯μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.
μλ°μ€ν¬λ¦½νΈ μ±λ₯ νλ‘νμΌλ§ λꡬ
λ€μν νκ²½μμ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό νλ‘νμΌλ§ν μ μλ μ¬λ¬ κ°λ ₯ν λκ΅¬κ° μμ΅λλ€:
1. Chrome κ°λ°μ λꡬ μ±λ₯ ν¨λ
Chrome κ°λ°μ λꡬ μ±λ₯ ν¨λμ Chrome λΈλΌμ°μ μ λ΄μ₯λ λꡬλ‘, μΉμ¬μ΄νΈμ μ±λ₯μ λν ν¬κ΄μ μΈ λ·°λ₯Ό μ 곡ν©λλ€. μ΄λ₯Ό ν΅ν΄ CPU μ¬μ©λ, λ©λͺ¨λ¦¬ ν λΉ, κ°λΉμ§ 컬λ μ μ΄λ²€νΈλ₯Ό ν¬ν¨ν μ ν리μΌμ΄μ νλμ νμλΌμΈμ κΈ°λ‘ν μ μμ΅λλ€.
Chrome κ°λ°μ λꡬ μ±λ₯ ν¨λ μ¬μ© λ°©λ²:
F12
λ₯Ό λλ₯΄κ±°λ νμ΄μ§λ₯Ό λ§μ°μ€ μ€λ₯Έμͺ½ λ²νΌμΌλ‘ ν΄λ¦νκ³ "κ²μ¬"λ₯Ό μ ννμ¬ Chrome κ°λ°μ λꡬλ₯Ό μ½λλ€.- "Performance" ν¨λλ‘ μ΄λν©λλ€.
- "Record" λ²νΌ(μν μμ΄μ½)μ ν΄λ¦νμ¬ κΈ°λ‘μ μμν©λλ€.
- νλ‘νμΌλ§νλ €λ μ½λλ₯Ό νΈλ¦¬κ±°νκΈ° μν΄ μΉμ¬μ΄νΈμ μνΈμμ©ν©λλ€.
- "Stop" λ²νΌμ ν΄λ¦νμ¬ κΈ°λ‘μ μ€μ§ν©λλ€.
- μμ±λ νμλΌμΈμ λΆμνμ¬ μ±λ₯ λ³λͺ© νμμ μλ³ν©λλ€.
μ±λ₯ ν¨λμ κΈ°λ‘λ λ°μ΄ν°λ₯Ό λΆμνκΈ° μν λ€μν λ·°λ₯Ό μ 곡ν©λλ€:
- νλ μ μ°¨νΈ(Flame Chart): ν¨μμ νΈμΆ μ€νκ³Ό μ€ν μκ°μ μκ°νν©λλ€.
- λ°ν μ (Bottom-Up): λͺ¨λ νΈμΆμ κ±Έμ³ κ°μ₯ λ§μ μκ°μ μλΉν ν¨μλ₯Ό μ§κ³νμ¬ λ³΄μ¬μ€λλ€.
- μ½ νΈλ¦¬(Call Tree): μ΄λ€ ν¨μκ° λ€λ₯Έ ν¨μλ₯Ό νΈμΆνλμ§ λ³΄μ¬μ£Όλ νΈμΆ κ³μΈ΅ ꡬ쑰λ₯Ό νμν©λλ€.
- μ΄λ²€νΈ λ‘κ·Έ(Event Log): ν¨μ νΈμΆ, κ°λΉμ§ 컬λ μ μ΄λ²€νΈ, DOM μ λ°μ΄νΈ λ± κΈ°λ‘ μ€μ λ°μν λͺ¨λ μ΄λ²€νΈλ₯Ό λμ΄ν©λλ€.
2. Node.js νλ‘νμΌλ§ λꡬ
Node.js μ ν리μΌμ΄μ μ νλ‘νμΌλ§νκΈ° μν μ¬λ¬ λκ΅¬κ° μμ΅λλ€:
- Node.js μΈμ€νν°: μ½λλ₯Ό λ¨κ³λ³λ‘ μ€ννκ³ , μ€λ¨μ μ μ€μ νκ³ , λ³μλ₯Ό κ²μ¬ν μ μλ λ΄μ₯ λλ²κ±°μ λλ€.
- v8-profiler-next: V8 νλ‘νμΌλ¬μ μ κ·Όν μ μκ² ν΄μ£Όλ Node.js λͺ¨λμ λλ€.
- Clinic.js: Node.js μ ν리μΌμ΄μ μ μ±λ₯ λ¬Έμ λ₯Ό μ§λ¨νκ³ μμ νκΈ° μν λꡬ λͺ¨μμ λλ€.
v8-profiler-next μ¬μ©νκΈ°:
v8-profiler-next
λͺ¨λ μ€μΉ:npm install v8-profiler-next
- μ½λμμ λͺ¨λ λΆλ¬μ€κΈ°:
const profiler = require('v8-profiler-next');
- νλ‘νμΌλ¬ μμ:
profiler.startProfiling('MyProfile', true);
- νλ‘νμΌλ¬ μ€μ§ λ° νλ‘ν μ μ₯:
const profile = profiler.stopProfiling('MyProfile'); profile.export().pipe(fs.createWriteStream('profile.cpuprofile')).on('finish', () => profile.delete());
- μμ±λ
.cpuprofile
νμΌμ Chrome κ°λ°μ λꡬμ λ‘λνμ¬ λΆμν©λλ€.
3. WebPageTest
WebPageTestλ μ μΈκ³ λ€μν μμΉμμ μΉμ¬μ΄νΈ μ±λ₯μ ν μ€νΈνκΈ° μν κ°λ ₯ν μ¨λΌμΈ λꡬμ λλ€. λ‘λ μκ°, 첫 λ°μ΄νΈκΉμ§μ μκ°(TTFB), λ λλ§ μ°¨λ¨ λ¦¬μμ€ λ± μμΈν μ±λ₯ μ§νλ₯Ό μ 곡ν©λλ€. λν νμ΄μ§ λ‘λ© κ³Όμ μ νλ¦μ€νΈλ¦½κ³Ό λΉλμ€λ₯Ό μ 곡νμ¬ μκ°μ μΌλ‘ μ±λ₯ λ³λͺ© νμμ μλ³ν μ μκ² ν΄μ€λλ€.
WebPageTestλ λ€μκ³Ό κ°μ λ¬Έμ λ₯Ό μλ³νλ λ° μ¬μ©ν μ μμ΅λλ€:
- λλ¦° μλ² μλ΅ μκ°
- μ΅μ νλμ§ μμ μ΄λ―Έμ§
- λ λλ§μ μ°¨λ¨νλ μλ°μ€ν¬λ¦½νΈ λ° CSS
- νμ΄μ§ μλλ₯Ό μ νμν€λ νμ¬ μ€ν¬λ¦½νΈ
4. Lighthouse
Lighthouseλ μΉ νμ΄μ§μ νμ§μ κ°μ νκΈ° μν μ€ν μμ€ μλν λꡬμ λλ€. κ³΅κ° νμ΄μ§λ μΈμ¦μ΄ νμν λͺ¨λ μΉ νμ΄μ§μ λν΄ μ€νν μ μμ΅λλ€. μ±λ₯, μ κ·Όμ±, νλ‘κ·Έλ μλΈ μΉ μ±, SEO λ±μ λν κ°μ¬λ₯Ό μ 곡ν©λλ€.
Lighthouseλ Chrome κ°λ°μ λꡬ, λͺ λ Ήμ€ λλ Node λͺ¨λλ‘ μ€νν μ μμ΅λλ€. Lighthouseμ κ°μ¬ν URLμ μ 곡νλ©΄ νμ΄μ§μ λν΄ μΌλ ¨μ κ°μ¬λ₯Ό μ€νν λ€μ νμ΄μ§μ μ±κ³Όμ λν λ³΄κ³ μλ₯Ό μμ±ν©λλ€. μ¬κΈ°μμ μ€ν¨ν κ°μ¬λ₯Ό νμ΄μ§ κ°μ λ°©λ²μ λν μ§νλ‘ μ¬μ©ν©λλ€.
μΌλ°μ μΈ μ±λ₯ λ³λͺ© νμκ³Ό μ΅μ ν κΈ°λ²
μΌλ°μ μΈ μ±λ₯ λ³λͺ© νμμ μλ³νκ³ ν΄κ²°νλ κ²μ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό μ΅μ ννλ λ° λ§€μ° μ€μν©λλ€. λ€μμ λͺ κ°μ§ μΌλ°μ μΈ λ¬Έμ μ μ΄λ₯Ό ν΄κ²°νκΈ° μν κΈ°λ²μ λλ€:
1. κ³Όλν DOM μ‘°μ
DOM μ‘°μμ νΉν λΉλ²νκ² λλ ν° DOM νΈλ¦¬μμ μνλ λ μλΉν μ±λ₯ λ³λͺ© νμμ μ λ°ν μ μμ΅λλ€. κ° DOM μ‘°μ μμ μ 리νλ‘μ°(reflow)μ 리νμΈνΈ(repaint)λ₯Ό νΈλ¦¬κ±°νλ©°, μ΄λ κ³μ° λΉμ©μ΄ λ§μ΄ λ€ μ μμ΅λλ€.
μ΅μ ν κΈ°λ²:
- DOM μ λ°μ΄νΈ μ΅μν: DOM μ λ°μ΄νΈλ₯Ό μΌκ΄ μ²λ¦¬νμ¬ λ¦¬νλ‘μ°μ 리νμΈνΈ νμλ₯Ό μ€μ λλ€.
- Document Fragment μ¬μ©: Document Fragmentλ₯Ό μ¬μ©νμ¬ λ©λͺ¨λ¦¬μμ DOM μμλ₯Ό μμ±ν λ€μ, μ΄ νλκ·Έλ¨ΌνΈλ₯Ό DOMμ μΆκ°ν©λλ€.
- DOM μμ μΊμ±: μμ£Ό μ¬μ©λλ DOM μμμ λν μ°Έμ‘°λ₯Ό λ³μμ μ μ₯νμ¬ λ°λ³΅μ μΈ μ‘°νλ₯Ό νΌν©λλ€.
- κ°μ DOM μ¬μ©: React, Vue.js, Angularμ κ°μ νλ μμν¬λ κ°μ DOMμ μ¬μ©νμ¬ μ§μ μ μΈ DOM μ‘°μμ μ΅μνν©λλ€.
μμ:
DOMμ μμλ₯Ό νλμ© μΆκ°νλ λμ :
const list = document.getElementById('myList');
for (let i = 0; i < 1000; i++) {
const item = document.createElement('li');
item.textContent = `νλͺ© ${i}`;
list.appendChild(item);
}
Document Fragmentλ₯Ό μ¬μ©νμΈμ:
const list = document.getElementById('myList');
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
const item = document.createElement('li');
item.textContent = `νλͺ© ${i}`;
fragment.appendChild(item);
}
list.appendChild(fragment);
2. λΉν¨μ¨μ μΈ λ£¨νμ μκ³ λ¦¬μ¦
λΉν¨μ¨μ μΈ λ£¨νμ μκ³ λ¦¬μ¦μ νΉν λμ©λ λ°μ΄ν°μ μ λ€λ£° λ μ±λ₯μ ν° μν₯μ λ―ΈμΉ μ μμ΅λλ€.
μ΅μ ν κΈ°λ²:
- μ¬λ°λ₯Έ μλ£ κ΅¬μ‘° μ¬μ©: νμμ λ§λ μ μ ν μλ£ κ΅¬μ‘°λ₯Ό μ νν©λλ€. μλ₯Ό λ€μ΄, λΉ λ₯Έ λ©€λ²μ νμΈμ μν΄ Setμ μ¬μ©νκ±°λ ν¨μ¨μ μΈ ν€-κ° μ‘°νλ₯Ό μν΄ Mapμ μ¬μ©ν©λλ€.
- 루ν 쑰건 μ΅μ ν: 루ν 쑰건μμ λΆνμν κ³μ°μ νΌν©λλ€.
- 루ν λ΄ ν¨μ νΈμΆ μ΅μν: ν¨μ νΈμΆμλ μ€λ²ν€λκ° μμ΅λλ€. κ°λ₯νλ€λ©΄ 루ν λ°μμ κ³μ°μ μνν©λλ€.
- λ΄μ₯ λ©μλ μ¬μ©: μ’
μ’
κ³ λλ‘ μ΅μ νλ
map
,filter
,reduce
μ κ°μ λ΄μ₯ μλ°μ€ν¬λ¦½νΈ λ©μλλ₯Ό νμ©ν©λλ€. - μΉ μ컀(Web Workers) μ¬μ© κ³ λ €: κ³μ° μ§μ½μ μΈ μμ μ μΉ μ컀μ μ€νλ‘λνμ¬ λ©μΈ μ€λ λ μ°¨λ¨μ λ°©μ§ν©λλ€.
μμ:
for
루νλ₯Ό μ¬μ©νμ¬ λ°°μ΄μ μννλ λμ :
const arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
console.log(arr[i]);
}
forEach
λ©μλλ₯Ό μ¬μ©νμΈμ:
const arr = [1, 2, 3, 4, 5];
arr.forEach(item => console.log(item));
3. λ©λͺ¨λ¦¬ λμ
λ©λͺ¨λ¦¬ λμλ μλ°μ€ν¬λ¦½νΈ μ½λκ° λ μ΄μ νμνμ§ μμ κ°μ²΄μ λν μ°Έμ‘°λ₯Ό μ μ§νμ¬ κ°λΉμ§ 컬λ ν°κ° ν΄λΉ λ©λͺ¨λ¦¬λ₯Ό νμνμ§ λͺ»νκ² ν λ λ°μν©λλ€. μ΄λ λ©λͺ¨λ¦¬ μλΉ μ¦κ°λ‘ μ΄μ΄μ Έ κ²°κ΅ μ±λ₯μ μ νμν¬ μ μμ΅λλ€.
λ©λͺ¨λ¦¬ λμμ μΌλ°μ μΈ μμΈ:
- μ μ λ³μ: μ ν리μΌμ΄μ μλͺ λ΄λ΄ μ§μλλ―λ‘ λΆνμν μ μ λ³μ μμ±μ νΌν©λλ€.
- ν΄λ‘μ : ν΄λ‘μ λ μ£Όλ³ μ€μ½νμ λ³μμ λν μ°Έμ‘°λ₯Ό μλμΉ μκ² μ μ§ν μ μμΌλ―λ‘ μ£Όμν΄μΌ ν©λλ€.
- μ΄λ²€νΈ 리μ€λ: λ μ΄μ νμνμ§ μμ μ΄λ²€νΈ 리μ€λλ λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νκΈ° μν΄ μ κ±°ν©λλ€.
- λΆλ¦¬λ DOM μμ: DOM νΈλ¦¬μμ μ κ±°λ DOM μμμ λν μ°Έμ‘°λ₯Ό μ κ±°ν©λλ€.
λ©λͺ¨λ¦¬ λμ κ°μ§ λꡬ:
- Chrome κ°λ°μ λꡬ λ©λͺ¨λ¦¬ ν¨λ: λ©λͺ¨λ¦¬ ν¨λμ μ¬μ©νμ¬ ν μ€λ μ·μ μ°κ³ λ©λͺ¨λ¦¬ λμλ₯Ό μλ³ν©λλ€.
- Node.js λ©λͺ¨λ¦¬ νλ‘νμΌλ¬:
heapdump
μ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ Node.js μ ν리μΌμ΄μ μ ν μ€λ μ·μ λΆμν©λλ€.
4. λμ©λ μ΄λ―Έμ§μ μ΅μ νλμ§ μμ μμ°
λμ©λ μ΄λ―Έμ§μ μ΅μ νλμ§ μμ μμ°μ νΉν μΈν°λ· μ°κ²°μ΄ λλ¦° μ¬μ©μμκ² νμ΄μ§ λ‘λ μκ°μ ν¬κ² μ¦κ°μν¬ μ μμ΅λλ€.
μ΅μ ν κΈ°λ²:
- μ΄λ―Έμ§ μ΅μ ν: ImageOptimμ΄λ TinyPNGμ κ°μ λꡬλ₯Ό μ¬μ©νμ¬ νμ§ μ ν μμ΄ νμΌ ν¬κΈ°λ₯Ό μ€μ΄κΈ° μν΄ μ΄λ―Έμ§λ₯Ό μμΆν©λλ€.
- μ μ ν μ΄λ―Έμ§ νμ μ¬μ©: νμμ λ§λ μ μ ν μ΄λ―Έμ§ νμμ μ νν©λλ€. μ¬μ§μλ JPEGλ₯Ό, ν¬λͺ λκ° μλ κ·Έλν½μλ PNGλ₯Ό μ¬μ©ν©λλ€. μ°μν μμΆλ₯ κ³Ό νμ§μ μν΄ WebP μ¬μ©μ κ³ λ €ν©λλ€.
- λ°μν μ΄λ―Έμ§ μ¬μ©:
<picture>
μμλsrcset
μμ±μ μ¬μ©νμ¬ μ¬μ©μμ μ₯μΉμ νλ©΄ ν΄μλμ λ°λΌ λ€λ₯Έ ν¬κΈ°μ μ΄λ―Έμ§λ₯Ό μ 곡ν©λλ€. - μ΄λ―Έμ§ μ§μ° λ‘λ©(Lazy loading):
loading="lazy"
μμ±μ μ¬μ©νμ¬ λ·°ν¬νΈμ λ³΄μΌ λλ§ μ΄λ―Έμ§λ₯Ό λ‘λν©λλ€. - μλ°μ€ν¬λ¦½νΈ λ° CSS νμΌ μΆμ: μλ°μ€ν¬λ¦½νΈ λ° CSS νμΌμμ λΆνμν 곡백과 μ£Όμμ μ κ±°νμ¬ νμΌ ν¬κΈ°λ₯Ό μ€μ λλ€.
- Gzip μμΆ: μλ²μμ Gzip μμΆμ νμ±ννμ¬ ν μ€νΈ κΈ°λ° μμ°μ λΈλΌμ°μ λ‘ λ³΄λ΄κΈ° μ μ μμΆν©λλ€.
5. λ λλ§ μ°¨λ¨ λ¦¬μμ€
μλ°μ€ν¬λ¦½νΈ λ° CSS νμΌκ³Ό κ°μ λ λλ§ μ°¨λ¨ λ¦¬μμ€λ λ€μ΄λ‘λλκ³ νμ±λ λκΉμ§ λΈλΌμ°μ κ° νμ΄μ§λ₯Ό λ λλ§νλ κ²μ λ§μ μ μμ΅λλ€.
μ΅μ ν κΈ°λ²:
- μ€μνμ§ μμ μλ°μ€ν¬λ¦½νΈ λ‘λ© μ§μ°:
defer
λλasync
μμ±μ μ¬μ©νμ¬ λ λλ§μ μ°¨λ¨νμ§ μκ³ μ€μνμ§ μμ μλ°μ€ν¬λ¦½νΈ νμΌμ λ°±κ·ΈλΌμ΄λμμ λ‘λν©λλ€. - μ€μ CSS μΈλΌμ΄λ: μ΄κΈ° λ·°ν¬νΈ μ½ν μΈ λ₯Ό λ λλ§νλ λ° νμν CSSλ₯Ό μΈλΌμΈνμ¬ λ λλ§ μ°¨λ¨μ νΌν©λλ€.
- CSS λ° μλ°μ€ν¬λ¦½νΈ νμΌ μΆμ λ° μ°κ²°: CSS λ° μλ°μ€ν¬λ¦½νΈ νμΌμ μ°κ²°νμ¬ HTTP μμ² μλ₯Ό μ€μ λλ€.
- μ½ν μΈ μ μ‘ λ€νΈμν¬(CDN) μ¬μ©: CDNμ μ¬μ©νμ¬ μ μΈκ³ μ¬λ¬ μλ²μ μμ°μ λ°°ν¬νμ¬ λ€λ₯Έ μ§λ¦¬μ μμΉμ μ¬μ©μλ₯Ό μν λ‘λ μκ°μ κ°μ ν©λλ€.
κ³ κΈ V8 μ΅μ ν κΈ°λ²
μΌλ°μ μΈ μ΅μ ν κΈ°λ² μΈμλ μ±λ₯μ λμ± ν₯μμν¬ μ μλ V8 μμ§μ νΉνλ κ³ κΈ κΈ°λ²λ€μ΄ μμ΅λλ€.
1. νλ ν΄λμ€(Hidden Classes) μ΄ν΄νκΈ°
V8μ μμ± μ κ·Όμ μ΅μ ννκΈ° μν΄ νλ ν΄λμ€λ₯Ό μ¬μ©ν©λλ€. κ°μ²΄λ₯Ό μμ±νλ©΄ V8μ κ°μ²΄μ μμ±κ³Ό κ·Έ μ νμ μ€λͺ νλ νλ ν΄λμ€λ₯Ό μμ±ν©λλ€. λμΌν μμ±κ³Ό μ νμ κ°μ§ νμ κ°μ²΄λ€μ λμΌν νλ ν΄λμ€λ₯Ό 곡μ ν μ μμ΄ V8μ΄ μμ± μ κ·Όμ μ΅μ νν μ μκ² ν©λλ€. κ°μ²΄λ₯Ό λμΌν μμλ‘ λμΌν λͺ¨μμΌλ‘ μμ±νλ©΄ μ±λ₯μ΄ ν₯μλ©λλ€.
μ΅μ ν κΈ°λ²:
- κ°μ²΄ μμ±μ λμΌν μμλ‘ μ΄κΈ°ν: λμΌν νλ ν΄λμ€λ₯Ό 곡μ νλλ‘ λμΌν μμ±μ κ°μ§ κ°μ²΄λ₯Ό λμΌν μμλ‘ μμ±ν©λλ€.
- λμ μΌλ‘ μμ± μΆκ° νΌνκΈ°: λμ μΌλ‘ μμ±μ μΆκ°νλ©΄ νλ ν΄λμ€κ° λ³κ²½λκ³ μ΅μ νκ° ν΄μ λ μ μμ΅λλ€.
μμ:
λ€λ₯Έ μμ± μμλ‘ κ°μ²΄λ₯Ό μμ±νλ λμ :
const obj1 = { x: 1, y: 2 };
const obj2 = { y: 2, x: 1 };
λμΌν μμ± μμλ‘ κ°μ²΄λ₯Ό μμ±νμΈμ:
const obj1 = { x: 1, y: 2 };
const obj2 = { x: 3, y: 4 };
2. ν¨μ νΈμΆ μ΅μ ν
ν¨μ νΈμΆμλ μ€λ²ν€λκ° μμΌλ―λ‘ ν¨μ νΈμΆ νμλ₯Ό μ΅μννλ©΄ μ±λ₯μ ν₯μμν¬ μ μμ΅λλ€.
μ΅μ ν κΈ°λ²:
- ν¨μ μΈλΌμ΄λ: μμ ν¨μλ₯Ό μΈλΌμΈνμ¬ ν¨μ νΈμΆμ μ€λ²ν€λλ₯Ό νΌν©λλ€.
- λ©λͺ¨μ΄μ μ΄μ (Memoization): λΉμ©μ΄ λ§μ΄ λλ ν¨μ νΈμΆ κ²°κ³Όλ₯Ό μΊμνμ¬ λ€μ κ³μ°νλ κ²μ νΌν©λλ€.
- λλ°μ΄μ±(Debouncing) λ° μ€λ‘νλ§(Throttling): νΉν μ€ν¬λ‘€μ΄λ ν¬κΈ° μ‘°μ κ³Ό κ°μ μ¬μ©μ μ΄λ²€νΈμ λν μλ΅μΌλ‘ ν¨μκ° νΈμΆλλ λΉμ¨μ μ νν©λλ€.
3. κ°λΉμ§ 컬λ μ (Garbage Collection) μ΄ν΄νκΈ°
V8μ κ°λΉμ§ 컬λ ν°λ λ μ΄μ μ¬μ©λμ§ μλ λ©λͺ¨λ¦¬λ₯Ό μλμΌλ‘ νμν©λλ€. κ·Έλ¬λ κ³Όλν κ°λΉμ§ 컬λ μ μ μ±λ₯μ μν₯μ μ€ μ μμ΅λλ€.
μ΅μ ν κΈ°λ²:
- κ°μ²΄ μμ± μ΅μν: μμ±λλ κ°μ²΄ μλ₯Ό μ€μ¬ κ°λΉμ§ 컬λ ν°μ μμ λμ μ΅μνν©λλ€.
- κ°μ²΄ μ¬μ¬μ©: μ κ°μ²΄λ₯Ό λ§λλ λμ κΈ°μ‘΄ κ°μ²΄λ₯Ό μ¬μ¬μ©ν©λλ€.
- μμ κ°μ²΄ μμ± νΌνκΈ°: μ§§μ κΈ°κ° λμλ§ μ¬μ©λλ μμ κ°μ²΄ μμ±μ νΌν©λλ€.
- ν΄λ‘μ μ£Όμ: ν΄λ‘μ λ κ°μ²΄μ λν μ°Έμ‘°λ₯Ό μ μ§νμ¬ κ°λΉμ§ 컬λ μ λλ κ²μ λ§μ μ μμ΅λλ€.
λ²€μΉλ§νΉκ³Ό μ§μμ μΈ λͺ¨λν°λ§
μ±λ₯ μ΅μ νλ μ§μμ μΈ κ³Όμ μ λλ€. λ³κ²½ μ νμ μ½λλ₯Ό λ²€μΉλ§νΉνμ¬ μ΅μ νμ μν₯μ μΈ‘μ νλ κ²μ΄ μ€μν©λλ€. νλ‘λμ νκ²½μμ μ ν리μΌμ΄μ μ μ±λ₯μ μ§μμ μΌλ‘ λͺ¨λν°λ§νλ κ²λ μλ‘μ΄ λ³λͺ© νμμ μλ³νκ³ μ΅μ νκ° ν¨κ³Όμ μΈμ§ νμΈνλ λ° λ§€μ° μ€μν©λλ€.
λ²€μΉλ§νΉ λꡬ:
- jsPerf: μλ°μ€ν¬λ¦½νΈ λ²€μΉλ§ν¬λ₯Ό μμ±νκ³ μ€ννκΈ° μν μΉμ¬μ΄νΈμ λλ€.
- Benchmark.js: μλ°μ€ν¬λ¦½νΈ λ²€μΉλ§νΉ λΌμ΄λΈλ¬λ¦¬μ λλ€.
λͺ¨λν°λ§ λꡬ:
- Google Analytics: νμ΄μ§ λ‘λ μκ° λ° μνΈμμ© μκ°κ³Ό κ°μ μΉμ¬μ΄νΈ μ±λ₯ μ§νλ₯Ό μΆμ ν©λλ€.
- New Relic: ν¬κ΄μ μΈ μ ν리μΌμ΄μ μ±λ₯ λͺ¨λν°λ§(APM) λꡬμ λλ€.
- Sentry: μ€λ₯ μΆμ λ° μ±λ₯ λͺ¨λν°λ§ λꡬμ λλ€.
κ΅μ ν(i18n) λ° νμ§ν(l10n) κ³ λ €μ¬ν
μ μΈκ³ μ¬μ©μλ₯Ό λμμΌλ‘ μ ν리μΌμ΄μ μ κ°λ°ν λλ κ΅μ ν(i18n)μ νμ§ν(l10n)λ₯Ό κ³ λ €νλ κ²μ΄ νμμ μ λλ€. μλͺ» ꡬνλ i18n/l10nμ μ±λ₯μ λΆμ μ μΈ μν₯μ λ―ΈμΉ μ μμ΅λλ€.
μ±λ₯ κ³ λ €μ¬ν:
- λ²μ μ§μ° λ‘λ©: νμν λλ§ λ²μμ λ‘λν©λλ€.
- ν¨μ¨μ μΈ λ²μ λΌμ΄λΈλ¬λ¦¬ μ¬μ©: μ±λ₯μ μ΅μ νλ λ²μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ νν©λλ€.
- λ²μ μΊμ±: μμ£Ό μ¬μ©λλ λ²μμ μΊμνμ¬ λ°λ³΅μ μΈ μ‘°νλ₯Ό νΌν©λλ€.
- λ μ§ λ° μ«μ νμ μ΅μ ν: λ€λ₯Έ λ‘μΌμΌμ μ΅μ νλ ν¨μ¨μ μΈ λ μ§ λ° μ«μ νμ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν©λλ€.
μμ:
λͺ¨λ λ²μμ ν λ²μ λ‘λνλ λμ :
const translations = {
en: { greeting: 'Hello' },
fr: { greeting: 'Bonjour' },
es: { greeting: 'Hola' },
};
νμμ λ°λΌ λ²μμ λ‘λνμΈμ:
async function loadTranslations(locale) {
const response = await fetch(`/translations/${locale}.json`);
const translations = await response.json();
return translations;
}
κ²°λ‘
μλ°μ€ν¬λ¦½νΈ μ±λ₯ νλ‘νμΌλ§κ³Ό V8 μμ§ μ΅μ νλ μ μΈκ³ μ¬μ©μμκ² νλ₯ν μ¬μ©μ κ²½νμ μ 곡νλ κ³ μ±λ₯ μΉ μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νμμ μΈ κΈ°μ μ λλ€. V8 μμ§μ μ΄ν΄νκ³ , νλ‘νμΌλ§ λꡬλ₯Ό νμ©νλ©°, μΌλ°μ μΈ μ±λ₯ λ³λͺ© νμμ ν΄κ²°ν¨μΌλ‘μ¨ λ λΉ λ₯΄κ³ , λ°μμ±μ΄ λ°μ΄λλ©°, λ ν¨μ¨μ μΈ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό λ§λ€ μ μμ΅λλ€. μ΅μ νλ μ§μμ μΈ κ³Όμ μ΄λ©°, μ΅μ μ μ±λ₯μ μ μ§νκΈ° μν΄μλ μ§μμ μΈ λͺ¨λν°λ§κ³Ό λ²€μΉλ§νΉμ΄ μ€μνλ€λ κ²μ κΈ°μ΅νμμμ€. μ΄ κ°μ΄λμμ μ€λͺ ν κΈ°μ κ³Ό μμΉμ μ μ©ν¨μΌλ‘μ¨ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ μ±λ₯μ ν¬κ² ν₯μμν€κ³ μ μΈκ³ μ¬μ©μμκ² μ°μν μ¬μ©μ κ²½νμ μ 곡ν μ μμ΅λλ€.
μ§μμ μΌλ‘ μ½λλ₯Ό νλ‘νμΌλ§, λ²€μΉλ§νΉ λ° κ°μ ν¨μΌλ‘μ¨ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ΄ κΈ°λ₯μ μΌ λΏλ§ μλλΌ μ±λ₯λ λ°μ΄λ μ μΈκ³ μ¬μ©μμκ² μνν κ²½νμ μ 곡νλλ‘ λ³΄μ₯ν μ μμ΅λλ€. μ΄λ¬ν κ΄νμ μμ©νλ©΄ λ ν¨μ¨μ μΈ μ½λ, λ λΉ λ₯Έ λ‘λ© μκ°, κ·Έλ¦¬κ³ κΆκ·Ήμ μΌλ‘ λ ν볡ν μ¬μ©μλ‘ μ΄μ΄μ§ κ²μ λλ€.