๐ŸŽ‰ berenickt ๋ธ”๋กœ๊ทธ์— ์˜จ ๊ฑธ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ๐ŸŽ‰
Front
02-jsx

1. JSX ๋ž€?

  • Introduction to JSX
  • HTML ์ฝ”๋“œ๋ฅผ JSX ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์‚ฌ์ดํŠธ
  • JSX
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ™•์žฅ ๋ฌธ๋ฒ•
    • .js ํŒŒ์ผ์—์„œ ์“ฐ๋Š” HTML ๋Œ€์šฉํ’ˆ
    • ์™œ ์“ฐ๋ƒ
      • ๊ฐ€๋…์„ฑ ๋†’๊ณ  ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฌ์›Œ์„œ
  • JSX๋Š” ๊ณต์‹์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ด ์•„๋‹˜
    • Babel์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก preset ๋ฐ plugin์„ ์„ค์ •
    • Babel์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž„์˜๋กœ ๋งŒ๋“  ๋ฌธ๋ฒ•, ํ˜น์€ ์ฐจ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•๋“ค์„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐Ÿ’ก .js vs .jsx

React ๋˜๋Š” React Native ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ .js ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๊ณ  .jsx ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ

  • ์Šคํƒ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ js vs jsx
    • .js์™€ .jsx์˜ ํ™•์žฅ์ž๋กœ์„œ์˜ ์ฐจ์ด๋Š” ์—†๋‹ค๊ณ  ํ•จ
    • React ์ฝ”๋“œ๋ฅผ JS๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์—์„œ JSX๋“ค์„ ํ‘œ์ค€์ ์ธ js ํŒŒ์ผ๋กœ ๋ฐ”๊ฟˆ
    • ๋‘˜ ์ค‘ ํ•˜๋‚˜ ๊ณจ๋ผ์„œ ์ผ๊ด€๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™•์žฅ์ž๋ฅผ ์“ฐ๊ธฐ

2. JSX ๋ฌธ๋ฒ•

2.1 ๊ฐ์‹ธ์ธ ์š”์†Œ

์ปดํฌ๋„ŒํŠธ์— ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ์š”์†Œ ํ•˜๋‚˜๋กœ ๊ฐ์‹ธ์•ผ ํ•จ

1
import React from 'react'
2
function App() {
3
// ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ๋ถ€๋ชจ ์š”์†Œ(div) ํ•˜๋‚˜๋กœ ๊ฐ์‹ธ์•ผ ํ•œ๋‹ค.
4
return (
5
<div>
6
<h1>๋ญ์‹œ๊ธฐ</h1>
7
<h2>์ €์‹œ๊ธฐ</h2>
8
</div>
9
)
10
}
11
12
export default App

๋ถ€๋ชจ ์š”์†Œ์— div ์‚ฌ์šฉํ•˜๊ธฐ ์‹ซ์œผ๋ฉด? React v16๋ถ€ํ„ฐ ๋„์ž…๋œ Fragment ๊ธฐ๋Šฅ ์“ฐ์ž

1
function App() {
2
// ๋งˆ๋•…ํžˆ ๊ฐ์Œ€ ์š”์†Œ๋ฅผ ์ƒ๊ฐ์•ˆ๋‚˜๋ฉด, Fragment
3
return (
4
<Fragment>
5
<h1>๋ญ์‹œ๊ธฐ</h1>
6
<h2>์ €์‹œ๊ธฐ</h2>
7
</Fragment>
8
)
9
}
1
function App() {
2
// Fragment๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ์ƒ๋žต ๊ฐ€๋Šฅ
3
return (
4
<>
5
<h1>๋ญ์‹œ๊ธฐ</h1>
6
<h2>์ €์‹œ๊ธฐ</h2>
7
</>
8
)
9
}

2.2 HTML์— JS ํ‘œํ˜„ : ๋กœ ํ‘œํ˜„

1
function App() {
2
const name = '๋ฆฌ์•กํŠธ'
3
return (
4
<>
5
{/* {}๋กœ ๊ฐ์‹ธ์„œ ํ‘œํ˜„ */}
6
<h1>Hello {name}</h1>
7
</>
8
)
9
}
  • ๋ฐ์ดํ„ฐ๋ฐ”์ธ๋”ฉ : ๋ณ€์ˆ˜์— ์žˆ๋˜๊ฑธ HTML์— ๊ฝ‚์•„๋„ฃ๋Š” ๊ฒƒ

2.3 if๋ฌธ ๋Œ€์‹  ์‚ผํ•ญ ์—ฐ์‚ฐ์ž

  • JSX ๋‚ด๋ถ€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์—์„œ if๋ฌธ์„ ์‚ฌ์šฉ ๋ชปํ•จ
  • ๋Œ€์‹  ์‚ผํ•ญ์—ฐ์‚ฐ์ž์„ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
1
function App() {
2
const name = '๋ฆฌ์•กํŠธ'
3
return <div>{name === '๋ฆฌ์•กํŠธ' ? <h1>๋ฆฌ์•กํŠธ</h1> : <h1>๋ฆฌ์•กํŠธ ์•„๋‹˜</h1>}</div>
4
}

2.4 for๋ฌธ ๋Œ€์‹  map()

  • JSX ๋‚ด๋ถ€์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„์‹์—์„œ for๋ฌธ์„ ์‚ฌ์šฉ ๋ชปํ•จ
  • ๋Œ€์‹  **map()**์„ ์‚ฌ์šฉํ•˜๋ฉด ๋จ
1
let array = [2, 3, 4]
2
3
array.map(Element => {
4
console.log(Element) // 2, 3, 4
5
})

JSX์—์„œ HTML์„ ๋ฐ˜๋ณต ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์œผ๋ฉด, ๋‹ค์Œ์ฒ˜๋Ÿผ ์‚ฌ์šฉ

1
function App() {
2
// `<div>์•ˆ๋…•</div>`์ด 3๊ฐœ ์ƒ์„ฑ๋จ
3
return (
4
<div>
5
{[1, 2, 3].map(function () {
6
return <div>์•ˆ๋…•</div>
7
})}
8
</div>
9
)
10
}

๋งŒ์•ฝ ์ผ๋ฐ˜ for๋ฌธ ์“ธ๋ ค๊ณ  ํ•˜๋ฉด, ๋‹ค์Œ์ฒ˜๋Ÿผ ์“ธ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ๊ท€์ฐฎ์œผ๋‹ˆ map์ด ์ข‹์Œ

1
function App() {
2
let arr = []
3
for (let i = 0; i < 3; i++) {
4
arr.push(<div>์•ˆ๋…•</div>)
5
}
6
return <div>{arr}</div>
7
}

2.5 AND ์—ฐ์‚ฐ์ž๋กœ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

  • ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ๋งŒ ๋‚ด์šฉ์„ ๋ณด์—ฌ์ฃผ๊ณ , ๋งŒ์กฑํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๋ Œ๋”๋ง์•ˆํ•  ๋–„,
  • AND ์—ฐ์‚ฐ์ž(&&)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง ๊ฐ€๋Šฅ
1
function App() {
2
const name = '๋ฆฌ์•กํŠธ ์•„๋‹˜'
3
// name์ด '๋ฆฌ์•กํŠธ'์ด๋ฉด, <h1>๋ฆฌ์•กํŠธ์ž…๋‹ˆ๋‹ค.</h1>์ด๊ฑฐ ๋ณด์—ฌ์ฃผ๊ณ 
4
// name์ด ๋‹ค๋ฅธ ๊ฑฐ๋ผ๋ฉด, null ๋ฐ˜ํ™˜ํ•˜์…ˆ
5
return <div>{name === '๋ฆฌ์•กํŠธ' && <h1>๋ฆฌ์•กํŠธ์ž„</h1>}</div>
6
7
// ์œ„ ๋ฌธ๋ฒ•๊ณผ ๊ฐ™์€ ๋ฌธ๋ฒ•
8
// return <div>{name === '๋ฆฌ์•กํŠธ' ? <h1>๋ฆฌ์•กํŠธ์ž…๋‹ˆ๋‹ค.</h1> : null}</div>;
9
}

2.6 OR ์—ฐ์‚ฐ์ž๋กœ undefined ๋ Œ๋”๋ง ์•ˆํ•˜๊ธฐ

  • OR(||) ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’์ด undefined์ผ ๋•Œ, ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ ๊ฐ€๋Šฅ
1
function App() {
2
const name = undefined
3
// ๊ฐ’์ด undefined๋ผ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚  ๋–„, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌํ•  ๋•Œ
4
return name || '๊ฐ’์ด undefined์ž„'
5
}

2.7 ์ธ๋ผ์ธ ์Šคํƒ€์ผ๋ง

  • React์—์„œ DOM ์š”์†Œ ์Šคํƒ€์ผ ์ ์šฉํ•  ๋–„๋Š”, ๋ฌธ์ž์—ด์ด ์•„๋‹Œ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์•ผ ๋จ
  • background-color์ฒ˜๋Ÿผ -๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜๋Š” ์ด๋ฆ„์€ ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ•(camelCase)์œผ๋กœ ์ž‘์„ฑ
    • JS์—์„œ -๋ฅผ ์ˆซ์ž -๋กœ ์ธ์‹ํ•ด์„œ ์นด๋ฉœํ‘œ๊ธฐ๋ฒ• ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž„
    • background-color๋Š” backgroundColor๋กœ
1
function App() {
2
const style = {
3
backgroundColor: 'black',
4
color: 'aqua',
5
fontSize: '48px', // font-size -> fontSize
6
}
7
return <div style={style}> ๊ธ€์”จ </div>
8
}

๋˜๋Š”

1
<div style={{ color: 'blue', fontSize: '30px' }}> ๊ธ€์”จ </div>

2.8 HTML์— class ๋Œ€์‹  className

  • HTML์— class๋ช…์„ class=" "๊ฐ€ ์•„๋‹ˆ๋ผ className=" "์ด๋ ‡๊ฒŒ ์”€
  • ์™œ๋ƒํ•˜๋ฉด -๋ฅผ ์ˆซ์ž -๋กœ ์ธ์‹ํ•ด์„œ ์นด๋ฉœํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ,
  • JS์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์•ฝ์–ด์ธ class๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์–ด ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ className์ด๋ผ๊ณ  ์”€
1
function App() {
2
// class๊ฐ€ ์•„๋‹ˆ๋ผ className ์‚ฌ์šฉ
3
return <div className="react">๊ธ€์”จ</div>
4
}

2.9 ์ฃผ์„

1
function App() {
2
// ์—ฌ๊ธฐ ์ฃผ์„์€ ์ด๋ ‡๊ฒŒ ์”€
3
return (
4
<>
5
{/* ์ฃผ์„์€ ์ด๋ ‡๊ฒŒ ์”€ */}
6
<div className="react">๊ธ€์”จ</div>
7
</>
8
)
9
}