๋ณธ ๊ฒ์๊ธ์ย ๋ฆฌ์กํธ ๊ณต์๋ฌธ์๋ฅผ ์ฝ๊ณ ์ ๋ฆฌํ ๊ธ์ด๋ค.
JSX๋?
1
| const element = <h1>Hello, world!</h1>;
|
-
์์ ํ๊ทธ ๋ฌธ๋ฒ์ ๋ฌธ์์ด๋, HTML๋ ์๋๋ค. ์ด ํ๊ทธ ๋ฌธ๋ฒ์ JSX๋ผ ํ๋ฉฐ JavaScript์ XML์ ์ถ๊ฐํ์ฌ ํ์ฅํ ๋ฌธ๋ฒ์ด๋ค.
๋ธ๋ผ์ฐ์ ์์ ์คํ๋๊ธฐ ์ ์ ๋ฐ๋ฒจ์ ํตํด ์ผ๋ฐ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ก ๋ณํ๋๋ฉฐ ๊ณต์์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ๋ฒ์ ์๋๋ค.
-
React๋ ๋ณธ์ง์ ์ผ๋ก ๋ ๋๋ง ๋ก์ง์ด UI๋ก์ง๊ณผ ์ฐ๊ฒฐ๋๋๋ฐ, ๋ณ๋์ ํ์ผ์ ๋งํฌ์
๊ณผ ๋ก์ง์ ๋ฃ์ด ๊ธฐ์ ์ ์ธ์์ ์ผ๋ก ๋ถ๋ฆฌํ๋ ๋์ , ๋งํฌ์
๊ณผ ๋ก์ง์ ๋ชจ๋ ํฌํจํ๋ ์ปดํฌ๋ํธ ํํ๋ก ๊ตฌ์ฑํ ์ ์๋ค.
-
์ฌ๊ธฐ์ UI๋ก์ง์ด๋, ์ด๋ฒคํธ๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์, ์๊ฐ์ ๋ฐ๋ผ state๊ฐ ๋ณํ๋ ๋ฐฉ์, ํ๋ฉด์ ํ์ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๊ฐ ์ค๋น๋๋ ๋ฐฉ์ ๋ฑ์ ๋งํ๋๋ฐ, React์์๋ JSX๊ฐ ํ์๋ ์๋์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋ ์์์ UI๊ด๋ จ ์์
์ ํ ๋ ๋์์ด ๋ ์ ์๊ณ React๊ฐ ๋์ฑ ๋์์ด ๋๋ ์๋ฌ ๋ฐ ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ํ์ํ ์ ์๊ฒ ํด์ค๋ค. ๋ผ๊ณ ๊ณต์ ๋ฌธ์์ ๋์์์ง๋ง ๋ฌด์จ ๋ง์ธ์ง ์ดํด ํ๊ธฐ ์ด๋ ต๋ค. ์ฝ๊ฒ ๋งํด React์์ Virural DOM์ ๋ง๋ค ๋ ํธํ๊ฒ ์ฝ๋ฉํ ์ ์๊ฒ HTML์ฒ๋ผ ์์ฑ ํ ์ ์๊ฒ ๋์์ฃผ๋ ํ
ํ๋ฆฟ ์ธ์ด ๋น์ทํ ๊ฒ ์ด๋ผ๊ณ ์ดํด ํ๋ฉด ์ฌ์ธ ๊ฒ ๊ฐ๋ค.
๐คXML(Extensible Markup Language) ์ด๋?
: ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๋ ๊ท์น์ ์ ๊ณตํ๋ ๋งํฌ์
์ธ์ด์ด๋ค. ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌ๋ฆฌ XML์ ์์ฒด์ ์ผ๋ก ์์
์ ์ํํ ์ ์์ง๋ง ๊ตฌ์กฐ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋๋ ์ํํธ์จ์ด๋ฅผ ๊ตฌํํ ์ ์๋ค.
JSX์ ํํ์ ํฌํจํ๊ธฐ
1
2
3
4
| const name = "Tami Kim";
const element = <h1>Hello, {name}</h1>;
ReactDOM.render(element, document.getElementById("root"));
|
- ์ ์์๋
name
์ด๋ผ๋ ๋ณ์๋ฅผ ์ ์ธํ ํ ์ค๊ดํธ๋ก ๊ฐ์ธ JSX ์์ ์ฌ์ฉํ๋ ์๋ก, JSX์ ์ค๊ดํธ ์์๋ ์ ํจํ ๋ชจ๋ ย JavaScript ํํ์์ ๋ฃ์ ์ ์๋ค. ๋ฌธ์ด ์๋ ํํ์์ด๋ผ๋ ์ ์ ์ ์ํ์.
1
2
3
4
5
6
7
8
9
10
11
12
| function formatName(user) {
return user.firstName + " " + user.lastName;
}
const user = {
firstName: "Tami",
lastName: "Kim",
};
const element = <h1>Hello, {formatName(user)}!</h1>;
ReactDOM.render(element, document.getElementById("root"));
|
- ์ ์์์์๋ JSํจ์ ํธ์ถ์ ๊ฒฐ๊ณผ์ธ
formatName(user)
์ย <h1>
ย ์๋ฆฌ๋จผํธ์ ํฌํจํ๋ค. ์์ ๊ฐ์ด element์ JSX๋ฅผ ์ฌ๋ฌ ์ค๋ก ๋๋๋, ์๋ ์ธ๋ฏธ์ฝ๋ก ์ฝ์
์ ํผํ๊ธฐ ์ํด ๊ดํธ๋ก ๋ฌถ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
JSX๋ ํํ์์ด๋ค
์ปดํ์ผ์ด ๋๋๋ฉด JSX ํํ์์ด ์ ๊ท JavaScript ํจ์๊ฐ ํธ์ถ๋๊ณ JavaScript ๊ฐ์ฒด๋ก ์ธ์ํ๋ค.
์ฆ, JSX๋ฅผ if
๊ตฌ๋ฌธ ๋ฐ for
loop์์ ์ฌ์ฉํ๊ณ , ๋ณ์์ ํ ๋นํ๊ณ , ์ธ์๋ก์ ๋ฐ์๋ค์ด๊ณ , ํจ์๋ก ๋ถํฐ ๋ฐํํ ์ ์๋ค
1
2
3
4
5
6
| const getGreeting = (user) => {
if (user) {
return <h1>Hello, {formatName(user)}!</h1>;
}
return <h1>Hello, Stranger.</h1>;
};
|
JSX ์์ฑ ์ ์์ ์์ ์ ์
์์ฑ ์ ์
1
| const element = <a href="https://www.reactjs.org"> link </a>;
|
- JSX๋ ์ ์ฝ๋์ ๊ฐ์ด ์์ฑ์ ๋ฐ์ดํโโ๋ฅผ ์ด์ฉํด ๋ฌธ์์ด ๋ฆฌํฐ๋ด์ ์ ์ํ ์ ์๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ด ์ค๊ดํธ{}๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ์ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์ ์ฝ์
ํ ์๋ ์๋ค.
1
| const element = <img src={user.avatarUrl}></img>;
|
- JSX์ ์์ฑ์ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์์ ์ฝ์
ํ๋ ๊ฒฝ์ฐ์๋ ์ค๊ดํธ๋ฅผ ๋ฐ์ดํโโ๋ก ๊ฐ์ธ๋ฉด ์๋๋๋ฐ,ย ํํ์ด์ง์ ๊ด๋ จ ๋ฌธ์์๋ ๋ฐ์ดํ ๋๋ ์ค๊ดํธ ์ค ํ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์๋ด๋์ด ์๋ค.
- ์ฐธ๊ณ ๋ก ์์ฑ์ ์ฌ์ฉํ ๋ JSX๋ HTML๋ณด๋ค๋ JavaScript์ ๊ฐ๊น๊ธฐ ๋๋ฌธ์, React DOM์ HTML ์์ฑ์ ์ด๋ฆ ๋์ ์นด๋ฉ์ผ์ด์ค ํ๋กํผํฐ ๋ช
๋ช
๊ท์น์ ์ฌ์ฉํ๋ค. ์๋ฅผ ๋ค์ด, JSX์์
class
๋ className
์ผ๋ก, tabindex
๋ย tabIndex
์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
์์ ์ ์
1
| const element = <img src={user.avatarUrl} />;
|
- ์ ์ฝ๋์ ๊ฐ์ด JSX ๋ฌธ๋ฒ์์ ํ๊ทธ๊ฐ ๋น์ด์๋ ๊ฒฝ์ฐ์ XML์ฒ๋ผย
/>
๋ฅผ ์ด์ฉํด ๋ฐ๋ก ๋ซ์์ฃผ์ด์ผ ํ๋ค. ๋ง์ฝ ์์ ์์๊ฐ ์๋ค๋ฉด ๋ค์ ์ฝ๋์ ๊ฐ์ด ์์์ ํฌํจ์ํฌ ์ ์๋ค.
1
2
3
4
5
6
| const element = (
<div>
<h1>Hello!</h1>
<h2>Good to see you here.</h2>
</div>
);
|
JSX์ ํน์ง
์ฃผ์
๊ณต๊ฒฉ ๋ฐฉ์ง
- JSX์์ ์ฌ์ฉ์ ์
๋ ฅ์ ๋ฐ์ ์ฝ๋์ ์ฝ์
ํ๋ ๊ฒ์ ์์ ํ๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก React DOM์ JSX์ ์ฝ์
๋ ๋ชจ๋ ๊ฐ์ ๋ ๋๋ง ํ๊ธฐ ์ ์ ์ด์ค์ผ์ดํ ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ๋๋ฌธ์, ์ฑ์์ ๋ช
์์ ์ผ๋ก ์์ฑ๋์ง ์์ ๋ด์ฉ์ ์ฃผ์
๋์ง ์๊ณ , ๋ชจ๋ ํญ๋ชฉ์ ๋ ๋๋ง ๋๊ธฐ ์ ์ ๋ฌธ์์ด๋ก ๋ณํ๋๋๋ฐ, JSX๋ ์ด๋ฐ ํน์ฑ์ผ๋ก ์ธํดย XSS (cross-site-scripting)๊ณต๊ฒฉ์ ๋ฐฉ์งํ ์ ์๋ค.
1
2
| const title = response.potentiallyMaliciousInput;
const element = <h1>{title}</h1>; // ์์ ํ ์ฝ๋
|
๊ฐ์ฒด ํํ
- Babel์ JSX๋ฅผย
React.createElement()
ํธ์ถ๋ก ์ปดํ์ผํ๋๋ฐ, ๋ค์์ ๋ ์์ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ค๋ค.
1
| const element = <h1 className="greeting">Hello, world!</h1>;
|
1
2
3
4
5
| const element = React.createElement(
"h1",
{ className: "greeting" },
"Hello, world!"
);
|
React.createElement()
๋ ๋ฒ๊ทธ๊ฐ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋๋ฐ ๋์์ด ๋๋๋ก ๋ช ๊ฐ์ง ๊ฒ์ฌ๋ฅผ ์ํํ๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
1
2
3
4
5
6
7
| const element = {
type: "h1",
props: {
className: "greeting",
children: "Hello, world!",
},
};
|
- ์ด๋ ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๋ โReact ์๋ฆฌ๋จผํธโ๋ผ๊ณ ํ๋๋ฐ, ํ๋ฉด์ UI๋ฅผ ๋ํ๋ด๋ ํํ ๊ฐ์ฒด๋ผ๊ณ ํ ์ ์๋ค. React๋ ์ด ๊ฐ์ฒด๋ฅผ ์ฝ์ด์ DOM์ ๊ตฌ์ฑํ๊ณ ์ต์ ์ํ๋ก ์ ์งํ๋๋ฐ ์ฌ์ฉํ๋ค.
Leave a comment