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

PropTypes์™€ ํ•จ๊ป˜ ํ•˜๋Š” ํƒ€์ž… ๊ฒ€์‚ฌ

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

PropTypes arenโ€™t commonly used in modern React. Use TypeScript for static type checking.

์ฃผ์˜

React.PropTypes๋Š” React v15.5๋ถ€ํ„ฐ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋กœ ์ด๋™ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  prop-types ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์‹œ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋ณ€ํ™˜์„ ์ž๋™ํ™”ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ codemod ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ๋ถ„์˜ ์•ฑ์ด ์ปค์ง์— ๋”ฐ๋ผ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋งŽ์€ ๋ฒ„๊ทธ๋ฅผ(bug) ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ์œ„ํ•ด Flow ๋˜๋Š” TypeScript์™€ ๊ฐ™์€ JavaScript ๋„๊ตฌ(Extensions)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋”๋ผ๋„ React๋Š” ๋‚ด์žฅ๋œ ํƒ€์ž… ๊ฒ€์‚ฌ ๊ธฐ๋Šฅ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ props์— ํƒ€์ž… ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํŠน๋ณ„ํ•œ ํ”„๋กœํผํ‹ฐ์ธ propTypes๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import PropTypes from 'prop-types';

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

Greeting.propTypes = {
  name: PropTypes.string
};

์˜ˆ์‹œ์—์„œ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์™€ React.memo, React.forwardRef๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ์ปดํฌ๋„ŒํŠธ์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

PropTypes๋Š” ์ „๋‹ฌ๋ฐ›์€ ๋ฐ์ดํ„ฐ์˜ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์–‘ํ•œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ(Validator)๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ์—์„œ๋Š” PropTypes.string์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. prop์— ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฐ’์ด ์ „๋‹ฌ ๋˜์—ˆ์„ ๋•Œ, ๊ฒฝ๊ณ ๋ฌธ์ด JavaScript ์ฝ˜์†”์„ ํ†ตํ•ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. propTypes๋Š” ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ๊ฐœ๋ฐœ ๋ชจ๋“œ(Development mode) ์—์„œ๋งŒ ํ™•์ธ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

PropTypes

์•„๋ž˜๋Š” ์ œ๊ณต๋œ ์„œ๋กœ ๋‹ค๋ฅธ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋“ค์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

import PropTypes from 'prop-types';

MyComponent.propTypes = {
  // prop๊ฐ€ ํŠน์ • JS ํ˜•์‹์ž„์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  // ์ด๊ฒƒ๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋‘ ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค.
  optionalArray: PropTypes.array,
  optionalBool: PropTypes.bool,
  optionalFunc: PropTypes.func,
  optionalNumber: PropTypes.number,
  optionalObject: PropTypes.object,
  optionalString: PropTypes.string,
  optionalSymbol: PropTypes.symbol,

  // ๋ Œ๋”๋ง ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  // ์ˆซ์ž(numbers), ๋ฌธ์ž(strings), ์—˜๋ฆฌ๋จผํŠธ(elements), ๋˜๋Š” ์ด๋Ÿฌํ•œ ํƒ€์ž…๋“ค(types)์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ฐฐ์—ด(array) (ํ˜น์€ ๋ฐฐ์—ด์˜ fragment)
  optionalNode: PropTypes.node,

  // React ์—˜๋ฆฌ๋จผํŠธ.
  optionalElement: PropTypes.element,

  // React ์—˜๋ฆฌ๋จผํŠธ ํƒ€์ž… (ie. MyComponent)
  optionalElementType: PropTypes.elementType,

  // prop๊ฐ€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์ž„์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  // ์ด ๊ฒฝ์šฐ JavaScript์˜ instanceof ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  optionalMessage: PropTypes.instanceOf(Message),

  // ์—ด๊ฑฐํ˜•(enum)์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์—ฌ prop๊ฐ€ ํŠน์ • ๊ฐ’๋“ค๋กœ ์ œํ•œ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  optionalEnum: PropTypes.oneOf(['News', 'Photos']),

  // ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์ค‘ ํ•˜๋‚˜์˜ ์ข…๋ฅ˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด
  optionalUnion: PropTypes.oneOfType([
    PropTypes.string,
    PropTypes.number,
    PropTypes.instanceOf(Message)
  ]),

  // ํŠน์ • ํƒ€์ž…์˜ ํ–‰๋ ฌ
  optionalArrayOf: PropTypes.arrayOf(PropTypes.number),

  // ํŠน์ • ํƒ€์ž…์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’๋“ค์„ ๊ฐ–๋Š” ๊ฐ์ฒด
  optionalObjectOf: PropTypes.objectOf(PropTypes.number),

  // ํŠน์ • ํ˜•ํƒœ๋ฅผ ๊ฐ–๋Š” ๊ฐ์ฒด
  optionalObjectWithShape: PropTypes.shape({
    color: PropTypes.string,
    fontSize: PropTypes.number
  }),

  // ์ถ”๊ฐ€ ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด
  optionalObjectWithStrictShape: PropTypes.exact({
    name: PropTypes.string,
    quantity: PropTypes.number
  }),

  // ์œ„์— ์žˆ๋Š” ๊ฒƒ ๋ชจ๋‘ `isRequired`์™€ ์—ฐ๊ฒฐํ•˜์—ฌ prop๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š์•˜์„ ๋•Œ
  // ๊ฒฝ๊ณ ๊ฐ€ ๋ณด์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  requiredFunc: PropTypes.func.isRequired,

  // ๋ชจ๋“  ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๊ฐ€๋Šฅํ•œ ํ•„์ˆ˜๊ฐ’
  requiredAny: PropTypes.any.isRequired,

  // ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  // ๊ฒ€์‚ฌ ์‹คํŒจ ์‹œ์—๋Š” ์—๋Ÿฌ(Error) ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  // `oneOfType`์•ˆ์—์„œ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ `console.warn` ํ˜น์€ throw ํ•˜์ง€ ๋งˆ์„ธ์š”.
  customProp: function(props, propName, componentName) {
    if (!/matchme/.test(props[propName])) {
      return new Error(
        'Invalid prop `' + propName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  },

  // `arrayOf` ์™€ `objectOf ์— ์‚ฌ์šฉ์ž ์ •์˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  // ๊ฒ€์‚ฌ ์‹คํŒจ ์‹œ์—๋Š” ์—๋Ÿฌ(Error) ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  // ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ๋Š” ๋ฐฐ์—ด(array) ํ˜น์€ ๊ฐ์ฒด์˜ ๊ฐ ํ‚ค(key)์— ๋Œ€ํ•˜์—ฌ ํ˜ธ์ถœ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  // ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๊ธฐ์˜ ์ฒซ ๋‘ ๊ฐœ์˜ ๋ณ€์ˆ˜๋Š” ๋ฐฐ์—ด ํ˜น์€ ๊ฐ์ฒด ์ž์‹ ๊ณผ ํ˜„์žฌ ์•„์ดํ…œ์˜ ํ‚ค์ž…๋‹ˆ๋‹ค.

  customArrayProp: PropTypes.arrayOf(function(propValue, key, componentName, location, propFullName) {
    if (!/matchme/.test(propValue[key])) {
      return new Error(
        'Invalid prop `' + propFullName + '` supplied to' +
        ' `' + componentName + '`. Validation failed.'
      );
    }
  })
};

ํ•˜๋‚˜์˜ ์ž์‹๋งŒ ์š”๊ตฌํ•˜๊ธฐ

PropTypes.element๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ์ž์‹๋“ค(Children)์— ๋‹จ ํ•˜๋‚˜์˜ ์ž์‹(Child)๋งŒ์ด ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋„๋ก ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import PropTypes from 'prop-types';

class MyComponent extends React.Component {
  render() {
    // ์ด๊ฒƒ์€ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ์—˜๋ฆฌ๋จผํŠธ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด, ๊ฒฝ๊ณ (warn)๊ฐ€ ์ผ์–ด๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    const children = this.props.children;
    return (
      <div>
        {children}
      </div>
    );
  }
}

MyComponent.propTypes = {
  children: PropTypes.element.isRequired
};

์ดˆ๊ธฐ Prop ๊ฐ’

defaultProps ํ”„๋กœํผํ‹ฐ๋ฅผ ํ• ๋‹นํ•จ์œผ๋กœ์จ props์˜ ์ดˆ๊นƒ๊ฐ’์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

// props์˜ ์ดˆ๊นƒ๊ฐ’์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
Greeting.defaultProps = {
  name: 'Stranger'
};

// Renders "Hello, Stranger":
const root = ReactDOM.createRoot(document.getElementById('example')); 
root.render(<Greeting />);

Since ES2022 you can also declare defaultProps as static property within a React component class. For more information, see the class public static fields. This modern syntax will require a compilation step to work within older browsers.

class Greeting extends React.Component {
  static defaultProps = {
    name: 'stranger'
  }

  render() {
    return (
      <div>Hello, {this.props.name}</div>
    )
  }
}

defaultProps๋Š” this.props.name์˜ ๊ฐ’์ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ๋ช…์‹œ๋˜์ง€ ์•Š์•˜์„ ๋•Œ ๊ฐ’์„ ๊ฐ–๋„๋ก ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. propTypes์˜ ํƒ€์ž… ๊ฒ€์‚ฌ๋Š” defaultProps์—๋„ ์ ์šฉ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ defaultProps๊ฐ€ ์ฒ˜๋ฆฌ๋œ ๋’ค์— ์ผ์–ด๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Function Components

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด, PropTypes๋ฅผ ์ ์ ˆํžˆ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ช‡ ๊ฐ€์ง€ ์ž‘์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋งŒ๋“ค์–ด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

export default function HelloWorldComponent({ name }) {
  return (
    <div>Hello, {name}</div>
  )
}

PropTypes๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์™ธ๋ถ€์— ๋…ธ์ถœ์‹œํ‚ค๊ธฐ ์ „์— ๋ณ„๋„์˜ ํ•จ์ˆ˜๋กœ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function HelloWorldComponent({ name }) {
  return (
    <div>Hello, {name}</div>
  )
}

export default HelloWorldComponent

๊ทธ๋Ÿฌ๋ฉด, HelloWorldComponent์— ์ง์ ‘ PropTypes๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import PropTypes from 'prop-types'

function HelloWorldComponent({ name }) {
  return (
    <div>Hello, {name}</div>
  )
}

HelloWorldComponent.propTypes = {
  name: PropTypes.string
}

export default HelloWorldComponent
Is this page useful?Edit this page