[React] JSX ์ ์ ๋ฐ ๋ฌธ๋ฒ
๐ JSX (Javascript XML)๋?
• Javascript ์ XML์ ์ถ๊ฐํด ์๋ฆฌ๋จผํธ๋ฅผ ์์ฑํ๋ ๋ฌธ๋ฒ
๋ฆฌ์กํธ์์ 'JSX' ๋ผ๋ ํน๋ณํ ๋ฌธ๋ฒ์ผ๋ก ์๋ฆฌ๋จผํธ๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ์์๊ฒ UI๊ฐ ์ค์ ๋ก ์ด๋ป๊ฒ ํํ๋ ๊ฒ์ธ์ง ๋ํ๋ ๋๋ค. JSX๋ Javascript์ XML์ ์ถ๊ฐํ Javascript๋ฅผ ํ์ฅํ ๋ฌธ๋ฒ์ผ๋ก, ๊ณต์์ ์ธ ์๋ฐ ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์๋๋๋ค. ํ์ง๋ง ๊ฐ๋ ์ฑ์ด ๋๊ณ ์ดํดํ๊ธฐ ์ฌ์ด, ๋ฆฌ์กํธ๋ง์ ํน๋ณํ ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ๋๋ค.
์๋๋ ๋ฆฌ์กํธ์์ App.js ์ JSX๋ก "Hello! React"๋ฅผ ํ๋ฉด์ ๋ํ๋ด๋ ์ฝ๋์ ๋๋ค.
function App() {
const HelloBlock = <h1>Hello React!</h1>;
return(
<div>
{HelloBlock}
</div>
);
}
์ฌ๊ธฐ์ "Hello! React" ๊ฐ ๋ง์น XML ์ฝ๋์ฒ๋ผ <h1></h1> ํ๊ทธ์ ๊ฐ์ธ์ ธ ์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ XMLํ๊ทธ๋ก ๊ฐ์ธ๋ฏ HTML ํ๊ทธ๋ก ๊ฐ์ธ "์๋ฆฌ๋จผํธ(element)"๋ฅผ ๋ง๋๋ ๋ฌธ๋ฒ์ JSX ๋ฌธ๋ฒ์ด๋ผ๊ณ ํฉ๋๋ค.
const HelloBlock = <h1> Hello! React </h1>
์ค์ ๋ธ๋ผ์ฐ์ ์์ HTML ์์๋ ์๋์ ๊ฐ์ด ๋ํ๋ฉ๋๋ค. <div><h1> Hello React! </h1></div> ํ๊ทธ๋ก ํํ๋ ๊ฒ์ด ๋ณด์ด์๋์?
JSX๋ก const ๋ณ์์ "Hello React"๋ฅผ ์ ์ธํ๋๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์ด๋ป๊ฒ ์ค์ HTML ์ฝ๋๋ก ํํ๋ ๊น์?
์ฐ๋ฆฌ๊ฐ ์ ์ธํ JSX๋, ๋ธ๋ผ์ฐ์ ์ ์คํ๋๊ธฐ ์ ์ ์ฝ๋๊ฐ ๋ฒ๋ค๋ง๋๋ ๊ณผ์ ์์, "๋ฐ๋ฒจ(Babel)"์ ์ฌ์ฉํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํด ๊ฐ๋ฅํ, ์ผ๋ฐ์ ์ธ ์๋ฐ ์คํฌ๋ฆฝํธ๋ก ํํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ฒจ ๊ณต์ ๋ฌธ์ ์ฐธ๊ณ
๐ JSX ๋ฌธ๋ฒ
โก ๋ฐ๋์ ๋ถ๋ชจ ์์ ํ๋๊ฐ ๊ฐ์ธ๋ ํํ
์ฌ๋ฌ๋ถ์ด ์ ์ธํ ์ปดํฌ๋ํธ ์์ ์ฌ๋ฌ ๊ฐ์ง ํ๊ทธ๊ฐ ์๋ค๋ฉด ๋ฐ๋์ <div> ๋๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ ๋ฑ์ ๋ถ๋ชจ ์์ ํ๋๋ก ๊ฐ์ธ์ผ ํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๋ฐ๋์ ๋ถ๋ชจ ์์๊ฐ ํ์ํ ๊น์? ๋ฐ๋์์๋ ์ด์ ๊ฐ ์์ต๋๋ค. ๊ทธ ์ด์ ๋ Virtual DOM์ด ์ปดํฌ๋ํธ์ ๋ณ๊ฒฝ์ ๋น ๋ฅด๊ฒ ๊ฐ์ง ํ์ฌ ๋น๊ต ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋์ด ์๊ณ , DOM์ "ํธ๋ฆฌ ํํ"๋ก ๋์ด ์๊ธฐ ๋๋ฌธ์, ๋ฐ๋์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ํ์ํฉ๋๋ค.
โป ๋ฆฌ์กํธ 16ver ์ด์์ Fragment ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋ฐ๋์ div ๋ก ๊ฐ์ธ์ง ์์๋ ๋๋ฉฐ, Fragment๋ก ๊ฐ์ธ๋ฉด ๋ฉ๋๋ค.
• ์ ์ ์ฝ๋ : h1, h2ํ๊ทธ๊ฐ div ์ฝ๋๋ก ๊ฐ์ธ์ง ํํ
function App() {
return(
<div>
<h1>Hello</h1>
<h2>React</h2>
</div>
);
}
• ์๋ฌ ์ฝ๋ : h1, h2ํ๊ทธ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์ธ๋ ํํ
๋ถ๋ชจ๋ก ๊ฐ์ธ์ง์ง ์์ ๊ฒฝ์ฐ, ์ฝ๋๊ฐ ์ ๋๋ก ์๋ํ์ง ์๊ณ ์๋์ ๊ฐ์ด ์ค๋ฅ๊ฐ ๋ํ๋ ๊ฒ์ ๋๋ค.
function App() {
return(
<h1>Hello</h1>
<h2>React</h2>
);
}
โก ์๋ฐ์คํฌ๋ฆฝํธ ํํ์
๋ฆฌ์กํธ์์ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์ ์์ฑํ๋ ค๋ฉด JSX ๋ด๋ถ์์ { } ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ธ๋ฉด ๋ฉ๋๋ค.
function App() {
const name = 'Hello React!';
return(
<div> {name} </div>
);
}
โก ์กฐ๊ฑด๋ถ ์ฐ์ฐ์
์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๋ค๋ณด๋ฉด ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ ๋๋งํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ด ๋ฐ์ํฉ๋๋ค. ๋ฆฌ์กํธ์์ JSX๋ If๋ฌธ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์, ์กฐ๊ฑด๋ถ(์ผํญ) ์ฐ์ฐ์๋ก ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ ๋๋งํด์ผ ํฉ๋๋ค. ์๋๋ ์กฐ๊ฑด์ ์ฌ์ฉ๋๋ ์ผํญ ์ฐ์ฐ์, AND ์ฐ์ฐ์, OR ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค :D
• If ๋ฌธ ์ฌ์ฉํ๊ธฐ
๋ฆฌ์กํธ์์ if๋ฌธ์ { } ์์์ ์ผํญ ์ฐ์ฐ์๋ก ๋ํ๋ด๋ฉด ๋ฉ๋๋ค.
์ผํญ ์ฐ์ฐ์๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ if ... else ๊ตฌ๋ฌธ์ ๋์ฒด์ฌ๋ก ๋ง์ด ์ฌ์ฉ๋๋ ๋ฐ์. ์์์ ๋ถํฐ ์กฐ๊ฑด๋ฌธ, ๋ฌผ์ํ(?), ์กฐ๊ฑด๋ฌธ์ด ์ฐธ์ผ ๊ฒฝ์ฐ ์คํํ ํํ์, ์ฝ๋ก (:), ์กฐ๊ฑด๋ฌธ์ด ๊ฑฐ์ง์ผ ๊ฒฝ์ฐ ์คํํ ํํ์์ผ๋ก ๋ํ๋ ๋๋ค.
์กฐ๊ฑด๋ฌธ ? truthy์ผ ๊ฒฝ์ฐ ์คํํ ํํ์ : falsy์ผ ๊ฒฝ์ฐ ์คํํ ํํ์
{name === 'Hello React!' ? <h1>ํฌ๋ก ๋ฆฌ์กํธ</h1> : <h1>๋ฐ์ด ๋ฆฌ์กํธ</h1>}
• AND ์ฐ์ฐ์
๋ฆฌ์กํธ์์ AND ์ฐ์ฐ์๋ '&&'์ ์ฌ์ฉํด ๋ํ๋ ๋๋ค.
A์ B ๊ฐ ๋๋ค True ์ผ ๋๋ง ์์ด ์ฑ๋ฆฝ๋๋ฉฐ, A์ B์ค ํ๋๋ผ๋ False ํ ๊ฒฝ์ฐ null๊ณผ ๊ฐ์ด ๊ฐ์ด ์๋ฌด๊ฒ๋ ์ถ๋ ฅ๋์ง ์์ต๋๋ค.
A && B
{'Hello world' && <h1>Hello world</h1>} //true
const name = 'Hello React';
{name == 'Hello world' && <h1>Hello world</h1>} //false
• OR ์ฐ์ฐ์
๋ฆฌ์กํธ์์ OR์ฐ์ฐ์๋ '||' ์ ์ฌ์ฉํด ๋ํ๋ ๋๋ค.
OR์ฐ์ฐ์๋ A์ B ์ค ํ๋๋ง True ๋ผ๋ฉด ์์ด ์ฑ๋ฆฝ๋ฉ๋๋ค.
A || B
์๋ ํํ์์์ <h1></h1> ์์ ๊ฐ์ True ์ด๊ธฐ ๋๋ฌธ์ ํ๋ฉด์๋ "Hello World"๊ฐ ์ถ๋ ฅ๋๋๋ฐ์.
const name = 'Hello React';
{name == 'Hello world' || <h1>Hello world</h1>} //true
undefined, null ๊ฐ์ธ ๊ฒฝ์ฐ ๋ณด์ฌ์ฃผ๊ณ ์ถ์ ๋ฌธ๊ตฌ๊ฐ ์๋ค! ์ถ์ผ๋ฉด OR์ฐ์ฐ์๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
{undefined || <h1>undefined ์
๋๋ค.</h1>}
โก JSX ์คํ์ผ๋ง
• ์ธ๋ผ์ธ ์คํ์ผ๋ง
์๋ฐ์คํฌ๋ฆฝํธ์์ style ํ๊ทธ ์์ style="" ์ผ๋ก ์ธ๋ผ์ธ ์คํ์ผ์ ์ ์ธํ์ฌ ์ฌ์ฉํ๊ธฐ๋ ํ๋๋ฐ์.
JSX์์๋ ์ธ๋ผ์ธ ์คํ์ผ๋ง์ ์ฌ์ฉํ ์ ์์ง๋ง, ๋ฌธ์์ด์ด ์๋ "๊ฐ์ฒด" ํํ๋ก ์ฌ์ฉํด์ผ ํฉ๋๋ค :D
๋ง์ฝ background ์์์ yellow ๋ก ์ง์ ํ๊ณ ์ถ๋ค๋ฉด ๊ธฐ์กด HTML ํ๊ทธ์์๋ ์๋์ฒ๋ผ ์ฌ์ฉํ๋ค๋ฉด,
<div style="background-color:'yellow'"></div>
JSX์์๋ "๊ฐ์ฒด"๋ก ํํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋์ฒ๋ผ ํด์ผํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์, JSX๋ "์นด๋ฉ ํ๊ธฐ๋ฒ(CamelCase)"์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ background-color๊ฐ ์๋ backgroundColor๋ก ์ ์ธํฉ๋๋ค.
const myStyle={
backgroundColor : 'yellow'
};
<div style={myStyle}></div>
• class๋ NO, className์ OK
์ผ๋ฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ์์ div์ class ์์ฑ์ ์ง์ ํ ๋๋ <div class="myClass"></div> ๋ก ์ ์ธํ๊ธฐ๋ ํ๋๋ฐ์.
JSX ์์๋ className ์ด๋ผ๋ ์์ฑ์ ์ฌ์ฉํด class ๋ฅผ ์ง์ ํ๋๋ฐ์. class๊ฐ ์๋ className์ ์ฐ๋ ์ด์ ๋ ๋ฆฌ์กํธ์์ class๋ ์ด๋ฏธ ์ง์ ๋์ด ์๋ ์์ฝ์ด์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
<div className="myStyle">
<h1>Hello React!</h1>
</div>