ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [React ๊ณต์‹๋ฌธ์„œ ์ฝ๊ธฐ] Main Concepts 2. Introducing JSX
    web/React&Redux 2020. 2. 15. 23:54

    Introducing JSX

     

    const element = <h1>Hello, world!</h1>

     

    ๐Ÿ‘† ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ HTML์ด ๋งˆ๊ตฌ ๋’ค์„ž์—ฌ ์žˆ๋Š” ๋“ฏํ•œ ์š”์ƒํ•œ ๊ตฌ๋ฌธ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ
    ์ด ๋†ˆ์€ JSX๋‹ค.

     

    JSX๋Š” JavaScript์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋ฉฐ

    ๋ฆฌ์•กํŠธ์˜ UI๋ฅผ ๋ฌ˜์‚ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

    template language๋ฅผ ์ƒ๊ฐ๋‚˜๊ฒŒ ํ•˜์ง€๋งŒ JavaScript์ž„

    โ€ปํ…œํ”Œ๋ฆฟ ์–ธ์–ด๋ž€?

     

    JSX๋Š” React "elements"๋ฅผ ๋งŒ๋“ ๋‹ค.

    JSX์— ๋Œ€ํ•ด ์ข€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.


    Why JSX?

    ์šฐ์„ , JSX๊ฐ€ ๋ฆฌ์•กํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•„์ˆ˜์กฐ๊ฑด์€ ์•„๋‹ˆ๋‹ค.

     

    ๋ฆฌ์•กํŠธ ์ด์ „์— ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•

    ์ฆ‰, HTML๊ณผ JavaScript๋ฅผ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜๊ณ  <script>ํƒœ๊ทธ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€

    ๋งˆํฌ์—…(markup)๊ณผ ๋กœ์ง์„ ์„œ๋กœ ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์ˆ ์„ ์ธ์œ„์ ์œผ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค.

    ์–ด๋–ค ์—˜๋ฆฌ๋จผํŠธ์— ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ•œ ๋ˆˆ์— ์•Œ์•„๋ณด๊ธฐ ์–ด๋ ต๋‹ค.

     

    ๋ฐ˜๋ฉด์—

    ๋ฆฌ์•กํŠธ๋Š” ๋งˆํฌ์—…๊ณผ ๋กœ์ง์„ ๋ชจ๋‘ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์œ ๋‹›์ธ ์ปดํฌ๋„ŒํŠธ(Component)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ๋ฆฌ์•กํŠธ๋Š” ๋ Œ๋”๋ง ๋กœ์ง์ด ๋‹ค๋ฅธ UI๋กœ์ง

    (์–ด๋–ป๊ฒŒ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€, ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š”์ง€, ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋˜๊ธฐ ์ „ ์ค€๋น„๋˜๋Š”์ง€)

    ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

     

    JSX๋Š” JS์ฝ”๋“œ ๋‚ด์—์„œ UI๋ชจ์Šต์„ ์ง๊ด€์ ์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค.

    JSX๊ฐ€ ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ ๋ฆฌ์•กํŠธ๊ฐ€ ๋” ์œ ์šฉํ•œ ์—๋Ÿฌ, ๊ฒฝ๊ณ ๋ฉ”์„ธ์ง€๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.


    Embedding Expressions in JSX

    Q. JSX ์•ˆ์—์„œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด?

    const name = 'Josh Perez';
    
    const element = <h1>Hello, {name}</h1>; // ์ด๊ฒŒ JSX๋‹ค
    
    ReactDOM.render( element, document.getElementById('root') );

    A. { }(์ค‘๊ด„ํ˜ธ)๋กœ ๋ฌถ์–ด์ค€๋‹ค.


    ์œ„ ์ฝ”๋“œ๋Š” id๊ฐ€ root์ธ ์—˜๋ฆฌ๋จผํŠธ์— <h1>Hello, Josh Perez</h1>๋ฅผ ๋ Œ๋”ํ•œ๋‹ค.

     

    ๋ณ€์ˆ˜ ๋ฟ ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ‘œํ˜„(expression)์ด๋ผ๋ฉด ์ค‘๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด JSX์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

      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')
      );

    ๐Ÿ‘† ํ•จ์ˆ˜๋„ ์‹คํ–‰ ๊ฐ€๋Šฅ~


    ์œ„ ์ฝ”๋“œ๋Š” id๊ฐ€ root์ธ ์ž๋ฆฌ์— <h1>Hello, Harper Perez</h1>๋ฅผ ๋ Œ๋”ํ•œ๋‹ค.

     

    ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด JSX๋ฅผ ์—ฌ๋Ÿฌ ์ค„๋กœ ๋‚˜๋ˆŒ ๋•Œ,
    ์ž๋™ ;(์„ธ๋ฏธ์ฝœ๋ก ) ์‚ฝ์ž…์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ( ) ๊ด„ํ˜ธ๋กœ ๋ฌถ์–ด ์ฃผ๋ฉด ์ข‹๋‹ค.


    JSX๋„ expression์ด๋‹ค

    ์ปดํŒŒ์ผ ํ›„์—” JSX๋Š” ์ผ๋ฐ˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ๋˜๊ณ , ๊ฐ์ฒด๋กœ ํ‰๊ฐ€๋œ๋‹ค.
    if๋ฌธ๊ณผ for๋ฌธ ์•ˆ์—์„œ JSX๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ ,
    JSX๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹น, ์ธ์ž(argument)๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๋˜ ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด๊ฐ’์œผ๋กœ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

     

      function getGreeting(user) {
        if (user) {
          return <h1>Hello, {formatName(user)}!</h1>;
        }
        return <h1>Hello, Stranger.</h1>;
      }

     


    JSX ์†์„ฑ ์ง€์ •

    ์†์„ฑ ์ง€์ •ํ•  ๋•Œ "" ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ๋Š”๋ฐ

    const element = <div tabIndex="0"></div>;

     

    { } curly braces ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ expression์„ ์†์„ฑ์œผ๋กœ ๋„ฃ์–ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

    const element = <img src={user.avatarUrl}></img>;

     

     

    ๋ฌธ์ž์—ด์„ ๋„ฃ๊ณ  ์‹ถ์œผ๋ฉด ๋”ฐ์˜ดํ‘œ ์“ฐ๊ณ , expression์„ ๋„ฃ๊ณ  ์‹ถ์œผ๋ฉด ์ค‘๊ด„ํ˜ธ๋ฅผ ์“ด๋‹ค.

    ํ•˜๋‚˜์˜ ์†์„ฑ์— ๋‘ ๊ฐœ์˜ ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜๋Š” ์—†๋‹ค.

     

    ์ฃผ์˜

    JSX๋Š” HTML๋ณด๋‹จ JavaScript์— ๋” ๊ฐ€๊น๊ธฐ ๋•Œ๋ฌธ์—,
    React DOM์€ ์นด๋ฉœ์ผ€์ด์Šค(camelCase)๋กœ ์†์„ฑ ์ด๋ฆ„์„ ์ง“๋Š”๋‹ค.
    ์˜ˆ) JSX์—์„œ๋Š” class๋ฅผ className์œผ๋กœ ์‚ฌ์šฉ, tabindex -> tabIndex


    Specifying Children with JSX

    XML์ฒ˜๋Ÿผ ๋ฐ”๋กœ ๋‹ซ์•„๋„ ๋œ๋‹ค.

      const element = <img src={user.avatarUrl} />; 

     

    JSX๋„ children์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

      const element = (
        <div>
          <h1>Hello!</h1>
          <h2>Good to see you here.</h2>
        </div>
      );

    JSX Prevents Injection Attacks

    ์‚ฌ์šฉ์ž input์„ JSX์— ๋„ฃ๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜๋‹ค.

      const title = response.potentiallyMaliciousInput;
      // This is safe:
      const element = <h1>{title}</h1>;

     

    ๊ธฐ๋ณธ์ ์œผ๋กœ React DOM ์€ JSX์— ํฌํ•จ ๋œ ๊ฐ’์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์— ์ด์Šค์ผ€์ดํ”„ ํ•œ๋‹ค.

    (escapeํ•˜๋Š” ๊ฒŒ ๋ญ”์ง€ ๋ชจ๋ฅด๊ฒ ์Œ)

    ๋”ฐ๋ผ์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ์ฃผ์ž… ํ•  ์ˆ˜ ์—†๋‹ค.

    ๋ชจ๋“  ๊ฒƒ์ด ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

    ์ด๋ฅผ ํ†ตํ•ด XSS(cross-site-scripting)๊ณต๊ฒฉ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

    (์™œ ๋ Œ๋”๋˜๊ธฐ ์ „์— ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜๋ฉด XSS ๋ง‰์„ ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Œ)


    JSX Represents Objects

    Babel compiles JSX down to React.createElement() calls.

    These two examples are identical:

      const element = (
        <h1 className="greeting">
          Hello, world!
        </h1>
      );
      const element = React.createElement(
        'h1',
        {className: 'greeting'},
        'Hello, world!'
      );

    React.createElement() performs a few checks to help you write bug-free code but essentially it creates an object like this:

      // Note: this structure is simplified
      const element = {
        type: 'h1',
        props: {
          className: 'greeting',
          children: 'Hello, world!'
        }
      };

    These objects are called “React elements”. You can think of them as descriptions of what you want to see on the screen. React reads these objects and uses them to construct the DOM and keep it up to date.

    We will explore rendering React elements to the DOM in the next section.

     

    Tip:

    We recommend using the “Babel” language definition for your editor of choice so that both ES6 and JSX code is properly highlighted.

Designed by Tistory.