๐Ÿš€React ์ฑŒ๋ฆฐ์ง€ Day4

westZeroยท2023๋…„ 6์›” 5์ผ
0

JS & ๋ฆฌ์•กํŠธ ์ฑŒ๋ฆฐ์ง€

๋ชฉ๋ก ๋ณด๊ธฐ
4/10

3์ผ์ฐจ๋ž‘ ๋˜‘๊ฐ™์€ ๋งด. ์–ด๋ ต์ง€๋งŒ ํšจ์œจ์ ์ด๋‹ค...

์˜ค๋Š˜์€ ๊ฐ„๋‹จํ•œ ์นด์šดํ„ฐ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค!
๋‹ค๋งŒ ๋‹ˆ๊ผฌ์Œค์ด ํ•˜๋ผ๋Š” ๋ฐฉ๋ฒ•๋Œ€๋กœ ์ž‘์„ฑํ–ˆ๋”๋‹ˆ!

import Button from "./Button";
import styles from "./App.module.css";
import { useState } from "react";

function App() {
  // ํ•จ์ˆ˜์ปดํฌ๋„ŒํŠธ
  const [counter, setValue] = useState(0);
  const onClick = () => setValue((prev) => prev + 1);
  console.log("render");
  //์ด๋ ‡๊ฒŒ ํ•˜๋ฉด counter์˜ ์ดˆ๊ธฐ๊ฐ’์€ 0์ด ๋˜๊ณ  setvalue๋Š” counter modifyํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€๋Œ
  return (
    <div>
      <h1 className={styles.title}>{counter}</h1>
      <Button text={"continue"} />
      <Button text={"hola"} />
      <button onClick={onClick}>click me</button>
    </div>
  );
}

export default App;

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ๊ณ„์†ํ•ด์„œ render๊ฐ€ ๋‘๋ฒˆ ๋ฐ˜๋ณตํ•˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•˜๋”๋ผ๊ณ ์š”;;

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById("root")
);

์ฐฉ์•„๋ณด๋‹ˆ index.js์— React.StrictMode์˜ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค!

.
StrictMode๋Š” create-react-app๋กœ ์„ค์น˜ํ–ˆ์„ ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํ…Œ๊ทธ๋กœ,
ํ•ด๋‹น ํ…Œ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ ์ž์†๊นŒ์ง€ ๊ฒ€์‚ฌํ•œ๋‹คํ•ด์„œ ๋‘ ๋ฒˆ ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
React.StrictMode ํ…Œ๊ทธ๋ฅผ ์ง€์šฐ์‹œ๊ณ  ๋‹ค์‹œํ•˜๋ฉด ์ •์‚ฌ์ ์œผ๋กœ ํ•œ ๋ฒˆ๋งŒ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค!.
ํ•ด๋‹น ํƒœ๊ทธ๋Š” ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‘ ๋ฒˆ ๋ Œ๋”๋ง ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.(๊ฐœ๋ฐœ์šฉ์ด ์•„๋‹Œ ํ”„๋กœ๋•์…˜์šฉ)

์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฌธ์ œํ•ด๊ฒฐ!

๊ทธ๋Ÿฐ๋ฐ ๋งค๋ฒˆ ํด๋ฆญ๋˜๋Š” ์š”์†Œ๋“ค๊นŒ์ง€ ๋ Œ๋”๋ง ํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ์ œ์ผ ์ฒ˜์Œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ๋งŒ renderingํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด?

์ด๋Ÿฐ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•ด์„œ useEffect๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์Œ
์ผ๋‹จ useEffect์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐœ์˜ arguments๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค!

์ฒซ๋ฒˆ์งธ argument๋Š” ๋”ฑ ํ•œ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ/๋‘๋ฒˆ์งธ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ๋ถ€๋ถ„!

import Button from "./Button";
import styles from "./App.module.css";
import { useState, useEffect } from "react";

function App() {
  // ํ•จ์ˆ˜์ปดํฌ๋„ŒํŠธ
  const [counter, setValue] = useState(0);
  const onClick = () => setValue((prev) => prev + 1);
  console.log("I run all the time");
  const iRunOnlyOnce = () => {
    console.log("I Run Only Once");
  };
  useEffect(() => {
    console.log("Call the API");
  }, []);
  return (
    <div>
      <h1 className={styles.title}>{counter}</h1>
      <Button text={"continue"} />
      <Button text={"hola"} />
      <button onClick={onClick}>click me</button>
    </div>
  );
}

export default App;

ํ•ด๋‹น ์ฝ”๋“œ์—์„œ๋Š” ๋’ค์— ๋นˆ ๋ฐฐ์—ด๊ฐ’์œผ๋กœ ๋ฐ›์•„์„œ ๊ธฐ์กด ์ฝ”๋“œ์— ์ž‘์„ฑ๋˜์–ด ์žˆ๋˜ console์ด ์žฌ์‚ฌ์šฉ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์ด๋Ÿฐ์‹์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๋„๋ก useEffect๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”๋ฐ ๊ฐœ๋ฐœ ํ—ˆ์ ‘๋”ฐ๋ฆฌ ์ฉ”๋”ฐ๋ฆฌ์ธ ์ „ ๋ฌธ๋“ ๋ฆฌ๋ Œ๋”๋ง์ด ์™œ ๋‚˜์œ๊ฑธ๊นŒํ•˜๋Š” ์˜๋ฌธ์ด ๋“ค์—ˆ์Œ๋‹ค.

๋ Œ๋”๋ง์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ๋˜๋Š” ์ด์œ 

1. ์„ฑ๋Šฅ์ €ํ•˜

๋ Œ๋”๋ง์ด ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด ๋งŽ์€ ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ฌ์šฉ๋˜์–ด ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค,
์ด๋กœ ์ธํ•ด์„œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Š๋ ค์ง€๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ๋‹ค.

2. ๋ถˆํ•„์š”ํ•œ ์ž‘์—…

๋ Œ๋”๋ง์ด ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฑด ์ปดํฌ๋„ŒํŠธ ์ „์ฒด๋ฅผ ์žฌ์„ฑ์„ฑํ•˜๊ณ  ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ์ž‘์—…์„ ๋ฐ˜๋ณตํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ด๋Š” ์ž‘์—…์„ ๋งŽ์ด ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋˜์–ด ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์œ„์™€ ๊ฐ™์ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด ์„ฑ๋Šฅ ์ €ํ•˜์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ! useEffect๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ์š”!

1.side effects ๊ด€๋ฆฌ ์–ด๋ ค์›€

useEffect๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ƒ๋ช…์ฃผ๊ธฐ ๋™์•ˆ ๋ฐœ์ƒํ•˜๋Š” side effects๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ side effects๋ฅผ useEffect ์—†์ด ๊ตฌํ˜„ํ•˜๋ฉด ์ž‘์—…์„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฉฐ, ์ด ๋•Œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ œ์•ฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , ์ด ํ•จ์ˆ˜์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๋Š” ๋“ฑ ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์„ useEffect ์—†์ด ์ฒ˜๋ฆฌํ•˜๋ฉด ๋””๋ฒ„๊น…์ด ์–ด๋ ค์›Œ์ง€๊ณ  ์ฝ”๋“œ๋„ ๋” ๊ธธ์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

side effects๊ฐ€ ๋ญ˜๊นŒ์š”?
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋‚˜ ์˜ํ–ฅ์„ ์˜๋ฏธํ•œ๋‹ต๋‹ˆ๋‹ค

2.๋ฌดํ•œ ๋ฃจํ”„

useEffect๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŠน์ • ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง์ด ์ˆ˜ํ–‰๋˜, ์ด ๋•Œ๋งˆ๋‹ค ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌดํ•œ ๋ฃจํ”„๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3.์†๋„ ์ €ํ•˜

useEffect๋ฅผ ์‚ฌ์šฉ ์•Š์œผ๋ฉด performance issue์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ง์ ‘ ๋“ฑ๋กํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์— ๋ถ€์ฐฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ๋ Œ๋”๋ง ์†๋„ ์ €ํ•˜ ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ useEffect๋ฅผ ์ด์šฉํ•˜๋ฉด, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ์˜ side effects๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์„ฑ๋Šฅ ์ด์Šˆ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ์“ฐ๊ณ ์‹ถ์€๋ฐ!
์ž๊พธ ๋‹ˆ๊ผฌ์Œค ๊ฐ•์˜์— useMemo์™€ useEffect๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ธ€๋“ค์ด ๋งŽ๋”๋ผ๊ณ ์š”!
๊ทธ๋ž˜์„œ ์“ฐ๊ฒŒ๋˜๋ฒ„๋ฆฐ!!

useMemo์™€ useEffect์˜ ์ฐจ์ด์ ๊ณผ ์žฅ๋‹จ์ !

ํ•ญ๋ชฉuseMemouseEffect
๋ชฉ์ ๊ฐ’์˜ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ปดํฌ๋„ŒํŠธ์˜ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ๊ด€๋ฆฌ
์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ค‘, ์—ฐ์‚ฐ ๊ฒฐ๊ณผ ๊ฐ’์„ ์บ์‹œํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง(Rerender) ์ดํ›„, ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์™€ ๊ฐ™์€ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ฒ˜๋ฆฌ ๋ฐ ํด๋ฆฐ์—…
์ตœ์ ํ™”์ž…๋ ฅ ๊ฐ’์— ๋”ฐ๋ฅธ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ  ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ํ”ผํ•จ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ์™€ ๊ด€๋ จ๋œ ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ตœ์†Œํ™”

useMemo ์žฅ์ 

1.๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ตœ์†Œํ™”ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2.๋™์ผํ•œ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•ด ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผํ•˜์—ฌ ๋ Œ๋”๋ง ๊ณผ์ •์„ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค.

useMemo ๋‹จ์ 

1.๋ฉ”๋ชจ์ด์ œ์ด์…˜์œผ๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2.๋™์ผํ•œ ์ž…๋ ฅ ๊ฐ’์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ์— ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

useEffect ์žฅ์ 

1.์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์ฃผ๊ธฐ(Lifecycle)์— ๋”ฐ๋ผ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
2.์ปดํฌ๋„ŒํŠธ์˜ ์ƒ์ฃผ๊ธฐ(Lifecycle)์— ๋”ฐ๋ผ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

useEffect ๋‹จ์ 

1.componentDidUpdate์™€ ๊ฐ™์€ ๋‹ค์–‘ํ•œ ์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํŒŒ์•…์ด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์ด์ƒ์ด์š”.

profile
mi carro es bonito

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

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด