๐Ÿ–ฅFrontEnd/React

๋ฆฌ์•กํŠธ์˜ Side Effect, ๋กœ๊ทธ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•

hellohailie 2022. 7. 24. 16:55

 

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ = ์ดํŽ™ํŠธ Side Effect

 

๋ฆฌ์•กํŠธ์˜ ์ฃผ์š” ์ž„๋ฌด

  1. UI๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋ฐ˜์‘ํ•˜์—ฌ ํ•„์š”ํ•  ๋•Œ UI๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 
  2. ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ๋”ฐ๋ฅธ ๋ฐ˜์‘ ํ™”๋ฉด์— ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฆฌ์•กํŠธ์˜ ์‚ฌ์ด๋“œ ์ดํŒฉํŠธ๋Š”??

์ฃผ์š” ์ž„๋ฌด ์™ธ์˜ ๋ชจ๋“ ๊ฒƒ!

ex) http ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ or ๋ธŒ๋ผ์šฐ์ € ์ €์žฅ์†Œ์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ or ํƒ€์ด๋จธ ๊ฐ„๊ฒฉ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ

 

์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋Š” ์ง์ ‘์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์— ๋“ค์–ด๊ฐ€์„œ๋Š” ์•ˆ๋œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋ฒ„๊ทธ๋‚˜ ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋˜๋Š” http ๋ฆฌํ€˜์ŠคํŠธ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์ด ๋ณด๋‚ด์งˆ ์ˆ˜๋„ ์žˆ๋‹ค. 

 

๊ทธ๋ž˜์„œ ์‚ฌ์ด๋“œ ์ดํŒฉํŠธ๋ฅผ ํ•ธ๋“ค๋งํ•˜๋Š” ํ›…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๊ฒŒ ๋ฐ”๋กœ useEffect์ด๋‹ค. 

useEffect(()=> {}, [dependencies]);

useEffect๋Š” ๋‘๊ฐœ์˜ ์ธ์ˆ˜๋กœ ๋ฐ›๋Š”๋ฐ, ์ฒซ๋ฒˆ์งธ๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ํ‰๊ฐ€ ํ›„์— ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ๋‘๋ฒˆ์งธ ์ธ์ˆ˜๋Š” ์ง€์ •๋œ ์˜์กด์„ฑ์ด๋‹ค. (์˜์กด์„ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์ด๋‹ค. )

 

์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. (์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋  ๋•Œ๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.)

 

๊ทธ๋ž˜์„œ ํ•จ์ˆ˜์— ์–ด๋–ค ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ ์ฝ”๋“œ๋ผ๋„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. 

 

 


 

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

 

๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค๋ฉด ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋‹ค์‹œ ์‹œ์ž‘ํ•ด๋„ ์œ ์ง€๋˜๋Š” ๊ณณ์—!

์ด๋ณด๋‹ค ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ด ์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ž๋™์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋‹ค์‹œ ๋กœ๊ทธ์ธ์‹œํ‚จ๋‹ค. 

==>>> useEffect๋ฅผ ์‚ฌ์šฉํ•˜์ž!

 

๋ธŒ๋ผ์šฐ์ €์— ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ ์ค‘์— ํ•˜๋‚˜๋Š” ์ฟ ํ‚ค์™€ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์ด๋‹ค. ์ž‘์—…ํ•˜๊ธฐ ์‰ฌ์šด ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ถ€ํ„ฐ ์‚ฌ์šฉํ•ด๋ณด์ž!

๋ธŒ๋ผ์šฐ์ €์— ๋‚ด์žฅ๋œ ์ €์žฅ ๋งค์ปค๋‹ˆ์ฆ˜์€ ๋ฆฌ์•กํŠธ์™€ ์•„๋ฌด ์ƒ๊ด€์—†๋‹ค. 

 

๋กœ๊ทธ์ธํ•  ๋•Œ ์œ ์ € ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์„๋•Œ๋Š”, ์ž์ฃผ ์ผ์–ด๋‚˜๋Š” ์ผ๋„ ์•„๋‹ˆ๊ณ , ๋ฌด์–ธ๊ฐ€๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋งŒ ์‹คํ–‰๋˜๋Š” ๊ฑฐ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์—๋Š” useEffect ๋ฅผ ๋ฐ˜๋“œ์‹œ ์“ธ ํ•„์š”๊ฐ€ ์—†๋‹ค. 

 

ํ•˜์ง€๋งŒ ์•ฑ์ด ๋‹ค์‹œ ์‹œ์ž‘๋˜๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด(์œ ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚ฌ๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์˜ค๋Š” ๊ฒฝ์šฐ or ๋‹จ์ˆœํžˆ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋Š” ๊ฒฝ์šฐ) ๊ทธ๋Ÿฌ๋ฉด ๋กœ์ปฌ ์ €์žฅ์†Œ์— ํ‚ค-๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ฉด ๋œ๋‹ค. 

 

์•ฑ์ด ๋‹ค์‹œ ์‹œ์ž‘๋˜๋ฉด App ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋Š” ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹น์—ฐํžˆ ์ด ํ•จ์ˆ˜์—์„œ๋Š” ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

localStorage.setItem("isLoggedIn");

App ์ปดํฌ๋„ŒํŠธ ์ „์—ญ์—์„œ "isLoggedIn" ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๊ฑฐ๊ธฐ์— ์ €์žฅ๋œ ํ•ญ๋ชฉ์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

 

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  const storedUserLoggedInInformation = localStorage.getItem("isLoggedIn");
  if (storedUserLoggedInInformation === "1") {
      setIsLoggedIn(true);
  }
  
 ...

๊ทธ๋ž˜์„œ ๐Ÿ‘†์œ„ ์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ง ๋‹ค๋ฉด ๋‹จ์  => ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค. 

์™œ๋ƒํ•˜๋ฉด

storedUserLoggedInInformation === "1"

๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉด

setIsLoggedIn

๋ฅผ true๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  state ์„ค์ • ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์†๋œ๋‹ค. ==>> ๊ทธ๋ž˜์„œ useEffect๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. 

 

๊ทธ๋Ÿฌ๋ฉด ์–ธ์ œ ์‹คํ–‰๋ ์ง€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค!!

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  useEffect(() => {
    const storedUserLoggedInInformation = localStorage.getItem("isLoggedIn");
    if (storedUserLoggedInInformation === "1") {
      setIsLoggedIn(true);
    }
  }, []);
...

๊ทธ๋ž˜์„œ ๐Ÿ‘†์œ„ ์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ง ๋‹ค๋ฉด ์•„๋ž˜์˜ ํ•จ์ˆ˜๋Š” ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์—์„œ ์ง์ ‘ ์‹คํ–‰๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ๋ฆฌ์•กํŠธ์— ์˜ํ•ด ์‹คํ–‰๋œ๋‹ค. 

๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ์žฌํ‰๊ฐ€ ํ›„์— ์‹คํ–‰๋œ๋‹ค. 

 

์ฆ‰, App ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ํ›„์— ์•„๋ž˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ณ , ๊ทธ๋Ÿฐ ๋‹ค์Œ setIsLoggedIn(true); ์™€ ๊ฐ™์ด state๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. 

 

 const storedUserLoggedInInformation = localStorage.setItem("isLoggedIn");
    if (storedUserLoggedInInformation === "1") {
      setIsLoggedIn(true);
    }

 

๊ทธ๋Ÿฐ๋ฐ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ ํ‰๊ฐ€ ํ›„์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋œ๋‹ค. 

 

App ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๊ฐ€ ์ฒ˜์Œ์œผ๋กœ ์‹คํ–‰๋˜๋‹ค๋ฉด ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ์™œ๋ƒ๋ฉด ์˜์กด์„ฑ์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—!

 


์˜์กด์„ฑ ๋ฐฐ์—ด์ด [] ๋นˆ์นธ์ด๋ฉด ์˜์กด์„ฑ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์•ฑ์ด ์‹œ์ž‘๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋œ๋‹ค. ๊ทธ ์ดํ›„๋กœ ์˜์กด์„ฑ์€ ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  useEffect(() => {
    const storedUserLoggedInInformation = localStorage.getItem("isLoggedIn");
    if (storedUserLoggedInInformation === "1") {
      setIsLoggedIn(true);
    }
  }, []);
...

์œ„์˜ ์˜๋ฏธ

์•ฑ์ด ์‹œ์ž‘๋˜๋ฉด useEffect ์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  setIsLoggedIn์—์„œ state๊ฐ€ ์—…๋ฐ์ดํŠธ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๋„๋ก ํŠธ๋ฆฌ๊ฑฐ๋œ๋‹ค. ๊ทธ๋ž˜์„œ App ์•ˆ์˜ ์ฝ”๋“œ๊ฐ€ ์ „๋ถ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๊ณ , JSX ์ฝ”๋“œ๊ฐ€ ํ‰๊ฐ€๋˜๊ณ , DOM์ด ๊ทธ์— ๋”ฐ๋ผ ์—…๋ฐ์ดํŠธ๋œ๋‹ค. ๊ทธ ํ›„, effect๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๋Š”๋ฐ, ์˜์กด์„ฑ์ด ๋ณ€๊ฒฝ๋œ ๊ฒฝ์šฐ์—๋งŒ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. 

 

 


๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์—์„œ ๋ฐ์ดํ„ฐ ์ง€์šฐ๊ธฐ

 

 const logoutHandler = () => {
    localStorage.removeItem("isLoggedIn");
    setIsLoggedIn(false);
  };

๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ๋‹ค์‹œ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ๊ฐ€์„œ "isLoggedIn" ํ‚ค๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. 

 

 


์ „์ฒด ์ฝ”๋“œ

import React, { useState, useEffect } from "react";

import Login from "./components/Login/Login";
import Home from "./components/Home/Home";
import MainHeader from "./components/MainHeader/MainHeader";

function App() {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  useEffect(() => {
    const storedUserLoggedInInformation = localStorage.getItem("isLoggedIn");
    if (storedUserLoggedInInformation === "1") {
      setIsLoggedIn(true);
    }
  }, []);

  const loginHandler = (email, password) => {
    // ์—ฌ๊ธฐ์— ๋กœ์ปฌ ์ €์žฅ์†Œ๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž
   
    localStorage.setItem("isLoggedIn", "1"); // setItem์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „์—ญ ๊ฐ์ฒด์ด๋‹ค. ์—ฌ๊ธฐ์— ์•„๋ฌด ์‹๋ณ„์ž๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๋กœ๊ทธ์ธํ–ˆ๋‹ค 1, ์•ˆํ–ˆ๋‹ค 0
    setIsLoggedIn(true);
  };

  const logoutHandler = () => {
    localStorage.removeItem("isLoggedIn");
    setIsLoggedIn(false);
  };

  return (
    <React.Fragment>
      <MainHeader isAuthenticated={isLoggedIn} onLogout={logoutHandler} />
      <main>
        {!isLoggedIn && <Login onLogin={loginHandler} />}
        {isLoggedIn && <Home onLogout={logoutHandler} />}
      </main>
    </React.Fragment>
  );
}

export default App;

 

 

๐Ÿ˜ƒ ์ž˜๋ชป๋œ ๊ฐœ๋… ์ „๋‹ฌ์ด ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ €์˜ ์„ฑ์žฅ์— ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค๐Ÿค“