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

🎈 Chapter 2: JSX

JSX의 XλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ ν™•μž₯ ꡬ문(eXtension)을 λœ»ν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ XML이라고도 ν•©λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ XML?​

JSXλŠ” κ°œλ°œμžκ°€ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œ λ‚΄μ—μ„œ HTMLκ³Ό μœ μ‚¬ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 있게 ν•˜λŠ” μžλ°”μŠ€ν¬λ¦½νŠΈμš© ꡬ문 ν™•μž₯μžμž…λ‹ˆλ‹€. JSXλŠ” λ³„λ„μ˜ μ–Έμ–΄κ°€ μ•„λ‹ˆλΌ μ»΄νŒŒμΌλŸ¬λ‚˜ νŠΈλžœμŠ€νŒŒμΌλŸ¬μ— μ˜ν•΄ 일반 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ λ³€ν™˜λ˜λŠ” ν™•μž₯ κ΅¬λ¬Έμž…λ‹ˆλ‹€. JSX μ½”λ“œλŠ” 컴파일 과정을 거쳐 일반 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ λ³€ν™˜λ©λ‹ˆλ‹€.

JSXλ₯Ό μ‚¬μš©ν•œ λͺ©λ‘μ˜ μ˜ˆμ‹œ

const MyComponent = () => (
<section id="list">
<h2>My List</h2>
<p>My list of things</p>
<ul>
{amazingThings.map((thing) => (
<li key={thing.id}>{thing.label}</li>
))}
</ul>
</section>
)

λ˜‘κ°™μ€ λͺ©λ‘μ„ JSX 없이 μž‘μ„±ν•œ μ˜ˆμ‹œμž…λ‹ˆλ‹€.

const MyComponent = () => React.createElement(
'section',
{ id: 'list' },
React.createElement('h2', {}, 'My List'),
React.createElement('p', {}, 'My list of things'),
React.createElement(
'ul',
null,
amazingThings.map((thing) => React.createElement('li', { key: thing.id }, thing.label))
)
)

JSX의 μž₯점​

  • 더 μ‰¬μš΄ 읽기 및 μ“°κΈ°
  • ν–₯μƒλœ λ³΄μ•ˆ
    • μƒˆλ‘œμš΄ μ—˜λ¦¬λ¨ΌνŠΈλ₯Ό 생성할 수 μžˆλŠ” '<' 및 '>' 같은 μœ„ν—˜ν•œ λ¬Έμžκ°€ HTML λ¬Έμžμ—΄μ— ν¬ν•¨λ˜μ–΄μžˆλ‹€λ©΄, JSX μ½”λ“œλ₯Ό μ»΄νŒŒμΌν•  λ•Œ λ‹€λ₯Έ 문자둜 λ°”κΏ” 더 μ•ˆμ „ν•œ μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.
  • κ°•λ ₯ν•œ 타이핑
  • μ»΄ν¬λ„ŒνŠΈ 기반 μ•„ν‚€ν…μ²˜
  • κ΄‘λ²”μœ„ν•œ μ‚¬μš©
    • JSXλŠ” λ¦¬μ•‘νŠΈ μ—…κ³„μ—μ„œ 널리 μ‚¬μš©λ  뿐만 μ•„λ‹ˆλΌ λ¦¬μ•‘νŠΈκ°€ μ•„λ‹Œ λΌμ΄λΈŒλŸ¬λ¦¬μ™€ ν”„λ ˆμž„μ›Œν¬μ—μ„œλ„ μ§€μ›λ©λ‹ˆλ‹€.

JSX의 약점​

  • ν•™μŠ΅ 곑성 가쀑
  • μ „μš© 도ꡬ ν•„μš”
    • JSX μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ λ¨Όμ € 일반 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ‘œ μ»΄νŒŒμΌν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό μœ„ν•œ 개발 도ꡬ가 μΆ”κ°€λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • 관심사 ν˜Όν•©
    • 일뢀 κ°œλ°œμžλ“€μ€ JSXκ°€ HTMLκ³Ό μœ μ‚¬ν•œ μ½”λ“œλ₯Ό μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œμ— κ²°ν•©ν•¨μœΌλ‘œμ¨ 관심사λ₯Ό ν˜Όν•©μ‹œν‚€κ³ , ν‘œν˜„κ³Ό 논리λ₯Ό λΆ„λ¦¬ν•˜κΈ° μ–΄λ ΅κ²Œ λ§Œλ“ λ‹€κ³  μ£Όμž₯ν•©λ‹ˆλ‹€.
  • μžλ°”μŠ€ν¬λ¦½νŠΈ ν˜Έν™˜μ„± λΆ€μ‘±
    • JSXλŠ” 인라인 ν‘œν˜„μ‹μ„ μ§€μ›ν•˜μ§€λ§Œ 인라인 블둝은 μ§€μ›ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. (switch, if, for, while, etc.)

JSXλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°•λ ₯ν•˜κ³  μœ μ—°ν•œ λ°©μ‹μœΌλ‘œ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ§Œλ“€κ³  μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
JSXλŠ” λΈŒλΌμš°μ €μ— μ „λ‹¬λ˜κΈ° 전에 바닐라 JSκ°€ λ©λ‹ˆλ‹€. 이 λ™μž‘μ΄ μ–΄λ–»κ²Œ μ΄λ£¨μ–΄μ§€λŠ”μ§€ λ‚΄λΆ€λ₯Ό λ“€μ—¬λ‹€λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ‚΄λΆ€ λ™μž‘β€‹

μ½”λ“œλŠ” μ–΄λ–»κ²Œ μž‘λ™ν•˜λ‚˜μš”?​

μ»΄νŒŒμΌλŸ¬λŠ” νŠΉμ • κ·œμΉ™μ— 따라 κ³ κΈ‰ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ‘œ μž‘μ„±λœ μ†ŒμŠ€ μ½”λ“œλ₯Ό ꡬ문 트리둜 λ³€ν™˜ν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ ꡬ문 νŠΈλ¦¬λž€ 문자 κ·ΈλŒ€λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈ 객체 같은 트리 자료 κ΅¬μ‘°μž…λ‹ˆλ‹€.
μ»΄νŒŒμΌλŸ¬λŠ” (적어도 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œλŠ”) 3단계 과정을 κ±°μΉ©λ‹ˆλ‹€. 각각 토큰화, ꡬ문 뢄석, μ½”λ“œ 생성이라고 ν•˜λŠ”λ° 각 단계에 λŒ€ν•΄ μžμ„Ένžˆ μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

토큰화​

κ°„λ‹¨ν•˜κ²Œ λ§ν•˜μžλ©΄ λ¬Έμžμ—΄μ„ 의미 μžˆλŠ” ν† ν°μœΌλ‘œ λΆ„ν•΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. ν† ν¬λ‚˜μ΄μ €κ°€ μƒνƒœλ₯Ό 가지고 있고, 각 토큰이 μžμ‹ μ˜ λΆ€λͺ¨λ‚˜ μžμ‹μ— κ΄€ν•œ μƒνƒœλ₯Ό ν¬ν•¨ν•˜κ³  μžˆμ„ λ•ŒλŠ” ν† ν¬λ‚˜μ΄μ €λ₯Ό λ ‰μ„œλΌκ³  λΆ€λ¦…λ‹ˆλ‹€. ν•œλ§ˆλ””λ‘œ 렉싱은 μƒνƒœλ₯Ό κ°€μ§€λŠ” ν† ν°ν™”μž…λ‹ˆλ‹€.

λ ‰μ„œλŠ” λ ‰μ„œ κ·œμΉ™μ΄ μžˆμ–΄μ„œ 이 κ·œμΉ™μœΌλ‘œ μ •κ·œ ν‘œν˜„μ‹μ„ μ‚¬μš©ν•΄ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄λ₯Ό λ‚˜νƒ€λ‚΄λŠ” ν…μŠ€νŠΈ λ¬Έμžμ—΄μ—μ„œ λ³€μˆ˜ 이름, 객체 ν‚€ 및 κ°’ 같은 μ£Όμš” 토큰을 κ°μ§€ν•©λ‹ˆλ‹€. 그런 λ‹€μŒ λ ‰μ„œλŠ” κ΅¬ν˜„μ— 따라 μ΄λŸ¬ν•œ ν‚€μ›Œλ“œλ₯Ό μ—΄κ±° κ°€λŠ₯ν•œ κ°’μœΌλ‘œ ν‘œν˜„ν•©λ‹ˆλ‹€. κ°€λ Ή constλŠ” 0으둜, let은 1둜, function은 2둜 λ°”λ€λ‹ˆλ‹€.
λ¬Έμžμ—΄μ΄ ν† ν°ν™”λ˜κ±°λ‚˜ λ ‰μ‹±λ˜λ©΄ λ‹€μŒ 단계인 ꡬ문 λΆ„μ„μœΌλ‘œ λ„˜μ–΄κ°‘λ‹ˆλ‹€.

ꡬ문 뢄석​

토큰을 가져와 ꡬ문 트리둜 λ³€ν™˜ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. ꡬ문 νŠΈλ¦¬λŠ” μ½”λ“œμ˜ ꡬ쑰λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 자료 κ΅¬μ‘°μž…λ‹ˆλ‹€.

{
"type": "Program",
"body": [
{
"type": "ExpressionStatement",
"expression": {
"type": "CallExpression",
"callee": {
"type": "Identifier",
"name": "console.log"
},
"arguments": [
{
"type": "Literal",
"value": "Hello World",
"raw": "\"Hello World\""
}
]
}
}
]
}

ꡬ문 뢄석기 덕뢄에 λ¬Έμžμ—΄μ€ JSON 객체가 λ©λ‹ˆλ‹€.

μ½”λ“œ 생성​

μ»΄νŒŒμΌλŸ¬κ°€ 좔상 ꡬ문 트리(AST)μ—μ„œ 기계어λ₯Ό μƒμ„±ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.

μ»΄νŒŒμΌλŸ¬λŠ” μ—¬λŸ¬ μ’…λ₯˜κ°€ 있으며, μ €λ§ˆλ‹€ νŠΉμ„±κ³Ό μ‚¬μš© λͺ©μ μ΄ λ‹€λ¦…λ‹ˆλ‹€. κ°€μž₯ 일반적인 컴파일러 μ’…λ₯˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • λ„€μ΄ν‹°λΈŒ 컴파일러
  • 크둜슀 컴파일러
  • JIT 컴파일러
    • μ½”λ“œλ₯Ό 미리 λ³€ν™˜ν•˜μ§€ μ•Šκ³  μ‹€ν–‰ν•  λ•Œ κΈ°κ³„μ–΄λ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€. JIT(Just-in-time) μ»΄νŒŒμΌλŸ¬λŠ” μžλ°” 가상 λ¨Έμ‹  같은 가상 λ¨Έμ‹ μ—μ„œ 일반적으둜 μ‚¬μš©λ˜λ©°, κΈ°μ‘΄ 인터프리터보닀 μ„±λŠ₯이 훨씬 μš°μˆ˜ν•©λ‹ˆλ‹€.
  • 인터프리터
    • μ»΄νŒŒμΌν•˜μ§€ μ•Šκ³  μ†ŒμŠ€ μ½”λ“œλ₯Ό 직접 μ‹€ν–‰ν•©λ‹ˆλ‹€.

μ›Ή λΈŒλΌμš°μ €λ₯Ό λΉ„λ‘―ν•΄ μ΅œμ‹  ν™˜κ²½μ—μ„œλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό 효율적으둜 μ‹€ν–‰ν•˜κΈ° μœ„ν•΄ JIT μ»΄νŒŒμΌλŸ¬λŠ” 많이 μ‚¬μš©ν•©λ‹ˆλ‹€.

λŸ°νƒ€μž„μ€ 일반적으둜 엔진과 연동해 νŠΉμ • ν™˜κ²½μ— λ§žλŠ” μ½˜ν…μŠ€νŠΈ 헬퍼와 κΈ°λŠ₯을 더 많이 μž¬κ³΅ν•©λ‹ˆλ‹€. κ°€μž₯ 인기 μžˆλŠ” μžλ°”μŠ€ν¬λ¦½νŠΈ λŸ°νƒ€μž„μ€ ꡬ글 크둬 같은 일반적인 μ›Ή λΈŒλΌμš°μ €μž…λ‹ˆλ‹€.
크둬 μ›Ή λΈŒλΌμš°μ €λŠ” 엔진과 μ—°λ™ν•˜λŠ” ν¬λ‘œλ―Έμ›€ λŸ°νƒ€μž„μ„ μ œκ³΅ν•©λ‹ˆλ‹€. μ„œλ²„ μΈ‘μ—μ„œλŠ” V8 엔진을 μ‚¬μš©ν•˜λŠ” Node.js λŸ°νƒ€μž„μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

λŸ°νƒ€μž„μ€ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 λΈŒλΌμš°μ € λŸ°νƒ€μž„μ΄ μ œκ³΅λ˜λŠ” window 객체와 document 객체 같은 μ½˜ν…μŠ€νŠΈλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

JSX둜 μžλ°”μŠ€ν¬λ¦½νŠΈ ꡬ문 ν™•μž₯ν•˜κΈ°β€‹

μžλ°”μŠ€ν¬λ¦½νŠΈ ꡬ문을 ν™•μž₯ν•˜λ €λ©΄ μƒˆλ‘œμš΄ ꡬ문을 μ΄ν•΄ν•˜λŠ” λ‹€λ₯Έ 엔진이 ν•„μš”ν•˜κ±°λ‚˜, 엔진보닀 μ•žμ„œ μƒˆλ‘œμš΄ ꡬ문을 μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 맀우 λ‹€μ–‘ν•œ κ³³μ—μ„œ μ‚¬μš©λ˜λ―€λ‘œ μ œμž‘κ³Ό μœ μ§€ λ³΄μŠ€μ— λ§Žμ€ 고민이 ν•„μš”ν•©λ‹ˆλ‹€. λ”°λΌμ„œ JSXλ§Œμ„ μœ„ν•œ μƒˆλ‘œμš΄ 엔진을 λ§Œλ“ λ‹€λŠ” 건 거의 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

κΈ°μ‘΄ 엔진보닀 μ•žμ„œ μƒˆλ‘œμš΄ ꡬ문을 μ²˜λ¦¬ν•˜λ„λ‘ ν•˜λŠ” 게 λ‹Ήμ—°νžˆ 더 μ‰½μŠ΅λ‹ˆλ‹€. μƒˆ ꡬ문이 엔진에 λ„λ‹¬ν•˜κΈ° 전에 μ²˜λ¦¬ν•˜λŠ” 과정을 μ‚΄νŽ΄λ΄…μ‹œλ‹€. 이λ₯Ό μœ„ν•΄μ„œλŠ” ν™•μž₯ μ–Έμ–΄λ₯Ό μ΄ν•΄ν•˜λŠ”, λ‹€μ‹œ 말해 ν™•μž₯ μ–Έμ–΄λ‘œ μž‘μ„±λœ μ½”λ“œ λ¬Έμžμ—΄μ„ 이해할 수 μžˆλŠ” λ ‰μ„œμ™€ ꡬ문 뢄석기λ₯Ό λ§Œλ“€μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ’…λž˜μ˜ λ°©μ‹μ—μ„œλŠ” λ‹€μŒ λ‹¨κ³„λ‘œ 기계어λ₯Ό μƒμ„±ν–ˆμ§€λ§Œ, μ—¬κΈ°μ„œλŠ” ꡬ문 트리λ₯Ό μ‚¬μš©ν•΄ 기쑴의 λͺ¨λ“  μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 이해할 수 μžˆλŠ” 일반적인 바닐라 JSλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이것이 λ°”λ‘œ μžλ°”μŠ€ν¬λ¦½νŠΈ μƒνƒœκ³„μ—μ„œ 바벨(babel)이 ν•˜λŠ” 일이고, νƒ€μž…μŠ€ν¬λ¦½νŠΈ, νŠΈλ ˆμ΄μ„œ, SWC 같은 도ꡬ가 ν•˜λŠ” μΌμž…λ‹ˆλ‹€.

이 λ•Œλ¬Έμ— JSXλŠ” λΈŒλΌμš°μ €μ—μ„œ 직접 μ‚¬μš©ν•  수 μ—†κ³ , νŠΉμˆ˜ν•œ ꡬ문 뢄석기λ₯Ό 톡해 ꡬ문 트리둜 μ»΄νŒŒμΌν•˜λŠ” 'λΉŒλ“œ 단계'κ°€ ν•„μš”ν•©λ‹ˆλ‹€. 이 μ½”λ“œλŠ” μ΄λŸ¬ν•œ 과정을 거쳐 바닐라 JS둜 λ³€ν™˜λ˜μ–΄ μ΅œμ’… 배포용 λ²ˆλ“€μ— ν¬ν•¨λ©λ‹ˆλ‹€. 이 과정을 κ°€λ¦¬μΌœ νŠΈλžœμŠ€νŒŒμΌν•œλ‹€κ³  ν•˜λŠ”λ°, 달리 ν‘œν˜„ν•˜λ©΄ μ½”λ“œλ₯Ό λ³€ν™˜ν•œ ν›„ μ»΄νŒŒμΌν•œλ‹€λŠ” λ§μž…λ‹ˆλ‹€.

νŠΈλžœμŠ€νŒŒμΌμ€ ν•œ μ–Έμ–΄λ‘œ μž‘μ„±λœ μ†ŒμŠ€ μ½”λ“œλ₯Ό 좔상화 μˆ˜μ€€μ΄ λΉ„μŠ·ν•œ λ‹€λ₯Έ μ–Έμ–΄λ‘œ λ³€ν™˜ν•˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€. κ·Έλž˜μ„œ μ†ŒμŠ€ λŒ€ μ†ŒμŠ€ μ»΄νŒŒμΌμ΄λΌκ³ λ„ ν•©λ‹ˆλ‹€.

JSX ν”„λΌκ·Έλ§ˆβ€‹

JSX ν”„λΌκ·Έλ§ˆ(pragma: μ»΄νŒŒμΌλŸ¬μ— νŠΉμ • μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ„λ‘ μ§€μ‹œν•˜λŠ” μ§€μ‹œμ–΄λ₯Ό λœ»ν•©λ‹ˆλ‹€.)λŠ” λͺ¨λ‘ <둜 μ‹œμž‘ν•˜λŠ”λ°, 사싀 μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ 이 λ¬ΈμžλŠ” 비ꡐ μ—°μ‚°ν•  λ•Œλ₯Ό μ œμ™Έν•˜λ©΄ μΈμ‹ν•˜μ§€ λͺ»ν•˜λŠ” λ¬Έμžμž…λ‹ˆλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 이 문자λ₯Ό λ°œκ²¬ν•˜λ©΄ Syntax Error: Unexpected token '<' 였λ₯˜λ₯Ό λ˜μ§‘λ‹ˆλ‹€.

ꡬ문 뢄석기가 < ν”„λΌκ·Έλ§ˆλ₯Ό λ§Œλ‚  λ•Œ ν˜ΈμΆœν•  ν•¨μˆ˜μ˜ 이름은 μ„€μ • κ°€λŠ₯ν•œλ°, μ•žμ„œ μ„€λͺ…ν•œ κ²ƒμ²˜λŸΌ React.createElement (μ˜ˆμ „ 버전) λ˜λŠ” _jsxs (μ΅œμ‹  버전)κ°€ κΈ°λ³Έκ°’μœΌλ‘œ μ •ν•΄μ§‘λ‹ˆλ‹€. 이 ν•¨μˆ˜μ˜ μ‹œκ·Έλ‹ˆμ²˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

function pragma(tag, props, ...children)

이 ν•¨μˆ˜λŠ” tag, props, children을 인자둜 λ°›μŠ΅λ‹ˆλ‹€. JSXκ°€ 일반 μžλ°”μŠ€ν¬λ¦½νŠΈ ꡬ문으둜 λ°”λ€ŒλŠ” 방식은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. λ¨Όμ € JSX μ½”λ“œλ₯Ό λ³΄κ² μŠ΅λ‹ˆλ‹€.

<MyComponent prop="속성값">μ½˜ν…μΈ </MyComponent>

이 μ½”λ“œλŠ” λ‹€μŒκ³Ό 같은 μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œκ°€ λ©λ‹ˆλ‹€.

React.createElement(MyComponent, { prop: "속성값" }, "μ½˜ν…μΈ ");

μ΄λŸ¬ν•œ λ³€ν™˜μ΄ λ°”λ‘œ μ—¬λŸ¬ μ°¨λ‘€ 반볡적으둜 ν˜ΈμΆœλ˜λŠ” ν•¨μˆ˜μ— κ΄€ν•œ 문법 섀탕(syntax sugar)인 JSX ν”„λΌκ·Έλ§ˆμ˜ μ—­ν• μž…λ‹ˆλ‹€. 사싀상 JSX ν”„λΌκ·Έλ§ˆλŠ” React.createElement λŒ€μ‹  < 문자λ₯Ό μ‚¬μš©ν•˜λŠ” 별칭에 λΆˆκ³Όν•©λ‹ˆλ‹€.

ν‘œν˜„μ‹β€‹

JSX의 κ°•λ ₯ν•œ κΈ°λŠ₯ ν•˜λ‚˜λŠ” μ—˜λ¦¬λ¨ΌνŠΈ 트리 λ‚΄λΆ€μ—μ„œ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

const a = 1;
const b = 2;

const MyComponent = () => <Box>ν‘œν˜„μ‹μž…λ‹ˆλ‹€: {a + b}</Box>;

μ΄λ ‡κ²Œ ν•˜λ©΄ μ€‘κ΄„ν˜Έ μ•ˆμ˜ λ‚΄μš©μ΄ ν‘œν˜„μ‹μœΌλ‘œ μ‹€ν–‰λ˜λ―€λ‘œ ν‘œν˜„μ‹μž…λ‹ˆλ‹€: 3이 λ Œλ”λ§λ©λ‹ˆλ‹€.

JSX ν‘œν˜„μ‹μ€ 말 κ·ΈλŒ€λ‘œ ν‘œν˜„μ‹μž…λ‹ˆλ‹€. JSX μ—˜λ¦¬λ¨ΌνŠΈ 트리 λ‚΄λΆ€μ—μ„œλŠ” λ¬Έμž₯을 μ‹€ν–‰ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λ‹€μŒ 방식은 λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

const MyComponent = () => <Box>ν‘œν˜„μ‹μž…λ‹ˆλ‹€: {
const a = 1;
const b = 2;

if (a > b) {
3
}
}</Box>;

이 μ½”λ“œλŠ” λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ¬Έμž₯이 μ•„λ¬΄λŸ° 값도 λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ°, 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμœΌλ©΄μ„œ μƒνƒœλ₯Ό μ„€μ •ν•˜λŠ” λΆ€μž‘μš©μœΌλ‘œ κ°„μ£Όλ˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.