π Chapter 1: μ λ¬Έμλ₯Ό μν μ§μ
리μ‘νΈλ μ νμνκ°μ?β
νλ§λλ‘ μ λ°μ΄νΈ λλ¬Έμ λλ€.
μΉμ κΈ°λ₯μ΄ λλ©΄μ μΉμμ μ°μν μ¬μ©μ κ²½νμ μ 곡νλ €λ ν¬λΆλ 컀μ‘μ΅λλ€.
μ νμ΄μ§κ° λ λλ§λκ³ λ‘λ©λκΈ°κΉμ§ κΈ°λ€λ¦΄ νμ μμ΄, μ¦μ μ
λ°μ΄νΈλμ΄ λ΄μ©μ λ°λ‘ νμΈνκ³ μΆμ΄ νμ΅λλ€. μΉκ³Ό μΉ νμ΄μ§κ° 'μ¦κ°μ μΈ' λλμ μ£ΌκΈΈ μνμ΅λλ€. κ·Έλ¬λ μ¦κ°μ μΈ μ
λ°μ΄νΈλ₯Ό λκ·λͺ¨λ‘ μννκΈ°μλ λ€μκ³Ό κ°μ μ΄μ― μλΉν μ΄λ €μ μ΅λλ€.
- μ±λ₯
- μΉ νμ΄μ§λ₯Ό μ λ°μ΄νΈνλ©΄ λ³΄ν΅ λΈλΌμ°μ κ° νμ΄μ§μ λ μ΄μμμ λ€μ κ³μ°νκ³ (μ΄λ₯Ό 리νλ‘λΌκ³ ν©λλ€) 그리λ μμ μ μννκΈ° λλ¬Έμ μ±λ λ³λͺ© νμμ΄ μμ£Ό λ°μνμ΅λλ€.
- μ λ’°μ±
- νλΆν μΉ κ²½ν μ λ°μμ μνλ₯Ό μΆμ ν΄ μΌκ΄λκΈ° μ μ§νκΈ°κ° μ΄λ €μ μ΅λλ€. μνλ₯Ό μ¬λ¬ κ³³μμ μΆμ ν΄ λͺ¨λ κ³³μμ μΌκ΄λκ² μ μ§ν΄μΌ νκΈ° λλ¬Έμ λλ€.
- 보μ
- ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) λ° ν¬λ‘μ€ μ¬μ΄νΈ μμ² μμ‘°(CSRF) κ°μ μ μ©μ λ°©μ§νκΈ° μν΄ νμ΄μ§μ μ½μ νλ HTMLκ³Ό μλ°μ€ν¬λ¦½νΈλ₯Ό λͺ¨λ μλ ν΄μΌλ§(sanitize) νμ΅λλ€.
리μ‘νΈ μ΄μ μ μΈκ³β
μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ DOM APIμ μ κ·Όν μ μμ΅λλ€.
μκ°μ΄ μ§λ μ΄λ° μμΌλ‘ νμ₯νλ €λ μ ν리μΌμ΄μ
μ ꡬμΆν λ λ°λͺ©μ μ‘λ μμκ° μμ΅λλ€.
- μ€λ₯κ° μ½κ² μκΈ΄λ€
- μμΈ‘μ΄ λΆκ°νλ€
- λΉν¨μ¨μ μ΄λ€
jQuery, Backbone.js, Knockout, Angular.js, etc.
리μ‘νΈ λ±μ₯β
리μ‘νΈκ° μ μν ν΅μ¬ μμ΄λμ΄ νλλ μ»΄ν¬λνΈ κΈ°λ° μν€ν
μ³μμ΅λλ€.
μΉμ λΉλ‘―ν μ¬λ¬ νλ«νΌμμ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μμ±ν λ μ¬μ¬μ© κ°λ₯ν μ»΄ν¬λνΈλ₯Ό μ‘°ν©νλ κ²μ΄ κ°μ₯ μ΅μ νλ λ°©λ²μ
λλ€.
리μ‘νΈλ λ¨λ°©ν₯ λ°μ΄ν° νλ¦ ν¨ν΄μ λμ
ν΄ κ°λ°μκ° μ ν리μΌμ΄μ
μ λ μ μ μ΄νκ³ μκ°μ λ°λΌ λ°μ΄ν°κ° μ΄λ»κ² λ³ννλμ§ λ μ½κ² μ΄ν΄ν μ μκ² νμ΅λλ€.
리μ‘νΈλ κ°μ DOMμ΄λΌλ κ°λ
μ μ±νν΄ μ§μ μ μΈ DOM μ‘°μμ μ΅μνν¨μΌλ‘μ¨ μ±λ₯μ ν₯μνμ΅λλ€.
리μ‘νΈμ ν΅μ¬ κ°μ§β
μ μΈμ μ½λμ λͺ λ Ήν μ½λβ
리μ‘νΈλ DOMμ λν μ μΈμ μΆμνλ₯Ό μ 곡ν©λλ€.
κΈ°λ³Έμ μΌλ‘ 리μ‘νΈλ μ°λ¦¬κ° λ³΄κ³ μνλ κ²μ μ½λλ‘ νννλ λ°©λ²μ μ 곡νκ³ μ€μ λ‘ μ΄λ»κ² ν μ§λ 리μ‘νΈκ° μμμ ν©λλ€.
μ»΄ν¬λνΈμ μν μ μ¬μ©μ μΈν°νμ΄μ€μμ μ΄ μμμ΄ μ΄λ€ λͺ¨μ΅μ΄μ΄μΌ νλμ§μ λν΄ μ€λͺ μ λ°ννλ κ²λΏμ΄λ©°, μ΄λ¬ν μ€λͺ μ μλν UI ꡬ쑰λ₯Ό κ°λ³κ² κΈ°μ νλ κ°μ DOMμ μ¬μ©ν΄ μ΄λ£¨μ΄μ§λλ€. 리μ‘νΈλ μ λ°μ΄νΈ λ°μ μ κ³Ό νμ κ°μ DOMμ λΉκ΅νκ³ , μ€μ DOMμ μμ λΆλΆλ§ μ±λ₯ μ’μ λ°©μμΌλ‘ μ λ°μ΄νΈν΄μ λ³κ²½λ κ°μ DOMκ³Ό μΌμΉμν΅λλ€. 리μ‘νΈλ μ΄λ¬ν λ°©μμΌλ‘ DOMμ μ λ°μ΄νΈν©λλ€.
κ°μ DOMβ
κ°μ DOMμ μ€μ DOMμ μλ°μ€ν¬λ¦½νΈ μ±
μ²΄λ‘ νννλ νλ‘κ·Έλλ° κ°λ
μ
λλ€. 리μ‘νΈλ κ°μ DOMμ μ¬μ©ν΄ μ»΄ν¬λνΈμ λ³κ²½ μ¬νμ μΆμ νκ³ νμν λλ§ μ»΄ν¬λνΈλ₯Ό λ€μ λλλ§ν©λλ€.
리μ‘νΈμμ κ°μ DOMμ μ€μ DOM νΈλ¦¬λ₯Ό κ°λ³κ² ννν κ²μΈλ°, UI μμμ ꡬ쑰μ μμ±μ λνλ΄λ νλ²ν μλ°μ€ν¬λ¦½νΈ κ°μ²΄μ
λλ€. 리μ‘νΈλ μ€μ DOM νΈλ¦¬μ μΌμΉνλλ‘ κ°μ DOMμ μμ±νκ³ μ
λ°μ΄νΈνλ©°, κ°μ DOMμμ λ°μν λͺ¨λ λ³κ²½ μ¬νμ μ¬μ‘°μ (reconciliation)μ΄λΌλ κ³Όμ μ ν΅ν΄ μ€μ DOMμ μ μ©λ©λλ€.
μ»΄ν¬λνΈ λͺ¨λΈβ
리μ‘νΈλ μν리μΌμ΄μ μ μμ μ‘°κ°μΌλ‘ λλκ³ μ΄λ₯Ό 컀λ€λ νΈλ¦¬μ μΆκ°ν΄ μ ν리μΌμ΄μ μ ꡬμ±νλ 'μ»΄ν¬λνΈ λ¨μλ‘ μκ°νκΈ°'λ₯Ό μ κ·Ή κΆμ₯ν©λλ€.
λΆλ³ μνβ
리μ‘νΈμ μ€κ³ μ² νμ μ ν리μΌμ΄μ
μνλ₯Ό λΆλ³νλ κ°μ μ§ν©μΌλ‘ κΈ°μ νλ ν¨λ¬λ€μμ κ°μ‘°ν©λλ€. κ°κ°μ μν μ
λ°μ΄νΈλ μλ‘μ΄ λ
립λ μ€λ
μ·κ³Ό λ©λͺ¨λ¦¬ μ°Έμ‘°λ‘ μ·¨κΈν©λλ€.
리μ‘νΈλ λΆλ³μ±μ κ°μ ν©μΌλ‘μ¨ UI μ»΄ν¬λνΈκ° νΉμ μμ μ νΉμ μνλ₯Ό λ°μνλλ‘ λ³΄μ₯ν©λλ€. μνκ° λ³κ²½λλ©΄ μλ μλ μ¬μΉλ₯Ό μ§μ λ³κ²½νλ λμ μλ‘μ΄ μνλ₯Ό νννλ μ κ°μ²΄λ₯Ό λ°νν©λλ€.
νλμ€ μν€ν μ²β
νλμ€λ ν΄λΌμ΄μΈνΈ μΈ‘ μΉ μ ν리μΌμ΄μ ꡬμΆμ μν μν€ν μ² λμμΈ ν¨ν΄μ΄λ©°, νμ΄μ€λΆ(νμ¬ λ©ν)μμ λ°ννμ΅λλ€. λ¨λ°©ν₯ λ°μ΄ν° νλ¦μ κ°μ‘°ν΄ μ ν리μΌμ΄μ λ°μ΄ν°μ νλ¦μ λμ± μμΈ‘ κ°λ₯νκ² λ§λλλ€.
- μ‘μ
- μ λ°μ΄ν°μ μ‘μ μ μ’ λ₯λ₯Ό μλ³νλ μμ±μ ν¬ν¨νλ λ¨μν κ°μ²΄μ λλ€.
- μ¬μ©μ μνΈ μμ©, μλ² μλ΅, μμ μ λ ₯ λ± μμ€ν μ λν λ΄μΈλΆ μ λ ₯μ ννν©λλ€.
- μ‘μ μ μ€μ¬μ λμ€ν¨μ²λ₯Ό ν΅ν΄ μ¬λ¬ μ€ν μ΄λ‘ 보λ΄μ§λλ€.
// μ‘μ
κ°μ²΄ μμ
{
type: 'ADD_TODO',
text: 'νλμ€ μν€ν
μ³ μ°μ΅',
}
- λμ€ν¨μ²
- νλμ€ μν€ν μ²μ μ€μ¬μ λλ€. μ‘μ μ λ°μμ μ ν리μΌμ΄μ μ λ±λ‘λ μ€ν μ΄λ‘ 보λ λλ€.
- λͺ¨λ μ€ν μ΄λ λμ€ν¨μ²μ μ€ν μ΄ μμ κ³Ό μ½λ°±μ λ±λ‘ν΄ λλλ°, μ΄ μ½λ°± λͺ©λ‘μ κ΄λ¦¬νλ κ²λ λμ€ν¨μ²μ λλ€.
- μ‘μ μ λμ€ν¨μΉνλ©΄ λ±λ‘λ λͺ¨λ μ½λ°±μΌλ‘ ν΄λΉ μ‘μ μ μ μ‘ν©λλ€.
// μ‘μ
λμ€ν¨μΉμ μμ
Dispatcher.dispatch(action);
- μ€ν μ΄
- μ ν리μΌμ΄μ μνμ λ‘μ§μ ν¬ν¨ν©λλ€.
- MVC μν€ν μ²μ λͺ¨λΈκ³Ό λ€μ μ μ¬νμ§λ§, μ€ν μ΄λ λ€μ κ°μ²΄μ μνλ₯Ό κ΄λ¦¬ν©λλ€.
- μ€ν μ΄ μμ μ λμ€ν¨μ²μ λ±λ‘νκ³ μ‘μ μ μ²λ¦¬νλ μ½λ°±λ μ 곡ν©λλ€.
- μ€ν μ΄ μνκ° μ λ°μ΄νΈλλ©΄ λ³κ²½ μ΄λ²€νΈλ₯Ό λ°μμμΌ λ·°μ λ³κ²½λ μ¬νμ μ립λλ€.
// μ€ν μ΄ μμ
class TodoStore extends EventEmitter {
constructor() {
super();
this.todos = [];
}
handleActions(action) {
switch (action.type) {
case 'ADD_TODO':
this.todos.push(action.text);
this.emit('change');
break;
default:
// μ무 λμ μμ
break;
}
}
}
- λ·°
- 리μ‘νΈ μ»΄ν¬λνΈμ λλ€. μ€ν μ΄μμ λ³κ²½ μ΄λ²€νΈλ₯Ό λ°μΌλ©°, μμ‘΄νλ λ°μ΄ν°κ° λ³κ²½λλ©΄ μ€μ€λ‘ μ λ°μ΄νΈν©λλ€.
- νλμ€ μν€ν μ²λ μμ€ν μ λ°μ κ±Έμ³ λ¨λ°©ν₯ λ°μ΄ν° νλ¦μ μ¬μ©νλλ‘ ν΄μ μκ° κ²½κ³Όμ λ°λ₯Έ λ³νλ₯Ό μΆμ νκΈ° μ½κ² λ§λλλ€.
νλμ€ μν€ν μ²μ μ₯μ β
- λ¨μΌ μ 보 μΆμ²
- νλμ€μμλ μ ν리μΌμ΄μ μ μνμ λν λ¨μΌ μ 보 μΆμ²(source of truth)κ° μ€ν μ΄μ μ μ₯λλ κ²μ΄ μ€μν©λλ€.
- μ΄λ¬ν μ€μ μ§μ€μ μν κ΄λ¦¬λ μ ν리μΌμ΄μ μ λμμ λ μμΈ‘νκΈ° μ½κ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€.
- ν
μ€νΈ κ°λ₯μ±
- νλμ€μ μ μ μλ ꡬ쑰μ μμΈ‘ κ°λ₯ν λ°μ΄ν° νλ¦μ μ ν리μΌμ΄μ μ ν μ€νΈ κ°λ₯μ±μ λμ λλ€.
- μμ€ν μ μ¬λ¬ λΆλΆ(μ‘μ , λμ€ν¨μ², μ€ν μ΄, λ·° λ±) κ°μ κ΄μ¬μ¬λ₯Ό λΆλ¦¬νλ©΄ κ° λΆλΆλΆμ λ 립μ μΌλ‘ λ¨μ ν μ€νΈν μ μμ΅λλ€.
- λ°μ΄ν° νλ¦μ΄ λ¨λ°©ν₯μ΄κ³ μνκ° μμΈ‘ κ°λ₯ν νΉμ μμΉμ μ μ₯λμ΄μλ€λ©΄ ν μ€νΈλ₯Ό λ μ½κ² μμ±ν μ μμ΅λλ€.
- κ΄μ¬μ¬ λΆλ¦¬
- νλμ€λ μμ€ν μ¬λ¬ λΆλΆμ κ΄μ¬μ¬ λΆλ¦¬κ° λͺ νν©λλ€.
- κ° λΆλΆμλ λͺ ννκ² μ μλ μν μ΄ μμΌλ©°, λ¨λ°©ν₯ λ°μ΄ν° νλ¦ λλΆμ μ΄λ¬ν λΆλΆλ€μ΄ μ΄λ»κ² μνΈ μμ©νλμ§ λΆλͺ νκ² μ΄ν΄ν μ μμ΅λλ€.
κ·Έλμ... 리μ‘νΈλ μ νμνκ°μ?β
리μ‘νΈλ κ°λ°μλ€μ΄ λ μμΈ‘ κ°λ₯νκ³ μ λ’°μ± μλ λ°©μμΌλ‘ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μμ±ν μ μκ² νκ³ , μ°λ¦¬κ° νλ©΄μ λνλ΄κ³ μ νλ λ°λ₯Ό μ μΈμ μΌλ‘ ννν μ μκ² ν©λλ€.
νλ©΄μ μ΄λ»κ² λνλ μ§ μ κ²½ μ°μ§ μμλ 리μ‘νΈκ° μμμ ν¨μ¨μ μΈ λ°©μμΌλ‘ DOMμ μ μ§μ μΈ μ
λ°μ΄νΈλ₯Ό μνν©λλ€. λ μ»΄ν¬λνΈ λ¨μλ‘ μκ°νλλ‘ μ₯λ €ν΄ κ΄μ¬μ¬λ₯Ό λΆλ¦¬νκ³ μ½λλ₯Ό λ μ½κ² μ¬μ¬μ©νλλ‘ λμμ€λλ€.
κ²°λ‘ μ μΌλ‘ 리μ‘νΈμ ν΅μ¬ κ°μΉλ μ»΄ν¬λνΈ κΈ°λ° μν€ν μ², μ μΈμ νλ‘κ·Έλλ° λͺ¨λΈ, κ°μ DOM, JSX, κ΄λ²μν μνκ³, νλ«νΌμ κ°λ¦¬μ§ μλ νΉμ±, λ©νμ μ§μμ μ€μ¬μΌλ‘ μ΄λ£¨μ΄μ§λλ€.