JSX๋? (์ ์, ์ฅ์ , ๋ฌธ๋ฒ)
์๋ ๋ณ์ ์ ์ธ์ ์ดํด๋ด ์๋ค.
const element = <h1>Hello, world!</h1>;
์์ ํฌํํ ํ๊ทธ ๋ฌธ๋ฒ์ ๋ฌธ์์ด๋, HTML๋ ์๋๋๋ค.
JSX๋ผ ํ๋ฉฐ JavaScript๋ฅผ ํ์ฅํ ๋ฌธ๋ฒ์ ๋๋ค. UI๊ฐ ์ด๋ป๊ฒ ์๊ฒจ์ผ ํ๋์ง ์ค๋ช ํ๊ธฐ ์ํด React์ ํจ๊ป ์ฌ์ฉํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. JSX๋ผ๊ณ ํ๋ฉด ํ ํ๋ฆฟ ์ธ์ด๊ฐ ๋ ์ค๋ฅผ ์๋ ์์ง๋ง, JavaScript์ ๋ชจ๋ ๊ธฐ๋ฅ์ด ํฌํจ๋์ด ์์ต๋๋ค.
JSX๋ React “์๋ฆฌ๋จผํธ(element)” ๋ฅผ ์์ฑํฉ๋๋ค. ๋ค์ ์น์ ์์๋ DOM์ ์ด๋ป๊ฒ ๋ ๋๋งํ๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ์๋๋ฅผ ๋ณด๋ฉด JSX๋ฅผ ์์ํ๊ธฐ ์ํด ํ์ํ ๊ธฐ๋ณธ์ฌํญ์ ์ฐพ์ผ์ค ์ ์์ต๋๋ค.
1. JSX๋?
React์์๋ ๋ณธ์ง์ ์ผ๋ก ๋ ๋๋ง ๋ก์ง์ด UI ๋ก์ง(์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์, ์๊ฐ์ ๋ฐ๋ผ state๊ฐ ๋ณํ๋ ๋ฐฉ์, ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ ๋ฐฉ์ ๋ฑ)๊ณผ ์ฐ๊ฒฐ๋๋ค๋ ์ฌ์ค์ ๋ฐ์๋ค์ ๋๋ค.
React๋ ๋ณ๋์ ํ์ผ์ ๋งํฌ์ ๊ณผ ๋ก์ง์ ๋ฃ์ด ๊ธฐ์ ์ ์ธ์์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋์ , ๋ ๋ค ํฌํจํ๋ “์ปดํฌ๋ํธ”๋ผ๊ณ ๋ถ๋ฅด๋ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋ ์ ๋์ผ๋ก ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. ์ดํ ์น์ ์์ ๋ค์ ์ปดํฌ๋ํธ๋ก ๋์์ค๊ฒ ์ง๋ง, JS์ ๋งํฌ์ ์ ๋ฃ๋ ๊ฒ ์ต์ํด์ง์ง ์๋๋ค๋ฉด ์ด ์ด์ผ๊ธฐ๊ฐ ํ์ ์ ์ค ๊ฒ์ ๋๋ค.
React๋ JSX ์ฌ์ฉ์ด ํ์๊ฐ ์๋์ง๋ง, ๋๋ถ๋ถ์ ์ฌ๋์ JavaScript ์ฝ๋ ์์์ UI ๊ด๋ จ ์์ ์ ํ ๋ ์๊ฐ์ ์ผ๋ก ๋ ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ React๊ฐ ๋์ฑ ๋์์ด ๋๋ ์๋ฌ ๋ฐ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
์ผ๋จ ํ๋ฒ ์์ํด๋ณด๊ฒ ์ต๋๋ค!
JSX์ ํํ์ ํฌํจํ๊ธฐ
์๋ ์์์์๋ name์ด๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ ํ ์ค๊ดํธ๋ก ๊ฐ์ธ JSX ์์ ์ฌ์ฉํ์์ต๋๋ค.
const name = 'Josh Perez';const element = <h1>Hello, {name}</h1>;
ReactDOM.render(
element,
document.getElementById('root')
);
JSX์ ์ค๊ดํธ ์์๋ ์ ํจํ ๋ชจ๋ JavaScript ํํ์์ ๋ฃ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด 2 + 2, user.firstName ๋๋ formatName(user) ๋ฑ์ ๋ชจ๋ ์ ํจํ JavaScript ํํ์์ ๋๋ค.
์๋ ์์์์๋ JavaScript ํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ์ธ formatName(user)์ <h1> ์๋ฆฌ๋จผํธ์ ํฌํจํ์ต๋๋ค.
function formatName(user) {
return user.firstName + ' ' + user.lastName;
}
const user = {
firstName: 'Harper',
lastName: 'Perez'
};
const element = (
<h1>
Hello, {formatName(user)}! </h1>
);
ReactDOM.render(
element,
document.getElementById('root')
);
๊ฐ๋ ์ฑ์ ์ข๊ฒ ํ๊ธฐ ์ํด JSX๋ฅผ ์ฌ๋ฌ ์ค๋ก ๋๋ด์ต๋๋ค. ํ์๋ ์๋์ง๋ง, ์ด ์์ ์ ์ํํ ๋ ์๋ ์ธ๋ฏธ์ฝ๋ก ์ฝ์ ์ ํผํ๊ณ ์ ๊ดํธ๋ก ๋ฌถ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
JSX๋ ํํ์์ ๋๋ค
์ปดํ์ผ์ด ๋๋๋ฉด, JSX ํํ์์ด ์ ๊ท JavaScript ํจ์ ํธ์ถ์ด ๋๊ณ JavaScript ๊ฐ์ฒด๋ก ์ธ์๋ฉ๋๋ค.
์ฆ, JSX๋ฅผ if ๊ตฌ๋ฌธ ๋ฐ for loop ์์ ์ฌ์ฉํ๊ณ , ๋ณ์์ ํ ๋นํ๊ณ , ์ธ์๋ก์ ๋ฐ์๋ค์ด๊ณ , ํจ์๋ก๋ถํฐ ๋ฐํํ ์ ์์ต๋๋ค.
function getGreeting(user) {
if (user) {
return <h1>Hello, {formatName(user)}!</h1>; }
return <h1>Hello, Stranger.</h1>;}
JSX ์์ฑ ์ ์
์ดํธ๋ฆฌ๋ทฐํธ์ ๋ฐ์ดํ๋ฅผ ์ด์ฉํด ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ ์ํ ์ ์์ต๋๋ค.
const element = <div tabIndex="0"></div>;
์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ดํธ๋ฆฌ๋ทฐํธ์ JavaScript ํํ์์ ์ฝ์ ํ ์๋ ์์ต๋๋ค.
const element = <img src={user.avatarUrl}></img>;
์ดํธ๋ฆฌ๋ทฐํธ์ JavaScript ํํ์์ ์ฝ์ ํ ๋ ์ค๊ดํธ ์ฃผ๋ณ์ ๋ฐ์ดํ๋ฅผ ์ ๋ ฅํ์ง ๋ง์ธ์. ๋ฐ์ดํ(๋ฌธ์์ด ๊ฐ์ ์ฌ์ฉ) ๋๋ ์ค๊ดํธ(ํํ์์ ์ฌ์ฉ) ์ค ํ๋๋ง ์ฌ์ฉํ๊ณ , ๋์ผํ ์ดํธ๋ฆฌ๋ทฐํธ์ ๋ ๊ฐ์ง๋ฅผ ๋์์ ์ฌ์ฉํ๋ฉด ์ ๋ฉ๋๋ค.
๊ฒฝ๊ณ
JSX๋ HTML๋ณด๋ค๋ JavaScript์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์, React DOM์ HTML ์ดํธ๋ฆฌ๋ทฐํธ ์ด๋ฆ ๋์ camelCase ํ๋กํผํฐ ๋ช ๋ช ๊ท์น์ ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด, JSX์์ class๋ className๊ฐ ๋๊ณ tabindex๋ tabIndex๊ฐ ๋ฉ๋๋ค.
JSX๋ก ์์ ์ ์
ํ๊ทธ๊ฐ ๋น์ด์๋ค๋ฉด XML์ฒ๋ผ /> ๋ฅผ ์ด์ฉํด ๋ฐ๋ก ๋ซ์์ฃผ์ด์ผ ํฉ๋๋ค.
const element = <img src={user.avatarUrl} />;
JSX ํ๊ทธ๋ ์์์ ํฌํจํ ์ ์์ต๋๋ค.
const element = (
<div>
<h1>Hello!</h1>
<h2>Good to see you here.</h2>
</div>
);
JSX๋ ์ฃผ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํฉ๋๋ค
JSX์ ์ฌ์ฉ์ ์ ๋ ฅ์ ์ฝ์ ํ๋ ๊ฒ์ ์์ ํฉ๋๋ค.
const title = response.potentiallyMaliciousInput;
// ์ด๊ฒ์ ์์ ํฉ๋๋ค.
const element = <h1>{title}</h1>;
๊ธฐ๋ณธ์ ์ผ๋ก React DOM์ JSX์ ์ฝ์ ๋ ๋ชจ๋ ๊ฐ์ ๋ ๋๋งํ๊ธฐ ์ ์ ์ด์ค์ผ์ดํ ํ๋ฏ๋ก, ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ช ์์ ์ผ๋ก ์์ฑ๋์ง ์์ ๋ด์ฉ์ ์ฃผ์ ๋์ง ์์ต๋๋ค. ๋ชจ๋ ํญ๋ชฉ์ ๋ ๋๋ง ๋๊ธฐ ์ ์ ๋ฌธ์์ด๋ก ๋ณํ๋ฉ๋๋ค. ์ด๋ฐ ํน์ฑ์ผ๋ก ์ธํด XSS (cross-site-scripting) ๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
JSX๋ ๊ฐ์ฒด๋ฅผ ํํํฉ๋๋ค.
Babel์ JSX๋ฅผ React.createElement() ํธ์ถ๋ก ์ปดํ์ผํฉ๋๋ค.
๋ค์ ๋ ์์๋ ๋์ผํฉ๋๋ค.
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
React.createElement()๋ ๋ฒ๊ทธ๊ฐ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋๋ก ๋ช ๊ฐ์ง ๊ฒ์ฌ๋ฅผ ์ํํ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
// ์ฃผ์: ๋ค์ ๊ตฌ์กฐ๋ ๋จ์ํ๋์์ต๋๋ค
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};
์ด๋ฌํ ๊ฐ์ฒด๋ฅผ “React ์๋ฆฌ๋จผํธ”๋ผ๊ณ ํ๋ฉฐ, ํ๋ฉด์์ ๋ณด๊ณ ์ถ์ ๊ฒ์ ๋ํ๋ด๋ ํํ์ด๋ผ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. React๋ ์ด ๊ฐ์ฒด๋ฅผ ์ฝ์ด์, DOM์ ๊ตฌ์ฑํ๊ณ ์ต์ ์ํ๋ก ์ ์งํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
์ฐธ์กฐ : https://ko.reactjs.org/docs/hello-world.html
# React ๊ฐ๋ ์์ต์๊ฐ ์๋ค. ์ด๊ฑธ๋ก ๊ธฐ๋ณธ ๊ฐ๋ ๊ณต๋ถ ํ ์ ์๋ค.