We want to hear from you!Take our 2021 Community Survey!
This site is no longer updated.Go to react.dev

ES6 ์—†์ด ์‚ฌ์šฉํ•˜๋Š” React

These docs are old and wonโ€™t be updated. Go to react.dev for the new React docs.

๋ณดํ†ต React ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ •์˜ํ•  ๋•Œ JavaScript์˜ class๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด์™€ ๊ฐ™์„ ๊ฒ๋‹ˆ๋‹ค.

class Greeting extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

์•„์ง ES6๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๊ทธ ๋Œ€์‹  create-react-class ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

var createReactClass = require('create-react-class');
var Greeting = createReactClass({
  render: function() {
    return <h1>Hello, {this.props.name}</h1>;
  }
});

ES6 class์˜ API๋Š” ๋ช‡๋ช‡ ์ฐจ์ด์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” createReactClass()์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

Props ๊ธฐ๋ณธ๊ฐ’ ์„ ์–ธ

ํ•จ์ˆ˜์™€ ES6์˜ class๋ฅผ ํ†ตํ•ด defaultProps๋ฅผ ์ปดํฌ๋„ŒํŠธ ๊ทธ ์ž์ฒด์˜ ์†์„ฑ์œผ๋กœ์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Greeting extends React.Component {
  // ...
}

Greeting.defaultProps = {
  name: 'Mary'
};

createReactClass()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์ธ์ž๋กœ ๋„˜๊ฒจ์ง€๋Š” ๊ฐ์ฒด ๋‚ด์—์„œ getDefaultProps()๋ฅผ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

var Greeting = createReactClass({
  getDefaultProps: function() {
    return {
      name: 'Mary'
    };
  },

  // ...

});

์ดˆ๊ธฐ State ์ •์˜

ES6 class์˜ ์ƒ์„ฑ์ž์—์„œ this.state์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด state์˜ ์ดˆ๊ธฐ๊ฐ’์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class Counter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {count: props.initialCount};
  }
  // ...
}

createReactClass()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์ดˆ๊ธฐ state๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” getInitialState ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ด์•ผ๋งŒ ํ•ฉ๋‹ˆ๋‹ค.

var Counter = createReactClass({
  getInitialState: function() {
    return {count: this.props.initialCount};
  },
  // ...
});

์ž๋™ ๋ฐ”์ธ๋”ฉ

ES6 class๋กœ์„œ ์„ ์–ธ๋œ React ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฉ”์„œ๋“œ๋Š” ์ผ๋ฐ˜์ ์ธ ES6 class์ผ ๋•Œ์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, this๋ฅผ ์ธ์Šคํ„ด์Šค์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” ์ƒ์„ฑ์ž์—์„œ ๋ณ„๋„๋กœ .bind(this)๋ฅผ ์‚ฌ์šฉํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

class SayHello extends React.Component {
  constructor(props) {
    super(props);
    this.state = {message: 'Hello!'};
    // ์ด ๋ถ€๋ถ„์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค!
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick() {
    alert(this.state.message);
  }

  render() {
    // `this.handleClick`์ด ๋ฐ”์ธ๋”ฉ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    return (
      <button onClick={this.handleClick}>
        Say hello
      </button>
    );
  }
}

๋ฐ˜๋ฉด์— createReactClass()๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ์•Œ์•„์„œ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ„์˜ ๊ณผ์ •์ด ํ•„์š”ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

var SayHello = createReactClass({
  getInitialState: function() {
    return {message: 'Hello!'};
  },

  handleClick: function() {
    alert(this.state.message);
  },

  render: function() {
    return (
      <button onClick={this.handleClick}>
        Say hello
      </button>
    );
  }
});

์ด๋Š” ES6์˜ class๋ฅผ ์‚ฌ์šฉํ•ด ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ณด๋‹ค ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง„๋‹ค๋Š” ๋œป์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํฐ ๊ทœ๋ชจ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” class๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์„ฑ๋Šฅ์ด ์กฐ๊ธˆ ๋” ์ข‹์•„์ง‘๋‹ˆ๋‹ค.

๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ • ์“ฐ๊ธฐ ์‹ซ๋‹ค๋ฉด, ES2022 Class Properties ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

class SayHello extends React.Component {
  constructor(props) {
    super(props);
    this.state = {message: 'Hello!'};
  }

  // ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฉ”์„œ๋“œ๋ฅผ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  handleClick = () => {
    alert(this.state.message);
  };

  render() {
    return (
      <button onClick={this.handleClick}>
        Say hello
      </button>
    );
  }
}

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์„ ํƒ์ง€๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒ์„ฑ์ž์—์„œ ๋ฉ”์„œ๋“œ๋“ค์„ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  • onClick={(e) => this.handleClick(e)}์™€ ๊ฐ™์ด ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • createReactClass๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Mixins

์ฃผ์˜

ES6์—์„œ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ mixin์— ๋Œ€ํ•œ ์–ด๋– ํ•œ ์ง€์›๋„ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, React์—์„œ ES6 class๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ mixin์— ๋Œ€ํ•œ ๋ณ„๋„์˜ ์ง€์›์€ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ €ํฌ ํŒ€์€ mixin์„ ์‚ฌ์šฉํ•œ Codebase์—์„œ ์ˆ˜ ๋งŽ์€ ๋ฌธ์ œ์ ๋“ค์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋”ฐ๋ผ ์ €ํฌ๋Š” ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์—์„œ๋Š” mixin์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

ํ•ด๋‹น ๊ธ€์€ ์ฐธ๊ณ ๋ชฉ์ ์œผ๋กœ๋งŒ ๋ณด์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๊ฐ€๋”์€ ์ „ํ˜€ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์–ด๋А ์ •๋„ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๊ณต์œ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„ํ˜น ๋ฐœ์ƒํ•˜๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋ฅผ ๋ฒˆ์—ญ๊ณผ ๋งํฌ์— ๊ด€ํ•œ ํšก๋‹จ ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋Œ€์ฒ˜๋ฒ•์œผ๋กœ์„œ createReactClass๋ฅผ ํ†ตํ•ด ๋” ์ด์ƒ ์“ฐ์ด์ง€ ์•Š๋Š” ์ฝ”๋“œ์ธ mixins์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mixin์„ ์‚ฌ์šฉํ•˜๋Š” ํ”ํ•œ ์˜ˆ๋กœ๋Š” ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ๋ฐ˜๋ณต์ ์œผ๋กœ ์Šค์Šค๋กœ ๋‚ด์šฉ์„ ๊ฐฑ์‹ ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•  ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” setInterval()์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ ์ด๋ฅผ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. React๋Š” ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ํŒŒ๊ดด๋˜๊ธฐ ์ง์ „์— ์ด๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฐ„๋‹จํ•œ mixin์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด mixin์€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŒŒ๊ดด๋  ๋•Œ ์ž๋™์œผ๋กœ ์ •๋ฆฌ๋˜๋Š” setInterval() ํ•จ์ˆ˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด ์ค๋‹ˆ๋‹ค.

var SetIntervalMixin = {
  componentWillMount: function() {
    this.intervals = [];
  },
  setInterval: function() {
    this.intervals.push(setInterval.apply(null, arguments));
  },
  componentWillUnmount: function() {
    this.intervals.forEach(clearInterval);
  }
};

var createReactClass = require('create-react-class');

var TickTock = createReactClass({
  mixins: [SetIntervalMixin], // mixin์„ ์‚ฌ์šฉ
  getInitialState: function() {
    return {seconds: 0};
  },
  componentDidMount: function() {
    this.setInterval(this.tick, 1000); // mixin์—์„œ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœ
  },
  tick: function() {
    this.setState({seconds: this.state.seconds + 1});
  },
  render: function() {
    return (
      <p>
        React has been running for {this.state.seconds} seconds.
      </p>
    );
  }
});

const root = ReactDOM.createRoot(document.getElementById('example'));
root.render(<TickTock />);

ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ™์€ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•œ ์—ฌ๋Ÿฌ mixin์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด…์‹œ๋‹ค. ์˜ˆ๋ฅผ ๋“ ๋‹ค๋ฉด, mixin๋“ค์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŒŒ๊ดด๋  ๋•Œ ์–ด๋– ํ•œ ์ •๋ฆฌ ๋™์ž‘์„ ํ•˜๋ ค๊ณ  ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ๋Š” ๋ชจ๋“  ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ์˜ ํ˜ธ์ถœ์ด ๋ณด์žฅ๋ฉ๋‹ˆ๋‹ค. mixin์—์„œ ์ •์˜๋œ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋“ค์€ mixin์ด ๋‚˜์—ด๋œ ์ˆœ์„œ๋Œ€๋กœ ์ž‘๋™๋˜๋ฉฐ ๊ทธ ๋’ค์— ์ปดํฌ๋„ŒํŠธ์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Is this page useful?Edit this page