본문으둜 κ±΄λ„ˆλ›°κΈ°

🎈 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, κ΄‘λ²”μœ„ν•œ μƒνƒœκ³„, ν”Œλž«νΌμ„ 가리지 μ•ŠλŠ” νŠΉμ„±, λ©”νƒ€μ˜ 지원을 μ€‘μ‹¬μœΌλ‘œ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.