π 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>;
μ΄ μ½λλ λμνμ§ μμ΅λλ€. λ¬Έμ₯μ΄ μλ¬΄λ° κ°λ λ°ννμ§ μλλ°, κ°μ λ°ννμ§ μμΌλ©΄μ μνλ₯Ό μ€μ νλ λΆμμ©μΌλ‘ κ°μ£ΌλκΈ° λλ¬Έμ λλ€.