JSX
1. ๊ฐ์
const element = <h1>Hello, world!</h1>;์์ ํ๊ทธ ๋ฌธ๋ฒ์ ๋ฌธ์์ด๋, HTML๋ ์๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๊ณต๋ถํ ๋์๋ ํ ๋ฒ๋ ๋ณธ ์ ์ด ์๋ ํํ์ ๋ฌธ๋ฒ์ด๋ค. ์์ ๊ฐ์ ๋ฌธ๋ฒ์ JSX์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ ๋ฆฌ์กํธ์์ ์ฌ์ฉ๋๋ ๋ฌธ๋ฒ์ด๋ค. ๋ฆฌ์กํธ์์๋ UI๊ฐ ์ด๋ป๊ฒ ์๊ฒจ์ผ ํ๋์ง ์ค๋ช ํ๊ธฐ ์ํด JSX๋ฅผ ์ฌ์ฉํ๋ฏ๋ก JSX์ ๊ฐ๋ ์ ๋ํด ์์งํด์ผ ํ๋ค.
2. JSX๋?
XML๊ณผ ๋งค์ฐ ๋น์ทํ๊ฒ ์๊ธด JSX๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํ์ฅ ๋ฌธ๋ฒ์ด๋ค. ์ด๋ฌํ JSX์ ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๊ธฐ ์ ์ฝ๋๊ฐ ๋ฒ๋ค๋ง๋๋ ๊ณผ์ ์์ ๋ฐ๋ฒจ์ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์ ์ฝ๋๋ก ๋ณํ๋๋ค.
function App() {
return <div>Hello World!</div>;
}์์ ์ฝ๋๊ฐ ์๋์ ๊ฐ์ด ๋ณํ๋๋ค.
function App() {
return React.createElement('h1', null, 'Hello World!');
}์์ ๋ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด JSX์ ์ฝ๋๊ฐ ํจ์ฌ ์ง๊ด์ ์ผ๋ก ๋๊ปด์ง๋ค. ๋ง์ฝ React.createElementํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ์ ํ๋ค๋ฉด ๋งค์ฐ ๋ถํธํ ๊ฒ์ด๋ค. ๋ฐ๋๋ก JSX๋ฅผ ์ฌ์ฉํ๋ฉด ๋งค์ฐ ํธํ๊ฒ UI๋ฅผ ๋ ๋๋ง์ ํ ์ ์๋ค.
JSX๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ธ๊ฐ? NO! JSX๋ ๋ฆฌ์กํธ๋ก ๊ฐ๋ฐํ ๋ ์ฌ์ฉ๋๋ฏ๋ก ๊ณต์์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ด ์๋๋ค. ๋ฐ๋ฒจ์์ ์ฌ๋ฌ ๋ฌธ๋ฒ์ ์ง์ํ ์ ์๋๋ก preset ๋ฐ plugin์ ์ค์ ํ๋ค. ๋ฐ๋ฒจ์ ํตํด ๊ฐ๋ฐ์๋ค์ด ์์๋ก ๋ง๋ ๋ฌธ๋ฒ, ํน์ ์ฐจ๊ธฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฌธ๋ฒ๋ค์ ์ฌ์ฉํ ์ ์๋ค.
Babel์ ๋ฌด์์ธ๊ฐ? Babel์ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฌธ๋ฒ์ ํ์ฅํด์ฃผ๋ ๋๊ตฌ์ด๋ค. ์์ง ์ง์๋์ง ์๋ ์ต์ ๋ฌธ๋ฒ์ด๋, ํธ์์ ์ฌ์ฉํ๊ฑฐ๋ ์คํ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ๋ค์ ์ ์ ์๋ฐ์คํฌ๋ฆฝํธ ํํ๋ก ๋ณํํด์ค์ผ๋ก์จ ๊ตฌํ ๋ธ๋ผ์ฐ์ ๊ฐ์ ํ๊ฒฝ์์๋ ์ ๋๋ก ์คํ ํ ์ ์๊ฒ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
$ npx create-react-app์ ์คํํ ๊ฒฝ์ฐ babel๋ฅผ ๋ณ๋๋ก ์ค์ ์ ํ์ง ์์๋ ๋๋ค. Babel Babel ์ฌ์ฉํด๋ณด๊ธฐ
3. JSX์ ๊ธฐ๋ณธ ๊ท์น
JSX๊ฐ JavaScript๋ก ์ ๋๋ก ๋ณํ๋๊ธฐ ์ํด์๋(์๋ฌ๊ฐ ๋์ง ์๊ธฐ ์ํด์๋) ์ง์ผ์ผํ ๋ช ๊ฐ์ง ๊ท์น์ด์๋ค.
3-1. ๊ผญ ๋ซํ์ผ ํ๋ ํ๊ทธ
import React from "react";
import Header from "./Header";
function App() {
return (
<div>
<Header />
<div>
</div>
);
}์์ ์ฝ๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.

<Header />์ปดํฌ๋ํธ ์๋ ์ค์ ์๋ <div>ํ๊ทธ๊ฐ ๋ซํ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
HTML์์๋ input ๋๋ brํ๊ทธ๋ฅผ ํ ๋ ๋ซ์ง ์๊ณ ์ฌ์ฉํ๊ธฐ๋ ํ๋๋ฐ ๋ฆฌ์กํธ์์๋ ๋ซ์์ผ ํ๋ค. ํ๊ทธ์ ํ๊ทธ ์ฌ์ด์ ๋ด์ฉ(์์)์ด ๋ค์ด๊ฐ์ง ์์ ๋, Self Closingํ๊ทธ ๋ผ๋ ๊ฒ์ ์ฌ์ฉํด์ผ ํ๋ค. ์์ Header์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉ ํ ๋์๋ Self Closingํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค.
3-2. ๊ผญ ๊ฐ์ธ์ ธ์ผํ๋ ํ๊ทธ
import React from "react";
import Header from "./Header";
function App (){
return (
<Hedader />
<div>Hello Everyone!</div>
)
}์์ ์ฝ๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.

<Header />์ปดํฌ๋ํธ์ <div></div>ํ๊ทธ๊ฐ ํ๋์ ํ๊ทธ๋ก ๊ฐ์ธ์ฌ์์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ ์ฃผ๋ก ๋ฆฌ์กํธ์ Fragment๋ผ๋ ๊ฒ์ ์ฌ์ฉํ๋ค. <React.Fragment></React.Fragmen>๋๋ <></>
import React from 'react';
import Header from './Header';
function App() {
return (
<React.Fragment>
<Hedader />
<div>Hello Everyone!</div>
</React.Fragment>
);
}์์ ์ฝ๋ ์ฒ๋ผ ํ๊ทธ๋ฅผ ์์ฑํ ๋ ์ด๋ฆ ์์ด ์์ฑ์ ํ๊ฒ ๋๋ฉด Fragment๊ฐ ๋ง๋ค์ด์ง๋๋ฐ, Fragment๋ ๋ธ๋ผ์ฐ์ ์์์ ๋ฐ๋ก ๋ณ๋์ ์๋ฆฌ๋จผํธ๋ก ๋ํ๋์ง ์๋๋ค.
3-3. JSX์์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ ์ฌ์ฉํ๊ธฐ
JSX๋ด๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์๋ฅผ ๋ณด์ฌ์ค์ผ ํ ๋์๋ {}์ผ๋ก ๊ฐ์ธ์ ๋ณด์ฌ์ค๋ค.
import React from 'react';
import Header from './Header';
function App() {
const name = 'HD';
const numArr = [1, 2, 3, 4, 5];
return (
<React.Fragment>
<Hedader />
<div>Hello {name}!</div>
<span>{numArr.map((num) => num)}</span>
{name === 'HD' ? <span>Welcome HD!</span> : null}
<img src={user.avatarUrl}></img>
</React.Fragment>
);
}3-4. style๊ณผ className
์ธ๋ผ์ธ ์คํ์ผ๋ก style๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ ๊ฐ์ฒด ํํ๋ก ์์ฑํด์ผ ํ๋ฉฐ, background-color์ฒ๋ผ -๋ก ๊ตฌ๋ถ๋์ด ์๋ ์ด๋ฆ๋ค์ backgroundColor์ฒ๋ผ camelCase ํํ๋ก ๋ค์ด๋ฐ ํด์ค์ผ ํ๋ค.
import React from 'react';
import Header from './Header';
function App() {
return (
<React.Fragment>
<Hedader />
<div
style={{
backgroundColor: 'black',
color: 'white',
padding: '10px 20px',
}}
>
Hellow Everyone!
</div>
</React.Fragment>
);
}class๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ ์คํ์ผ ์ํธ๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ HTML์์๋ class๋ผ๋ ์ดํธ๋ฆฌ๋ทฐํธ๋ฅผ ์ฌ์ฉํ๋๋ฐ JSX์์๋ className๋ฅผ ์ฌ์ฉํ๋ค.
/* App.css */
.gray-box {
background: gray;
width: 64px;
height: 64px;
}import React from 'react';
import Header from './Header';
import './App.css';
function App() {
return (
<React.Fragment>
<Hedader />
<div className="gray-box">Hellow Hellow Everyone!!</div>
</React.Fragment>
);
}3-5. ์ฃผ์
JSX ๋ด๋ถ์ ์ฃผ์์ {/* ๋ด์ฉ */}์ ํํ๋ก ์์ฑํ๋ค.
์ด๋ฆฌ๋ ํ๊ทธ ๋ด๋ถ์์๋ // ๋ด์ฉ ์ ํํ๋ก ์์ฑํ๋ค.
4. JSX์ ์ฅ์
๊ฐ๋ฐ์ ๊ฒฝํ(DX) ๊ฐ์ : ํํ๋ ฅ์ด ๋ฐ์ด๋ ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๋ค. XML๊ณผ ๋ฌธ๋ฒ์ด ์ ์ฌํ์ฌ ์ค์ฒฉ๋ ์ ์ธํ ๊ตฌ์กฐ๋ฅผ ๋ ์ ๋ํ๋ธ๋ค.
ํ์ ์์ฐ์ฑ ํฅ์: ์ ๋ฌธ ๊ฐ๋ฐ์ ์ธ์๋ ๊ฐ๋ฐ ์ง์์ด ์๋ ํ์์ด ์๋ค๋ฉด ์ง์ ์ฝ๋๋ฅผ ์์ ํ ์๋ ์๋ค. JSX๋ HTML๊ณผ ๋น์ทํ์ฌ ์ด๋ค์๊ฒ๋ ์น์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฌธ๋ฒ ์ค๋ฅ์ ์ฝ๋๋ ๊ฐ์: ์์ฑํด์ผ ํ ์ฝ๋๊ฐ ์ค์ด๋ค๋ฉฐ, ์ด๋ ๊ณง ์ค์๋ ๋ฐ๋ณต์ผ๋ก ์ธํ ์คํธ๋ ์ค๋ฅผ ์ค์ฌ์ค๋ค.
5. Conclusion
JSX์ ๊ณต๋ถ๋ ์์กฐ๋กญ๊ฒ ์ด๋ฃจ์ด์ก๋ค. ๋ฆฌ์กํธ๋ฅผ ๊ณต๋ถํ๊ณ ์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ง์ด ์ฌ์ฉํ๋ JSX์๊ธฐ ๋๋ฌธ์ด๋ค. ์๋ฌด๋ฐ ์๋ฌธ ์์ด "์ ๋ฆฌ์กํธ์์ ์ด๋ ๊ฒ ํด์ผ์ง" ํ๊ณ ์๊ฐํ๋ฉฐ ๋ณด๋ด์๊ณ ์์ผ๋ก๋ React๋ฅผ ๋ง์ด ์ฌ์ฉํ ์์ ์ด๋ฏ๋ก JSX๋ฅผ ์ ๋ค๋ฃจ์ด๋ณด์ ์ฒ์ JSX๋ฅผ ์ ํ์ ๋๋ ์๋ฌด๋ฐ ์ํ๊ฐ์ ๋๋ผ์ง ์์๋ค. "์ด๋ป๊ฒ ๋ณ์์ ํ๊ทธ๋ฅผ ํ ๋นํ ์ ์์ง?"๋ผ๋ ์๋ฌธ์กฐ์ฐจ๊ฐ ์์๋ค. ๋ฉํ์์ ์ ๋ง๋ค์ด ์ฃผ์์ผ๋ ์ ์จ์ผ๊ฒ ๋ค:)
์ฐธ๊ณ
JSX ์๊ฐ [React ๊ธฐ์ด] JSX๋? / JSX ๋ฌธ๋ฒ 4. JSX์ ๊ธฐ๋ณธ ๊ท์น ์์๋ณด๊ธฐ 3.1 JSX์ ์ ์์ ์ฅ์
๐ 2022-07-16
Last updated