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

์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง

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

These new documentation pages teach modern React and include live examples:

React์—์„œ๋Š” ์›ํ•˜๋Š” ๋™์ž‘์„ ์บก์Аํ™”ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ ์ค‘ ๋ช‡ ๊ฐœ๋งŒ์„ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

React์—์„œ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์€ JavaScript์—์„œ์˜ ์กฐ๊ฑด ์ฒ˜๋ฆฌ์™€ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. if ๋‚˜ ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž ์™€ ๊ฐ™์€ JavaScript ์—ฐ์‚ฐ์ž๋ฅผ ํ˜„์žฌ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ์— ์‚ฌ์šฉํ•˜์„ธ์š”. ๊ทธ๋Ÿฌ๋ฉด React๋Š” ํ˜„์žฌ ์ƒํƒœ์— ๋งž๊ฒŒ UI๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ๋‘ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค.

function UserGreeting(props) {
  return <h1>Welcome back!</h1>;
}

function GuestGreeting(props) {
  return <h1>Please sign up.</h1>;
}

์ด์ œ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์ƒํƒœ์— ๋งž๊ฒŒ ์œ„ ์ปดํฌ๋„ŒํŠธ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” Greeting ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

function Greeting(props) {
  const isLoggedIn = props.isLoggedIn;
  if (isLoggedIn) {    return <UserGreeting />;  }  return <GuestGreeting />;}
const root = ReactDOM.createRoot(document.getElementById('root')); 
// Try changing to isLoggedIn={true}:
root.render(<Greeting isLoggedIn={false} />);

CodePen์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

์ด ์˜ˆ์‹œ๋Š” isLoggedIn prop์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ์ธ์‚ฌ๋ง์„ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค.

์—˜๋ฆฌ๋จผํŠธ ๋ณ€์ˆ˜

์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋ณ€ํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ์ปดํฌ๋„ŒํŠธ์˜ ์ผ๋ถ€๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ์•„์›ƒ๊ณผ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์„ธ์š”.

function LoginButton(props) {
  return (
    <button onClick={props.onClick}>
      Login
    </button>
  );
}

function LogoutButton(props) {
  return (
    <button onClick={props.onClick}>
      Logout
    </button>
  );
}

์•„๋ž˜์˜ ์˜ˆ์‹œ์—์„œ๋Š” LoginControl์ด๋ผ๋Š” ์œ ์ƒํƒœ ์ปดํฌ๋„ŒํŠธ ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ปดํฌ๋„ŒํŠธ๋Š” ํ˜„์žฌ ์ƒํƒœ์— ๋งž๊ฒŒ <LoginButton />์ด๋‚˜ <LogoutButton />์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด์ „ ์˜ˆ์‹œ์—์„œ์˜ <Greeting />๋„ ํ•จ๊ป˜ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

class LoginControl extends React.Component {
  constructor(props) {
    super(props);
    this.handleLoginClick = this.handleLoginClick.bind(this);
    this.handleLogoutClick = this.handleLogoutClick.bind(this);
    this.state = {isLoggedIn: false};
  }

  handleLoginClick() {
    this.setState({isLoggedIn: true});
  }

  handleLogoutClick() {
    this.setState({isLoggedIn: false});
  }

  render() {
    const isLoggedIn = this.state.isLoggedIn;
    let button;
    if (isLoggedIn) {      button = <LogoutButton onClick={this.handleLogoutClick} />;    } else {      button = <LoginButton onClick={this.handleLoginClick} />;    }
    return (
      <div>
        <Greeting isLoggedIn={isLoggedIn} />        {button}      </div>
    );
  }
}

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

CodePen์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  if๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์กฐ๊ฑด๋ถ€๋กœ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ๋” ์งง์€ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ JSX ์•ˆ์—์„œ ์ธ๋ผ์ธ(inline)์œผ๋กœ ์ฒ˜๋ฆฌํ•  ๋ฐฉ๋ฒ• ๋ช‡ ๊ฐ€์ง€๋ฅผ ์•„๋ž˜์—์„œ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋…ผ๋ฆฌ && ์—ฐ์‚ฐ์ž๋กœ If๋ฅผ ์ธ๋ผ์ธ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

JSX ์•ˆ์—๋Š” ์ค‘๊ด„ํ˜ธ๋ฅผ ์ด์šฉํ•ด์„œ ํ‘œํ˜„์‹์„ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์•ˆ์— JavaScript์˜ ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž &&๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function Mailbox(props) {
  const unreadMessages = props.unreadMessages;
  return (
    <div>
      <h1>Hello!</h1>
      {unreadMessages.length > 0 &&        <h2>          You have {unreadMessages.length} unread messages.        </h2>      }    </div>
  );
}

const messages = ['React', 'Re: React', 'Re:Re: React'];

const root = ReactDOM.createRoot(document.getElementById('root')); 
root.render(<Mailbox unreadMessages={messages} />);

CodePen์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

JavaScript์—์„œ true && expression์€ ํ•ญ์ƒ expression์œผ๋กœ ํ‰๊ฐ€๋˜๊ณ  false && expression์€ ํ•ญ์ƒ false๋กœ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ && ๋’ค์˜ ์—˜๋ฆฌ๋จผํŠธ๋Š” ์กฐ๊ฑด์ด true์ผ๋•Œ ์ถœ๋ ฅ์ด ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์ด false๋ผ๋ฉด React๋Š” ๋ฌด์‹œํ•˜๊ณ  ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

falsy ํ‘œํ˜„์‹์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ์—ฌ์ „ํžˆ && ๋’ค์— ์žˆ๋Š” ํ‘œํ˜„์‹์€ ๊ฑด๋„ˆ๋›ฐ์ง€๋งŒ falsy ํ‘œํ˜„์‹์ด ๋ฐ˜ํ™˜๋œ๋‹ค๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•ด์ฃผ์„ธ์š”. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ, <div>0</div>์ด render ๋ฉ”์„œ๋“œ์—์„œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

render() {
  const count = 0;  return (
    <div>
      {count && <h1>Messages: {count}</h1>}    </div>
  );
}

์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž๋กœ If-Else๊ตฌ๋ฌธ ์ธ๋ผ์ธ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ

์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ์กฐ๊ฑด๋ถ€ ์—ฐ์‚ฐ์ž์ธ condition ? true: false๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์‹œ์—์„œ๋Š” ์งง์€ ๊ตฌ๋ฌธ์„ ์กฐ๊ฑด๋ถ€๋กœ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค.

render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      The user is <b>{isLoggedIn ? 'currently' : 'not'}</b> logged in.    </div>
  );
}

๊ฐ€๋…์„ฑ์€ ์ข€ ๋–จ์–ด์ง€์ง€๋งŒ, ๋” ํฐ ํ‘œํ˜„์‹์—๋„ ์ด ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

render() {
  const isLoggedIn = this.state.isLoggedIn;
  return (
    <div>
      {isLoggedIn        ? <LogoutButton onClick={this.handleLogoutClick} />
        : <LoginButton onClick={this.handleLoginClick} />      }
    </div>  );
}

JavaScript์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์กฐ๊ฑด์ด ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์ข‹์„ ๋•Œ ์ผ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ

๊ฐ€๋” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ๋ Œ๋”๋ง๋  ๋•Œ ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๋ฅผ ์ˆจ๊ธฐ๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋Š” ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋Œ€์‹  null์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜์˜ ์˜ˆ์‹œ์—์„œ๋Š” <WarningBanner />๊ฐ€ warn prop์˜ ๊ฐ’์— ์˜ํ•ด์„œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. prop์ด false๋ผ๋ฉด ์ปดํฌ๋„ŒํŠธ๋Š” ๋ Œ๋”๋งํ•˜์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

function WarningBanner(props) {
  if (!props.warn) {    return null;  }
  return (
    <div className="warning">
      Warning!
    </div>
  );
}

class Page extends React.Component {
  constructor(props) {
    super(props);
    this.state = {showWarning: true};
    this.handleToggleClick = this.handleToggleClick.bind(this);
  }

  handleToggleClick() {
    this.setState(state => ({
      showWarning: !state.showWarning
    }));
  }

  render() {
    return (
      <div>
        <WarningBanner warn={this.state.showWarning} />        <button onClick={this.handleToggleClick}>
          {this.state.showWarning ? 'Hide' : 'Show'}
        </button>
      </div>
    );
  }
}

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

CodePen์—์„œ ์‹คํ–‰ํ•˜๊ธฐ

์ปดํฌ๋„ŒํŠธ์˜ render ๋ฉ”์„œ๋“œ๋กœ๋ถ€ํ„ฐ null์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์˜ˆ๋กœ componentDidUpdate๋Š” ๊ณ„์†ํ•ด์„œ ํ˜ธ์ถœ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Is this page useful?Edit this page