3 minute read

๋ณธ ๊ฒŒ์‹œ๊ธ€์€ย ๋ฆฌ์•กํŠธ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฝ๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค.

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์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

Tags:

Categories:

Updated:

Leave a comment