TIL 33: [React] ๋ฐ์ดํ„ฐ ํ๋ฆ„์˜ ์ดํ•ด์™€ ๋น„๋™๊ธฐ ์š”์ฒญ ์ฒ˜๋ฆฌ

Section 1์—์„œ ๊ฐ€์žฅ ์–ด๋ ต๋‹ค๊ณ  ๋А๊ปด์กŒ๋˜ React ๋ถ€๋ถ„์„ ๋‹ค์‹œ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์™”๋‹ค ๊ฐ”๋‹ค ๋งŽ์ด ํ•ด์„œ ์ข€ ์ •์‹ ์—†์—ˆ๊ธด ํ–ˆ์ง€๋งŒ ์ข€๋งŒ ๋ฐฐ์› ๋˜ ๋‚ด์šฉ ๋” ์ •๋ฆฌํ•˜๋ฉด ์ดํ•ด ์ž˜ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”!๐Ÿ˜Š ๋‚ด์ผ๊นŒ์ง€ React๋ฅผ ์ด์šฉํ•œ ํ•ญ๊ณต๊ถŒ ์˜ˆ์•ฝ ์‚ฌ์ดํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š”๋ฐ์š”. ์•„์ง REST API๋กœ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ๋ชปํ’€์—ˆ์ง€๋งŒ ๋‚ด์ผ๊นŒ์ง€ ํ’€ ์ˆ˜ ์žˆ๋„๋ก ๋งˆ์ € ์—ด์‹ฌํžˆ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹น

 

 

Lifting State Up

React์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ํ•˜ํ–ฅ์‹์ธ๋ฐ์š”. ๋”ฐ๋ผ์„œ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ์ƒํƒœ๊ฐ€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ๋ณ€ํ™”ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋Š”๋ฐ์š”. ์ด ๊ฒฝ์šฐ React์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์ธ ํ•˜ํ–ฅ์‹์— ์œ„๋ฐฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Lifting state up์ด๋ผ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

import React, { useState } from "react";

export default function ParentComponent() {
  const [value, setValue] = useState("๋‚  ๋ฐ”๊ฟ”์ค˜!");

  const handleChangeValue = () => {
    setValue("๋ณด์—ฌ์ค„๊ฒŒ ์™„์ „ํžˆ ๋‹ฌ๋ผ์ง„ ๊ฐ’");
  };

  return (
    <div>
      <div>๊ฐ’์€ {value} ์ž…๋‹ˆ๋‹ค</div>
      <ChildComponent handleButtonClick = {handleChangeValue}/> //๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ์˜ ํ•จ์ˆ˜๋ฅผ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ
    </div>
  );
}

function ChildComponent({handleButtonClick}) {
  const handleClick = () => {
    handleButtonClick(); // ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋ถ€๋ชจ์˜ ์ปดํฌ๋„ŒํŠธ ๋ณ€๊ฒฝ
  };

  return <button onClick={handleClick}>๊ฐ’ ๋ณ€๊ฒฝ</button>; //๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด handleClick ํ•จ์ˆ˜ ์‹คํ–‰
}

 

 

 

 

Effect Hook

Side Effect

ํ•จ์ˆ˜ ๋‚ด์—์„œ ์–ด๋–ค ๊ตฌํ˜„์ด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ฒฝ์šฐ Side Effect๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

Side Effect๊ฐ€ ์—†๋Š” ํ•จ์ˆ˜๋Š” ์ˆœ์ˆ˜ํ•จ์ˆ˜๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์–ด๋– ํ•œ ์ „๋‹ฌ ์ธ์ž๊ฐ€ ์ฃผ์–ด์งˆ ๊ฒฝ์šฐ, ํ•ญ์ƒ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ๋ฆฌํ„ดํ•  ๊ฒƒ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ ํ•จ์ˆ˜์˜ ํŠน์ง•์„ ๊ณ ๋ คํ•˜๋ฉด Math.random()๊ณผ  fetch API๋ฅผ ์ด์šฉํ•ด AJAX ์š”์ฒญ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋Š” ์˜ˆ์ธก์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

 

 

Effect Hook

useEffect๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ Side effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Hook ์ž…๋‹ˆ๋‹ค. useEffect์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ Effect Hook์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

useEffect์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์€ boolean ๊ฐ’์ด ์•„๋‹Œ ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ๋ผ๋Š” ์กฐ๊ฑด์„ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํ•ด๋‹น ๋ฐฐ์—ด์—” ์–ด๋–ค ๊ฐ’์˜ ๋ชฉ๋ก์ด ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ด ๋ฐฐ์—ด์„ ํŠน๋ณ„ํžˆ ์ข…์†์„ฑ ๋ฐฐ์—ด์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ธ์ž์˜ ์ข…์†์„ฑ ๋ฐฐ์—ด ๋‚ด์˜ ์š”์†Œ๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

 

1. ๋นˆ ๋ฐฐ์—ด ๋„ฃ๊ธฐ: useEffect(ํ•จ์ˆ˜, [])

2. ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ์•Š๊ธฐ (๊ธฐ๋ณธ ํ˜•ํƒœ): useEffect(ํ•จ์ˆ˜)

2๋ฒˆ์ธ ๊ธฐ๋ณธ ํ˜•ํƒœ์˜ useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜, props๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๊ฑฐ๋‚˜, ์ƒํƒœ(state)๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ๋•Œ effect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— 1๋ฒˆ ๋นˆ ๋ฐฐ์—ด์„ useEffect์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์‚ฌ์šฉํ•˜๋ฉด, ์ด ๋•Œ์—๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋ ๋•Œ๋งŒ effect ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋กœ๋Š” ์™ธ๋ถ€ API๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ๋” ์ด์ƒ API ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Hook ์“ธ ๋•Œ ์ฃผ์˜ํ•  ์ 

  • ์ตœ์ƒ์œ„์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ ํ˜น์€ ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • React ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ JavaScript ํ•จ์ˆ˜์—์„œ๋Š” Hook์„ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

AJAX ์š”์ฒญ

  1. ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ฒ˜๋ฆฌ: ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์„œ ์ฒ˜๋ฆฌ
  2. ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ ์ฒ˜๋ฆฌ: ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€๋กœ API ์š”์ฒญ์„ ํ•ด์„œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ

AJAX ์š”์ฒญ์ด ๋А๋ฆด ๊ฒฝ์šฐ ์ƒํƒœ์ฒ˜๋ฆฌ๋ฆ ํ†ตํ•ด LoadingIndicator ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

const [isLoading,setIsLoading] = useState(true);

// LoadingIndicator ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ–ˆ์Œ์„ ๊ฐ€์ •
return {isLoading ? <LoadingIndicator /> : <div>๋กœ๋”ฉ ์™„๋ฃŒ ํ™”๋ฉด</div>}