๐Ÿฅ ๊ณต์‹๋ฌธ์„œ๋กœ ๋ฐฐ์šฐ๋Š” React

Sohyeon Bakยท2022๋…„ 8์›” 18์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
7/9
post-thumbnail

04. Props and State

๋ฆฌ์•กํŠธ์—์„œ props์™€ state๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๊ฐœ๋…์ด๋‹ค.

๊ณต์‹๋ฌธ์„œ
propsย (โ€œpropertiesโ€์˜ ์ค„์ž„๋ง) ์™€ย stateย ๋Š” ์ผ๋ฐ˜ JavaScript ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค.
๋‘ ๊ฐ์ฒด ๋ชจ๋‘ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฌผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ, ํ•œ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๋ฐฉ์‹์—์„œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.ย 
props๋Š” (ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์ฒ˜๋Ÿผ) ์ปดํฌ๋„ŒํŠธ์—ย ์ „๋‹ฌ๋˜๋Š” ๋ฐ˜๋ฉดย state๋Š” (ํ•จ์ˆ˜ ๋‚ด์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ) ์ปดํฌ๋„ŒํŠธย ์•ˆ์—์„œย ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

Props are Read-Only

Props๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค.
๋ชจ๋“  ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ props๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋ฐ˜๋“œ์‹œ ์ˆœ์ˆ˜ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
์ˆœ์ˆ˜ ํ•จ์ˆ˜๋ž€ ์ „๋‹ฌ๋œ ์ธ์ž๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ  ์ธ์ž ๊ทธ๋Œ€๋กœ๋ฅผ ๊ฐ€์ง€๊ณ  ํ™œ์šฉ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

function sum(a, b) {
  return a + b;
}

์ˆœ์ˆ˜ ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ๊ฐ’์„ ๋ฐ”๊พธ๋ คํ•˜์ง€ ์•Š๊ณ  ๋™์ผํ•œ ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

function withdraw(account, amount) {
  account.total -= amount;
}

๋ฐ˜๋ฉด ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ์—๋Š” ์ž…๋ ฅ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰ ์ „๋‹ฌ๋œ ๋ฐ์ดํ„ฐ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ณ€๊ฒฝํ•  ์ˆ˜๋Š” ์—†๋‹ค.
์ปดํฌ๋„ŒํŠธ์— ์†์„ฑ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์ •ํ•ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ธธ ์ˆ˜ ์žˆ๋‹ค.

Using State Correctly

์ง์ ‘ state๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ๋งˆ์„ธ์š”.

// Wrong
this.state.comment = 'Hello';
// Correct
this.setState({comment: 'Hello'});

this.state๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ณณ์€ ์˜ค์ง constructor ์ด๋‹ค.

state ์—…๋ฐ์ดํŠธ๋Š” ๋น„๋™๊ธฐ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

this.props์™€ย this.state๊ฐ€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ state๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ํ•ด๋‹น ๊ฐ’์— ์˜์กดํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค.
state ๊ฐ’ ์ž์ฒด๋ฅผ ์˜์กดํ•˜๊ฒŒ ๋˜๋ฉด ๋น„๋™๊ธฐ์ ์ธ ํ˜ธ์ถœ์—์„œ ๊ฐ’์„ ์ œ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

// Wrong
this.setState({
  counter: this.state.counter + this.props.increment,
});
// Correct
this.setState((state, props) => ({
  counter: state.counter + props.increment
}));

ํ•จ์ˆ˜ ์ธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” setState()๋กœ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ์ด์ „ state๋ฅผ, ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ์—…๋ฐ์ดํŠธ๊ฐ€ ์ ์šฉ๋œ ์‹œ์ ์˜ props๋กœ ๋ฐ›์•„ ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

state ์—…๋ฐ์ดํŠธ๋Š” ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, state์— ๋‹ค์–‘ํ•œ ๋…๋ฆฝ์ ์ธ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด setState() ํ˜ธ์ถœ๋กœ ๋ณ€์ˆ˜๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  constructor(props) {
    super(props);
    this.state = {
      posts: [],
      comments: []
    };
  }

  componentDidMount() {
    fetchPosts().then(response => {
      this.setState({
        posts: response.posts
      });
    });

    fetchComments().then(response => {
      this.setState({
        comments: response.comments
      });
    });
  }

๋ณ‘ํ•ฉ์€ ์–•๊ฒŒ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์— this.setState({comments})๋Š”ย this.state.posts์— ์˜ํ–ฅ์„ ์ฃผ์ง„ ์•Š์ง€๋งŒย this.state.comments๋Š” ์™„์ „ํžˆ ๋Œ€์ฒด๋œ๋‹ค.

The Data Flows Down

์–ด๋–ค ์ปดํฌ๋„ŒํŠธ๋„ ์ž์‹ ์ด ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋””์„œ ์™”๋Š”์ง€ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค.
์˜ค๋กœ์ง€ state๋ฅผ ์„ค์ •ํ•œ ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ํ•ด๋‹น state์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์ž์‹ ์˜ state๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
๋ชจ๋“  state๋Š” ์ž์‹ ์„ ์†Œ์œ ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ž์‹ ์˜ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ๋งŒ ์˜ํ–ฅ์„ ๋ผ์น  ์ˆ˜ ์žˆ๋‹ค.
์ด๊ฒƒ์„ "ํ•˜ํ–ฅ์‹(top-down)" ๋˜๋Š” "๋‹จ๋ฐฉํ–ฅ์‹" ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด๋ผ๊ณ  ํ•œ๋‹ค.

profile
์ •๋ฆฌํ•˜๊ณ  ๊ธฐ์–ตํ•˜๋Š” ๊ณณ

0๊ฐœ์˜ ๋Œ“๊ธ€