[๐Ÿ’ป ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  FE 44๊ธฐ] State ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ(Lifting State Up), useEffect, ์ˆœ์ˆ˜ํ•จ์ˆ˜, ๋ถ€์ˆ˜ํšจ๊ณผ

JiEunยท2023๋…„ 3์›” 31์ผ
0
post-thumbnail

โœ”๏ธ ์‹œ์ž‘

State ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ ๋Œ€ํ•ด ํ•™์Šตํ–ˆ๋‹ค. ์ด์ „ Javascript ์ฝœ๋ฐฑํ•จ์ˆ˜์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ
props๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ ๊ฐ™๋‹ค.


๐Ÿ“ ๋ฐฐ์šด ๊ฒƒ

์ƒํƒœ ๋Œ์–ด ์˜ฌ๋ฆฌ๊ธฐ

  • ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ "์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜"๊ทธ ์ž์ฒด๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ณ ,
    ์ด ํ•จ์ˆ˜๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰ํ•œ๋‹ค.
  • ์ „๋‹ฌ์€ props๋ฅผ ์ด์šฉํ•œ๋‹ค.(props ์ด๋ฆ„ ์ ์ ˆํ•˜๊ฒŒ ์ง€์›Œ์ฃผ๊ธฐ)
  • <ChildComponent>๋Š” ๋งˆ์น˜ ๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ์ธ์ž๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋“ฏ,
    props๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์‹คํ–‰ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • "์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜"๋Š” ๋ฒ„ํŠผ์ด ํด๋ฆญ ํ•  ๋•Œ ์‹คํ–‰๋˜๊ธธ ์›ํ•ด ํ•ด๋‹น ๋ถ€๋ถ„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
import React, { useState } from "react";

export default function ParentComponent() {
  const [value, setValue] = useState("์ดˆ๊ธฐ๊ฐ’");

  const handleChangeValue = (value) => {
    setValue(value);
  };

  return (
    <div>
      <div>๊ฐ’์€ {value} ์ž…๋‹ˆ๋‹ค</div>
      <ChildComponent />
    </div>
  );
}

function ChildComponent({handleBtnClick}) {
  const handleClick = () => {
    // ์ด ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ๋ถ€๋ชจ์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€๋ ค๋ฉด
    // ์ธ์ž๋กœ ๋ฐ›์€ ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    handleBtnClick('๋„˜๊ฒจ์ค„ ์ž์‹์ด ์›ํ•˜๋Š” ๊ฐ’')
  };

  return <button onClick={handleClick}>๊ฐ’ ๋ณ€๊ฒฝ</button>;
}
  • <ChildComponent>๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ์ธ์ž๋กœ ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ํžํ–‰ํ•˜๋“ฏ, props๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • "์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜"๋Š” ๋ฒ„ํŠผ์ด ํด๋ฆญํ•  ๋•Œ ์‹คํ–‰๋˜๊ธฐ ์›ํ•ด ํ•ด๋‹น ๋ถ€๋ถ„์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

๋ถ€์ˆ˜ํšจ๊ณผ(Side Effect)

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ fetch๋ฅผ ์‚ฌ์šฉํ•ด API ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•  ๋•Œ ๋ฐœ์ƒ
let a = "hello";
function b(){
	a = "world";
}
b(); // b๋Š” Side Effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์ˆœ์ˆ˜ํ•จ์ˆ˜(Pure Function)

  • ์˜ค์ง ํ•จ์ˆ˜์˜ ์ž…๋ ฅ(๋งค๊ฐœ๋ณ€์ˆ˜)๋งŒ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ•จ์ˆ˜
  • ํ•จ์ˆ˜์˜ ์ž…๋ ฅ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฒฝ์šฐ
function upper(str){
	return str.toUpperCase(); // toUpperCase๋Š” ์›๋ณธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
}
upper("hello");

React ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ

  • props๊ฐ€ ์ž…๋ ฅ์œผ๋กœ, JSX Element๊ฐ€ ์ถœ๋ ฅ
    (๊ทธ ์–ด๋–ค Side Effect๋„ ์—†๊ณ  ์ˆœ์ˆ˜ํ•จ์ˆ˜๋กœ ์ž‘๋™๋œ๋‹ค.)
  • React๋Š” Side Effect๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด Hook์ธ Effect Hook์„ ์ œ๊ณตํ•œ๋‹ค.
function myList([a, b, c]){
	return(
    	<div>
      		<div>{a}</div>
            <div>{b}</div>
            <div>{c}</div>
      	</div>
    )
}

React ์ปดํฌ๋„ŒํŠธ์—์„œ Side Effect

  • ํƒ€์ด๋จธ ์‚ฌ์šฉ (setTimeout)
  • ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ (fetch API, local storage)

Effect Hook

  • useEffect๋ฅผ ์ด์šฉํ•˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ Side Effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Hook
useEffect(ํ•จ์ˆ˜, [์ข…์†์„ฑ1, ์ข…์†์„ฑ2, ...])

1. useEffect ์ฒซ๋ฒˆ์งธ ์ธ์ž๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค.

  • ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ Side Effect๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  • useEffect(ํ•จ์ˆ˜)์ธ ๊ฒฝ์šฐ
    - ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ํ›„ ์ฒ˜์Œ ํ™”๋ฉด์— ๋ Œ๋”๋ง
    - ์ปดํฌ๋„ŒํŠธ์— ์ƒˆ๋กœ์šด props๊ฐ€ ์ „๋‹ฌ๋˜๋ฉด ๋ Œ๋”๋ง
    - ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ(state)๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋žœ๋”๋ง
    - ๋งค๋ฒˆ ์ƒˆ๋กญ๊ฒŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ Effect Hook์ด ์‹คํ–‰๋œ๋‹ค.

์ด์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ์ตœ์ƒ์œ„์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•œ๋‹ค.
  • Reactํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•œ๋‹ค.

2. useEffect ๋‘๋ฒˆ์งธ ์ธ์ž๋Š” ์ข…์†์„ฑ ๋ฐฐ์—ด์ด๋‹ค.

  • ๋ฐฐ์—ด์€ ์กฐ๊ฑด์„ ๋‹ด๊ณ  ์žˆ๋‹ค.(์กฐ๊ฑด์€ boolean ํ˜•ํƒœ์˜ ํ‘œํ˜„์‹์ด ์•„๋‹Œ ์–ด๋–ค ๊ฐ’์— ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ)
    - ํ•ด๋‹น ๋ฐฐ์—ด์ด "์–ด๋–ค ๊ฐ’์˜ ๋ชฉ๋ก"์ด ๋“ค์–ด๊ฐ€๊ณ  ์ด๋ฅผ ์ข…์†์„ฑ ๋ฐฐ์—ด์ด๋ผ ํ•œ๋‹ค.
  • ๋ฐฐ์—ด ๋‚ด์˜ ์ข…์†์„ฑ2์˜ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ ์ฒซ๋ฒˆ์งธ ์ธ์ž์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” Effect ํ•จ์ˆ˜

//1. ๋นˆ ๋ฐฐ์—ด ๋„ฃ๊ธฐ
useEffect(ํ•จ์ˆ˜, [])
//2. ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ์•Š๊ธฐ(๊ธฐ๋ณธํ˜•ํƒœ)
useEffect(ํ•จ์ˆ˜)

์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌ

์žฅ์ 

  • hTTP ์š”์ฒญ์˜ ๋นˆ๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์ 

  • ๋ธŒ๋ผ์šฐ์ €(ํด๋ผ์ด์–ธํŠธ)์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ–๊ฒŒ ๋˜๊ณ , ํด๋ผ์ด์–ธํŠธ ๋ถ€๋‹ด์ด ๋Š˜์–ด๋‚œ๋‹ค.

์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ ์ฒ˜๋ฆฌ

์žฅ์ 

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„ํ„ฐ๋ง ๊ตฌํ˜„์„ ์ƒ๊ฐํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

๋‹จ์ 

  • ๋นˆ๋ฒˆํ•œ HTTP์š”์ฒญ์ด ์ผ์–ด๋‚˜๊ฒŒ ๋˜๋ฉฐ ์„œ๋ฒ„๊ฐ€ ํ•„ํ„ฐ๋ง์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์„œ๋ฒ„๊ฐ€ ๋ถ€๋‹ด์„ ๊ฐ€์ง„๋‹ค.

โœ๏ธ ๋งˆ์น˜๋ฉฐ

์ƒํƒœ ๋Œ์–ด ์˜ฌ๋ฆฌ๊ธฐ๋Š” ๋ด๋„ ๋ด๋„ ์ •๋ง ์ดํ•ด๊ฐ€ ์ž˜ ์•ˆ๊ฐ€๋Š” ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.
Javascript์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์™€ ๋น„์Šทํ•œ ๋งฅ๋ฝ์ธ๋“ฏ ์‹ถ๋‹ค.

๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ๋ฌธ์ œ์˜ ๋‹ต์€ ๊ฐ„๋‹จํ–ˆ์ง€๋งŒ
ํ๋ฆ„ ํŒŒ์•…ํ•˜๋Š”๊ฒŒ ์ƒ๊ฐ ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.

React์˜ ํ๋ฆ„์„ ์ œ๋Œ€๋กœ ํŒŒ์•…ํ•ด์•ผ ๋‹ค์Œ ๊ณผ์ œ์—๋„
์‰ฝ๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ ์‹ถ๋‹ค.

profile
๐Ÿ’ป ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ชฉํ‘œ๋กœ ์„ฑ์žฅ ์ค‘! (์•Œ์•„๋ดค๋˜ ๋‚ด์šฉ ๋“ฑ์„ ์ •๋ฆฌํ•˜๊ธฐ)

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