๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉโ€๐Ÿ’ป ๊ฐœ๋ฐœ ๊ณต๋ถ€/๊ฐœ๋ฐœ ์„œ์  Read&Write

[์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ] React ์ฑ…์ฝ๊ธฐ : Chapter 6-8 ์ •๋ฆฌ

728x90
๋ฐ˜์‘ํ˜•

[ ์ฐธ๊ณ  ์„œ์  : ์†Œํ”Œ์˜ ์ฒ˜์Œ ๋งŒ๋‚œ ๋ฆฌ์•กํŠธ(2ํŒ) - ํ•œ๋น›๋ฏธ๋””์–ด ]

 

๐Ÿ”น React State ์ •๋ฆฌ

โœ… State๋ž€?

  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ
  • State๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ๋ Œ๋”๋ง๋จ
  • ๋ Œ๋”๋ง์ด๋‚˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์— ์‚ฌ์šฉ๋˜๋Š” ๊ฐ’๋งŒ State์— ํฌํ•จํ•ด์•ผ ํ•จ

๐ŸŽฏ State์˜ ํŠน์ง•

  • JavaScript ๊ฐ์ฒด ํ˜•ํƒœ
  • ์ง์ ‘ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ โ†’ ๋ฐ˜๋“œ์‹œ ์ง€์ •๋œ ๋ฐฉ๋ฒ•(set ํ•จ์ˆ˜)์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•จ

โš›๏ธ ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์—์„œ State ์‚ฌ์šฉ๋ฒ•

  1. ์ƒ์„ฑ์ž์—์„œ State๋ฅผ ํ•œ ๋ฒˆ์— ์ •์˜
  2. State ๋ณ€๊ฒฝ ์‹œ setState() ํ•จ์ˆ˜ ์‚ฌ์šฉ

โšก ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ State ์‚ฌ์šฉ๋ฒ•

  1. useState() Hook์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๊ฐ์˜ State๋ฅผ ์ •์˜
  2. ๊ฐ State๋ณ„๋กœ ์ œ๊ณต๋˜๋Š” set ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ

๐Ÿ”น React ์ƒ๋ช…์ฃผ๊ธฐ(Lifecycle) ์ •๋ฆฌ

React ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒ์„ฑ(Mount) โ†’ ์—…๋ฐ์ดํŠธ(Update) โ†’ ์ œ๊ฑฐ(Unmount) ์˜ ๊ณผ์ •์„ ๊ฑฐ์นจ.


โœ… 1. ๋งˆ์šดํŠธ(Mount) โ€“ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ

  • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚  ๋•Œ ์‹คํ–‰
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ: componentDidMount()
  • ์ฃผ๋กœ API ํ˜ธ์ถœ, ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋“ฑ๋ก, ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์„ค์ • ๋“ฑ์— ์‚ฌ์šฉ

๐Ÿ”„ 2. ์—…๋ฐ์ดํŠธ(Update) โ€“ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒฝ์šฐ:

  1. props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ
  2. setState()๋ฅผ ์‚ฌ์šฉํ•ด state๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ
  3. forceUpdate()๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ•์ œ ์—…๋ฐ์ดํŠธํ•  ๋•Œ
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ: componentDidUpdate(prevProps, prevState)

๐Ÿš€ 3. ์–ธ๋งˆ์šดํŠธ(Unmount) โ€“ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ

  • ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋” ์ด์ƒ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜์ง€ ์•Š์„ ๋•Œ ์‹คํ–‰
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ: componentWillUnmount()
  • ์ฃผ๋กœ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ํ•ด์ œ, ํƒ€์ด๋จธ ์ •๋ฆฌ, ๊ตฌ๋… ์ทจ์†Œ ๋“ฑ์— ์‚ฌ์šฉ

โšก ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ (useEffect)

ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ useEffect Hook์œผ๋กœ ๋Œ€์ฒด๋จ.

 

import { useEffect } from "react";

function MyComponent() {
  useEffect(() => {
    console.log("์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋จ");

    return () => {
      console.log("์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ๋จ");
    };
  }, []);

  return <div>์•ˆ๋…•ํ•˜์„ธ์š”</div>;
}

 

โœ… useEffect(() => {...}, []) โ†’ ๋งˆ์šดํŠธ ์‹œ ์‹คํ–‰
โœ… return () => {...} โ†’ ์–ธ๋งˆ์šดํŠธ ์‹œ ์‹คํ–‰
โœ… useEffect(() => {...}, [๋ณ€์ˆ˜]) โ†’ ๋ณ€์ˆ˜๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์‹คํ–‰ (์—…๋ฐ์ดํŠธ ๋ฐ˜์˜)


๐Ÿ”น React ํ›…(Hook) ์ •๋ฆฌ

โœ… ํ›…์ด๋ž€?

  • ๋ฆฌ์•กํŠธ์˜ state์™€ ์ƒ๋ช…์ฃผ๊ธฐ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ•จ์ˆ˜
  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์—†์ด๋„ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ ์ƒ๋ช…์ฃผ๊ธฐ ์ œ์–ด ๊ฐ€๋Šฅ

๐ŸŽฏ 1. useState() โ€“ ์ƒํƒœ(state) ๊ด€๋ฆฌ

  • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ state๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ›…
  • ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ๋Š” ์ œ๊ณต๋œ set ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

๐Ÿš€ 2. useEffect() โ€“ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ฒ˜๋ฆฌ

  • ์„œ๋ฒ„ ๋ฐ์ดํ„ฐ ์š”์ฒญ, DOM ์กฐ์ž‘, ํƒ€์ด๋จธ ์„ค์ • ๋“ฑ ๋ถ€๊ฐ€์ ์ธ ์ž‘์—… ์ˆ˜ํ–‰
  • ์ƒ๋ช…์ฃผ๊ธฐ ํ•จ์ˆ˜(componentDidMount, componentDidUpdate, componentWillUnmount)๋ฅผ ๋Œ€์ฒด
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ํ™œ์šฉํ•˜์—ฌ ํŠน์ • ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅ
  • props์™€ state์— ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • useEffect()์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ โ†’ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ์‹œ ์‹คํ–‰๋จ (์ •๋ฆฌ ์ž‘์—… ๊ฐ€๋Šฅ)

๐Ÿš€ 3. useMemo() โ€“ ์—ฐ์‚ฐ ์ตœ์ ํ™”

  • ๊ฐ’์„ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ ๋ฐฉ์ง€
  • ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋ฏ€๋กœ ๋ Œ๋”๋ง ์ค‘ ์‹คํ–‰ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ์ž‘์—…์„ ๋„ฃ์ง€ ์•Š๋„๋ก ์ฃผ์˜
  • ์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งŒ ์ƒˆ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ์กด ๊ฐ’์„ ๋ฐ˜ํ™˜

๐Ÿ”„ 4. useCallback() โ€“ ํ•จ์ˆ˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

  • useMemo()์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๊ฐ’์ด ์•„๋‹ˆ๋ผ "ํ•จ์ˆ˜"๋ฅผ ๋ฉ”๋ชจ์ด์ œ์ด์…˜
  • ๋ถˆํ•„์š”ํ•œ ํ•จ์ˆ˜ ์žฌ์ •์˜๋ฅผ ๋ง‰์•„ ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ํ•จ์ˆ˜ ์žฌ์ •์˜๋ฅผ ๋ง‰์•„ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง ๋ฐฉ์ง€

๐Ÿ“Œ 5. useRef() โ€“ DOM ์š”์†Œ ์ ‘๊ทผ & ๋ Œ๋”๋ง ์˜ํ–ฅ ์—†์Œ

  • ํŠน์ • ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” DOM ์š”์†Œ์— ๋Œ€ํ•œ ์ฐธ์กฐ ๊ฐ์ฒด ์ƒ์„ฑ
  • ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋„ ๊ฐ’์ด ์œ ์ง€๋จ
  • ์ฃผ๋กœ DOM ์š”์†Œ ์ ‘๊ทผ, ํฌ์ปค์Šค ์„ค์ •, ์ด์ „ ๊ฐ’ ์ €์žฅ ๋“ฑ์— ํ™œ์šฉ

โš ๏ธ ํ›… ์‚ฌ์šฉ ๊ทœ์น™

โœ… ๋ฐ˜๋“œ์‹œ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ ํ˜ธ์ถœ (๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ ํ•จ์ˆ˜ ๋‚ด์—์„œ ํ˜ธ์ถœ X)
โœ… ๋ฆฌ์•กํŠธ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋˜๋Š” ์ปค์Šคํ…€ ํ›… ๋‚ด๋ถ€์—์„œ๋งŒ ํ˜ธ์ถœ ๊ฐ€๋Šฅ


๐Ÿ”น ์ปค์Šคํ…€ ํ›…(Custom Hook)

โœ… 1. ์ปค์Šคํ…€ ํ›…์ด๋ž€?

  • use๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•จ์ˆ˜
  • ๋‚ด๋ถ€์—์„œ ๋‹ค๋ฅธ ํ›…๋“ค์„ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ์ค‘๋ณต๋˜๋Š” ๋กœ์ง์„ ์ถ”์ถœํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€

โœ… 2. ๊ทœ์น™

  • use๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„ ์‚ฌ์šฉ โ†’ ํ›… ๊ทœ์น™ ์œ„๋ฐ˜ ์—ฌ๋ถ€๋ฅผ ์ž๋™์œผ๋กœ ํ™•์ธ ๊ฐ€๋Šฅ
  • ๋‹ค๋ฅธ ํ›…์„ ๋‚ด๋ถ€์—์„œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฐ˜ํ™˜๊ฐ’์„ ์ž์œ ๋กญ๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ

โœ… 3. ์ปค์Šคํ…€ ํ›…์˜ ์žฅ์ 

  • ๋กœ์ง ๋ถ„๋ฆฌ ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€
  • ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ (์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง)
  • ์ƒํƒœ ๋ฐ ๋ถ€์ˆ˜ ํšจ๊ณผ ๊ด€๋ฆฌ ์šฉ์ด

๐Ÿ”น ์ด๋ฒคํŠธ(Event) ์ •๋ฆฌ

โœ… 1. ์ด๋ฒคํŠธ๋ž€?

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ, ํ‚ค๋ณด๋“œ ์ž…๋ ฅ ๋“ฑ ํŠน์ • ํ–‰๋™์„ ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์‚ฌ๊ฑด

โœ… 2. ๋ฆฌ์•กํŠธ์—์„œ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

๊ตฌ๋ถ„ DOM ์ด๋ฒคํŠธ ๋ฆฌ์•กํŠธ ์ด๋ฒคํŠธ
์ด๋ฒคํŠธ ์ด๋ฆ„ ์†Œ๋ฌธ์ž ํ‘œ๊ธฐ (onclick) ์นด๋ฉœ ํ‘œ๊ธฐ๋ฒ• (onClick)
์ด๋ฒคํŠธ ์ „๋‹ฌ ๋ฌธ์ž์—ด ์ „๋‹ฌ ("handleClick()") ํ•จ์ˆ˜ ์ „๋‹ฌ ({handleClick})

โœ… 3. ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ(Event Handler)

  • ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์‹œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜
  • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ(Event Listener) ๋ผ๊ณ ๋„ ํ•จ

โœ… 4. ํด๋ž˜์Šค vs ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ


๐Ÿ”น ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ

  • ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ this๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ์ƒ์„ฑ์ž์—์„œ ๋ฐ”์ธ๋”ฉํ•ด์•ผ ํ•จ
class MyComponent extends React.Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }
  handleClick() {
    console.log("ํด๋ฆญ๋จ!");
  }
  render() {
    return <button onClick={this.handleClick}>ํด๋ฆญ</button>;
  }
}

 

๐Ÿ”น ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ

  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ this ๋ฌธ์ œ ํ•ด๊ฒฐ
function MyComponent() {
  const handleClick = () => console.log("ํด๋ฆญ๋จ!");
  
  return <button onClick={handleClick}>ํด๋ฆญ</button>;
}

 

 

Argument?

โ€ข ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ๋ฐ์ดํ„ฐ
โ€ข ํŒŒ๋ผ๋ฏธํ„ฐ ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•จ

  • ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ
    โ€ข arrow function์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Function.prototype.bind๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ „๋‹ฌ
  • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ
    โ€ข ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ํ˜ธ์ถœ ์‹œ ์›ํ•˜๋Š” ์ˆœ์„œ๋Œ€๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋„ฃ์–ด์„œ ์‚ฌ์šฉ

 

728x90
๋ฐ˜์‘ํ˜•