JSX

1. ๊ฐœ์š”

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

์œ„์˜ ํƒœ๊ทธ ๋ฌธ๋ฒ•์€ ๋ฌธ์ž์—ด๋„, HTML๋„ ์•„๋‹ˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ์—๋Š” ํ•œ ๋ฒˆ๋„ ๋ณธ ์ ์ด ์—†๋Š” ํ˜•ํƒœ์˜ ๋ฌธ๋ฒ•์ด๋‹ค. ์œ„์™€ ๊ฐ™์€ ๋ฌธ๋ฒ•์„ JSX์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ๋ฒ•์ด๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ๋Š” UI๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒจ์•ผ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ JSX์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด ์ˆ™์ง€ํ•ด์•ผ ํ•œ๋‹ค.


2. JSX๋ž€?

XML๊ณผ ๋งค์šฐ ๋น„์Šทํ•˜๊ฒŒ ์ƒ๊ธด JSX๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ™•์žฅ ๋ฌธ๋ฒ•์ด๋‹ค. ์ด๋Ÿฌํ•œ JSX์˜ ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜๊ธฐ ์ „ ์ฝ”๋“œ๊ฐ€ ๋ฒˆ๋“ค๋ง๋˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ”๋ฒจ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

function App() {
  return <div>Hello World!</div>;
}

์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€ํ™˜๋œ๋‹ค.

function App() {
  return React.createElement('h1', null, 'Hello World!');
}

์œ„์˜ ๋‘ ๊ฐœ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด JSX์˜ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ์ง๊ด€์ ์œผ๋กœ ๋Š๊ปด์ง„๋‹ค. ๋งŒ์•ฝ React.createElementํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค๋ฉด ๋งค์šฐ ๋ถˆํŽธํ•  ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋Œ€๋กœ JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋งค์šฐ ํŽธํ•˜๊ฒŒ UI๋ฅผ ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

JSX๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ธ๊ฐ€? NO! JSX๋Š” ๋ฆฌ์•กํŠธ๋กœ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๊ณต์‹์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์ด ์•„๋‹ˆ๋‹ค. ๋ฐ”๋ฒจ์—์„œ ์—ฌ๋Ÿฌ ๋ฌธ๋ฒ•์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก preset ๋ฐ plugin์„ ์„ค์ •ํ•œ๋‹ค. ๋ฐ”๋ฒจ์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋“ค์ด ์ž„์˜๋กœ ๋งŒ๋“  ๋ฌธ๋ฒ•, ํ˜น์€ ์ฐจ๊ธฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Babel์€ ๋ฌด์—‡์ธ๊ฐ€? Babel์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ฌธ๋ฒ•์„ ํ™•์žฅํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. ์•„์ง ์ง€์›๋˜์ง€ ์•Š๋Š” ์ตœ์‹  ๋ฌธ๋ฒ•์ด๋‚˜, ํŽธ์˜์ƒ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์‹คํ—˜์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•๋“ค์„ ์ •์‹ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์คŒ์œผ๋กœ์จ ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ๋„ ์ œ๋Œ€๋กœ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. $ npx create-react-app์„ ์‹คํ–‰ํ•  ๊ฒฝ์šฐ babel๋ฅผ ๋ณ„๋„๋กœ ์„ค์ •์„ ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. Babel Babel ์‚ฌ์šฉํ•ด๋ณด๊ธฐ


3. JSX์˜ ๊ธฐ๋ณธ ๊ทœ์น™

JSX๊ฐ€ JavaScript๋กœ ์ œ๋Œ€๋กœ ๋ณ€ํ™˜๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š”(์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ๋Š”) ์ง€์ผœ์•ผํ•  ๋ช‡ ๊ฐ€์ง€ ๊ทœ์น™์ด์žˆ๋‹ค.


3-1. ๊ผญ ๋‹ซํ˜€์•ผ ํ•˜๋Š” ํƒœ๊ทธ

import React from "react";
import Header from "./Header";

function App() {
  return (
    <div>
      <Header />
      <div>
    </div>
  );
}

์œ„์˜ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

<Header />์ปดํฌ๋„ŒํŠธ ์•„๋ž˜ ์ค„์— ์žˆ๋Š” <div>ํƒœ๊ทธ๊ฐ€ ๋‹ซํ˜€์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

HTML์—์„œ๋Š” input ๋˜๋Š” brํƒœ๊ทธ๋ฅผ ํ•  ๋•Œ ๋‹ซ์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•˜๋Š”๋ฐ ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋‹ซ์•„์•ผ ํ•œ๋‹ค. ํƒœ๊ทธ์™€ ํƒœ๊ทธ ์‚ฌ์ด์— ๋‚ด์šฉ(์š”์†Œ)์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์„ ๋•Œ, Self Closingํƒœ๊ทธ ๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์œ„์˜ Header์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉ ํ•  ๋•Œ์—๋„ Self Closingํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.


3-2. ๊ผญ ๊ฐ์‹ธ์ ธ์•ผํ•˜๋Š” ํƒœ๊ทธ

import React from "react";
import Header from "./Header";

function App (){
    return (
        <Hedader />
        <div>Hello Everyone!</div>
    )
}

์œ„์˜ ์ฝ”๋“œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

<Header />์ปดํฌ๋„ŒํŠธ์™€ <div></div>ํƒœ๊ทธ๊ฐ€ ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์—ฌ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋•Œ ์ฃผ๋กœ ๋ฆฌ์•กํŠธ์˜ Fragment๋ผ๋Š” ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค. <React.Fragment></React.Fragmen>๋˜๋Š” <></>

import React from 'react';
import Header from './Header';

function App() {
  return (
    <React.Fragment>
      <Hedader />
      <div>Hello Everyone!</div>
    </React.Fragment>
  );
}

์œ„์˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ ํƒœ๊ทธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์ด๋ฆ„ ์—†์ด ์ž‘์„ฑ์„ ํ•˜๊ฒŒ ๋˜๋ฉด Fragment๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ, Fragment๋Š” ๋ธŒ๋ผ์šฐ์ € ์ƒ์—์„œ ๋”ฐ๋กœ ๋ณ„๋„์˜ ์—˜๋ฆฌ๋จผํŠธ๋กœ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค.


3-3. JSX์•ˆ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ’ ์‚ฌ์šฉํ•˜๊ธฐ

JSX๋‚ด๋ถ€์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜๋ฅผ ๋ณด์—ฌ์ค˜์•ผ ํ•  ๋•Œ์—๋Š” {}์œผ๋กœ ๊ฐ์‹ธ์„œ ๋ณด์—ฌ์ค€๋‹ค.

import React from 'react';
import Header from './Header';

function App() {
  const name = 'HD';
  const numArr = [1, 2, 3, 4, 5];
  return (
    <React.Fragment>
      <Hedader />
      <div>Hello {name}!</div>
      <span>{numArr.map((num) => num)}</span>
      {name === 'HD' ? <span>Welcome HD!</span> : null}
      <img src={user.avatarUrl}></img>
    </React.Fragment>
  );
}

3-4. style๊ณผ className

์ธ๋ผ์ธ ์Šคํƒ€์ผ๋กœ style๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, background-color์ฒ˜๋Ÿผ -๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ๋Š” ์ด๋ฆ„๋“ค์€ backgroundColor์ฒ˜๋Ÿผ camelCase ํ˜•ํƒœ๋กœ ๋„ค์ด๋ฐ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

import React from 'react';
import Header from './Header';

function App() {
  return (
    <React.Fragment>
      <Hedader />
      <div
        style={{
          backgroundColor: 'black',
          color: 'white',
          padding: '10px 20px',
        }}
      >
        Hellow Everyone!
      </div>
    </React.Fragment>
  );
}

class๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์™ธ๋ถ€ ์Šคํƒ€์ผ ์‹œํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ HTML์—์„œ๋Š” class๋ผ๋Š” ์–ดํŠธ๋ฆฌ๋ทฐํŠธ๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ JSX์—์„œ๋Š” className๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

/* App.css */

.gray-box {
  background: gray;
  width: 64px;
  height: 64px;
}
import React from 'react';
import Header from './Header';
import './App.css';

function App() {
  return (
    <React.Fragment>
      <Hedader />
      <div className="gray-box">Hellow Hellow Everyone!!</div>
    </React.Fragment>
  );
}

3-5. ์ฃผ์„

JSX ๋‚ด๋ถ€์˜ ์ฃผ์„์€ {/* ๋‚ด์šฉ */}์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

์—ด๋ฆฌ๋Š” ํƒœ๊ทธ ๋‚ด๋ถ€์—์„œ๋Š” // ๋‚ด์šฉ ์˜ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•œ๋‹ค.


4. JSX์˜ ์žฅ์ 

  1. ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜(DX) ๊ฐœ์„ : ํ‘œํ˜„๋ ฅ์ด ๋›ฐ์–ด๋‚˜ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์‰ฝ๋‹ค. XML๊ณผ ๋ฌธ๋ฒ•์ด ์œ ์‚ฌํ•˜์—ฌ ์ค‘์ฒฉ๋œ ์„ ์–ธํ˜• ๊ตฌ์กฐ๋ฅผ ๋” ์ž˜ ๋‚˜ํƒ€๋‚ธ๋‹ค.

  2. ํŒ€์˜ ์ƒ์‚ฐ์„ฑ ํ–ฅ์ƒ: ์ „๋ฌธ ๊ฐœ๋ฐœ์ž ์™ธ์—๋„ ๊ฐœ๋ฐœ ์ง€์‹์ด ์žˆ๋Š” ํŒ€์›์ด ์žˆ๋‹ค๋ฉด ์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. JSX๋Š” HTML๊ณผ ๋น„์Šทํ•˜์—ฌ ์ด๋“ค์—๊ฒŒ๋„ ์นœ์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

  3. ๋ฌธ๋ฒ• ์˜ค๋ฅ˜์™€ ์ฝ”๋“œ๋Ÿ‰ ๊ฐ์†Œ: ์ž‘์„ฑํ•ด์•ผ ํ•  ์ฝ”๋“œ๊ฐ€ ์ค„์–ด๋“ค๋ฉฐ, ์ด๋Š” ๊ณง ์‹ค์ˆ˜๋‚˜ ๋ฐ˜๋ณต์œผ๋กœ ์ธํ•œ ์ŠคํŠธ๋ ˆ์Šค๋ฅผ ์ค„์—ฌ์ค€๋‹ค.


5. Conclusion

JSX์˜ ๊ณต๋ถ€๋Š” ์ˆœ์กฐ๋กญ๊ฒŒ ์ด๋ฃจ์–ด์กŒ๋‹ค. ๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๊ณ  ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋˜ JSX์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์•„๋ฌด๋Ÿฐ ์˜๋ฌธ ์—†์ด "์•„ ๋ฆฌ์•กํŠธ์—์„  ์ด๋ ‡๊ฒŒ ํ•ด์•ผ์ง€" ํ•˜๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ ๋ณด๋‚ด์™”๊ณ  ์•ž์œผ๋กœ๋„ React๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋ฏ€๋กœ JSX๋ฅผ ์ž˜ ๋‹ค๋ฃจ์–ด๋ณด์ž ์ฒ˜์Œ JSX๋ฅผ ์ ‘ํ–ˆ์„ ๋•Œ๋„ ์•„๋ฌด๋Ÿฐ ์œ„ํ™”๊ฐ์„ ๋Š๋ผ์ง€ ์•Š์•˜๋‹ค. "์–ด๋–ป๊ฒŒ ๋ณ€์ˆ˜์— ํƒœ๊ทธ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์ง€?"๋ผ๋Š” ์˜๋ฌธ์กฐ์ฐจ๊ฐ€ ์—†์—ˆ๋‹ค. ๋ฉ”ํƒ€์—์„œ ์ž˜ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์œผ๋‹ˆ ์ž˜ ์จ์•ผ๊ฒ ๋‹ค:)


์ฐธ๊ณ 

JSX ์†Œ๊ฐœ [React ๊ธฐ์ดˆ] JSX๋ž€? / JSX ๋ฌธ๋ฒ• 4. JSX์˜ ๊ธฐ๋ณธ ๊ทœ์น™ ์•Œ์•„๋ณด๊ธฐ 3.1 JSX์˜ ์ •์˜์™€ ์žฅ์ 


๐Ÿ“… 2022-07-16

Last updated