๊ฐ๋จํ ์นด์ดํฐ ๋ง๋ค๊ธฐuseEffectํด์ฆ!์ค์ ์ ์ฉํด๋ณด๊ธฐ(useEffect) โ ์ค์ ์ ์ฉํด๋ณด๊ธฐ(useEffect, cleanup) โก
๊ฐ๋จํ ์นด์ดํฐ ๋ง๋ค๊ธฐ
cra๋ฅผ ํตํด ํ๋ก์ ํธ๋ฅผ ์์ฑํ๊ณ App.js๋ฅผ ์๋์๊ฐ์ด ๋ง๋ค์ด์ฃผ๊ฒ ์ต๋๋ค.
function App() { return ( <div> </div> ); }
๊ทธ๋ฆฌ๊ณ ์นด์ดํฐ๋ฅผ ๋ง๋ค์ด ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
import React, { useState } from 'react'; function Counter() { const [count, setCount] = useState(0) const countUp =(e)=>{ setCount(count+1) } return( <> <div>{count}</div> <button onClick={countUp}>up!</button> </> ) } function App() { return ( <div> <Counter/> </div> ); } export default App;
useEffect
count๊ฐ ์ปดํฌ๋ํธ์ state๋ก ์กด์ฌํ๋๋ฐ ์ด state๊ฐ ๋ณํ ๋๋ง๋ค ๋ญ๊ฐ ๋ค๋ฅธ ํจ๊ณผ๋ฅผ ์ฃผ๊ณ ์ถ์ต๋๋ค.
์๋์ ๊ฐ์ด ์์ ํ์ฌ count๊ฐ ํ์์ธ์ง ์ง์์ธ์ง ๋น๊ตํด์ alert์ ๋์์ฃผ๋๋ก ํฉ๋๋ค.
import React, { useState, useEffect } from 'react';//useEffect์ถ๊ฐ function Counter() { const [count, setCount] = useState(0) const countUp =()=>{ setCount(count+1) } //count๊ฐ ๋ณํ์๋ ๋์ํ ํ๋์ useEffect๋ฅผ ์ด์ฉํด ๊ตฌํ useEffect(() => { if(count%2){ alert("ํ์์ ๋๋ค") }else{ alert("์ง์์ ๋๋ค") } }, [count]) return( <> <div>{count}</div> <button onClick={countUp}>up!</button> </> ) } function App() { return ( <div> <Counter/> </div> ); } export default App;
ย
useEffect๋ผ๋ ๊ฒ์ ์ฌ์ฉํ์ต๋๋ค. useState์ ๋ง์ฐฌ๊ฐ์ง๋ก useEffect๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด importํฉ๋๋ค. ์ด useEffect๋ state๋ฅผ ์ง์ ํ์ฌ ํด๋น ์คํ
์ดํธ๊ฐ ๋ณ๊ฒฝ๋์์์ ๊ฐ์งํ๋ฉด ํจ์๋ฅผ ์คํ์์ผ์ค๋๋ค.
์, ์ฌ๊ธฐ์ ํ ๋ฒ ํ์ด์ง๋ฅผ ์๋ก๊ณ ์นจ ํด๋ด
์๋ค. ๊ทธ๋ฌ๋ฉด ํด๋ฆญํ์ง ์์๋๋ฐ๋ "์ง์์
๋๋ค!"๋ผ๋ ๋ฉ์์ง๊ฐ ๋์ต๋๋ค. ์ด์ ๋ ํจ์๊ฐ ์คํ๋๋ฉด์ useEffect๊ฐ ์ต์ดํ๋ฒ ์คํ๋๊ธฐ ๋๋ฌธ์
๋๋ค.
์ฆ ํ๋ฒ ์คํ ํ, ์์กด์ฑ ๋ฐฐ์ด์ ์๋ ๊ฐ์ด ๋ณํ ๋(๋๋ ๋ ๋๋ง๋ง๋ค) effect๊ฐ ์ผ์ด๋๋ ๊ฒ ์
๋๋ค..
ย
useEffect๋ฅผ ์กฐ๊ธ ๋ ์ดํด๋ด
์๋ค. ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ ์๋์๊ฐ์ต๋๋ค.
useEffect(()=>{ // state๊ฐ ๋ณ๊ฒฝ๋์ด ๋ ๋๋ง ๋ ๋ ์คํํ๋ ๋ถ๋ถ! // ๊ณต๋ถํ๋ ค๊ณ ์ฑ ํด๋ ํ์ด๋ฐ! return()=>{ // ๋ค์ ๋ ๋๋ง์ ํ๊ธฐ ์ด์ ์ ์ปดํฌ๋ํธ๋ฅผ ์ง์ฐ๊ณ ๋ค์ ๊ทธ๋ฆฌ๊ฒ ์ฃ ? // ์ด ๊ณผ์ ์์ ์ง์ฐ๊ธฐ ์ ์ ์คํ๋๋ ๋ถ๋ถ์ ๋๋ค! clean-up์ด๋ผ๊ณ ๋ ํ์ฃ . // ์ฌ๋ฌ๋ถ๋ค ์ํ ๊ณต๋ถ ํ๋๋ฅผ ๋ง์น๊ณ ๋ค์ ์ํ ๊ณต๋ถ ์ ์ ์ฑ ์ ์ ๋ฆฌํ๋ ๋๋์ด๋๊น์.. } },[/*state๊ฐ์ด ๋ค์ด๊ฐ๋๋ค.(๋ค์ด๊ฐ์ง ์์ผ๋ฉด ์ต์ด 1๋ฒ๋ง ์คํ๋ฉ๋๋ค.*/)])
ย
ํด์ฆ!
์ต์ด๋ก ๋ ๋๋ง ๋ ๋, ์ํ๊ฐ ์
๋ฐ์ดํธ ๋์ ๋, ์
๋ฐ์ดํธ๊ฐ ๋ ๋ด์ฉ์ ๋ ๋๋ง ํ ๋ log๋ฅผ ์ฐ๋๋ก ํด๋ณด์ธ์!
ย
์ค์ ์ ์ฉํด๋ณด๊ธฐ(useEffect
) โ
useEffect์ ์์ฑํ ์๋ฆผ์ด ํ์ด์ง ๋ค์ด๊ฐ์๋ง์ ๋์ ๋ถํธํฉ๋๋ค.
(Hint : useEffect๋ฅผ ์์ ํด ๋ณด์ธ์. useState๋ฅผ ํ์ฉํ์
๋ ์ข์ต๋๋ค.)
์ ๋ต
์ฒ์ ์ํ๊ฐ ์ด๊ธฐํ๋๊ณ ๋ ์ดํ์๋ง ๋์ํ ์ ์๋๋ก checkํ ์์๋ ์ํ๋ฅผ ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
import React, { useState, useEffect } from 'react'; function Counter() { const [count, setCount] = useState(0) const [checkRender, setCheckRender] = useState(false); const countUp =()=>{ setCount(count+1) } useEffect(() => { if (checkRender) { if(count%2){ alert("ํ์์ ๋๋ค") }else{ alert("์ง์์ ๋๋ค") } } setCheckRender(true); }, [count]) return( <> <div>{count}</div> <button onClick={countUp}>up!</button> </> ) } function App() { return ( <div> <Counter/> </div> ); } export default App;
์ค์ ์ ์ฉํด๋ณด๊ธฐ(useEffect
, cleanup
) โก

Date ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์์๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ์ถ๊ฐํ๊ณ ,
function Time(props) { const [today, setToday] = useState(new Date()); const [hour, setHour] = useState(today.getHours()); const [min, setMin] = useState(today.getMinutes()); const [sec, setSec] = useState(today.getSeconds()); console.log("๋ ๋๋ง์ด ๋ฉ๋๋ค..?")//๋ ๋๋ง์ด ์ ๋๋์ง ํ์ธ์ฉ! ๊ผญ ๋ฃ๊ณ ์งํํด์ฃผ์ธ์. return ( <div> <h1> ์๊ฐ : {hour}์ {min}๋ถ {sec}์ด </h1> </div> ); } function App() { return ( <div> <Counter/> <Time/> </div> ); }
์๊ฐ์ ์๋ก๊ณ ์นจํ์ง ์์๋ ์ค์๊ฐ์ผ๋ก ๋ฐ๋๊ฒ ํด๋ณด์ธ์ :)
์ ๋ต
์๋์ ๊ฐ์ด ์์ฑํ์
จ๋ค๋ฉด Time์ปดํฌ๋ํธ์์ ๋ก๊ทธ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ ๋ง ๋ง์ ํ์์ ๋ก๊ทธ๋ฅผ ๋ณด์ค ์ ์์๊ฒ์
๋๋ค.
๋ง์ฐฌ๊ฐ์ง, useEffect๋ฅผ ์ด์ฉํ๋ค ํด๋ ๋ง์ฝ cleanup์ ์ด์ฉํ์ง ์์๋ค๋ฉด,
๋ง์ฐฌ๊ฐ์ง๋ก ๋ฌด์ํ ๋ ๋๋ง์ด ์ผ์ด๋๊ณ ์์์ ๋ณด์ค ์ ์์ต๋๋ค.
function Time(props) { const [today, setToday] = useState(new Date()); const [hour, setHour] = useState(today.getHours()); const [min, setMin] = useState(today.getMinutes()); const [sec, setSec] = useState(today.getSeconds()); console.log("๋ ๋๋ง์ด ๋ฉ๋๋ค..?") setInterval(() => { const t = new Date(); setToday(t); setHour(t.getHours()); setMin(t.getMinutes()); setSec(t.getSeconds()); }, 1000); return ( <div> <h1> ์๊ฐ : {hour}์ {min}๋ถ {sec}์ด </h1> </div> ); } function App() { return ( <div> <Counter/> <Time/> </div> ); }
๊ทธ๋์ ์ฐ๋ฆฌ๋ cleanup์ด๋๊ฒ์ ์ฌ์ฉํด์ผํฉ๋๋ค!
setinterval ์ ํ๊ฒ๋๋ฉด 1์ด์ ํ๋ฒ ๊ฐ์ ๋์์ ๋ฐ๋ณตํ๊ฒ ๋ ํ
๋ฐ์,
์ด 1์ด์ ํ๋์ผ์ ๊ณ์ ์ถ๊ฐํด์ 1์ด์ ์๋ฒ(setintervalํ ํ์๋งํผ)์ ๊ฐ์์ผ์ ํ๊ฒ๋ฉ๋๋ค.
์ฆ, setState๋ฅผ ํ๋ ํ์๊ฐ ๊ณ์ ์ถ๊ฐ๋๋๊ฑฐ์ฃ .
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ 1์ด๋ง๋ค(์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ง์ ) ๋ฐ๋ณตํด์ฃผ๋ ๋์์ ์ญ์ ํด์ฃผ๋ ์ผ์ ํด์ฃผ์ด์ผํฉ๋๋ค.
์๋์๊ฐ์ด ํ๋ฉด ๋ฉ๋๋ค!
import { useState, useEffect } from "react"; function Time(props) { const [today, setToday] = useState(new Date()); const [hour, setHour] = useState(today.getHours()); const [min, setMin] = useState(today.getMinutes()); const [sec, setSec] = useState(today.getSeconds()); console.log("๋ ๋๋ง์ด ๋ฉ๋๋ค..?") useEffect(() => { let time = setInterval(() => { const t = new Date(); setToday(t); setHour(t.getHours()); setMin(t.getMinutes()); setSec(t.getSeconds()); }, 1000); return () => { //์ปดํฌ๋ํธ๊ฐ ์ฌ๋ผ์ง๊ธฐ ์ ์ setinterval์ clearintervalํด์ค๋๋ค clearInterval(time); }; }, [today]); return ( <div> <h1> ์๊ฐ : {hour}์ {min}๋ถ {sec}์ด </h1> </div> ); } export default Time;
// ์ฝ๋ ๋ฆฌํํ ๋ง import { useState, useEffect } from "react"; function Time(props) { const [today, setToday] = useState(new Date()); const hour = today.getHours(); const min = today.getMinutes(); const sec = today.getSeconds(); console.log("๋ ๋๋ง์ด ๋ฉ๋๋ค..?") useEffect(() => { let time = setInterval(() => { const t = new Date(); setToday(t); }, 1000); return () => { clearInterval(time); }; }, [today]); return ( <div> <h1> ์๊ฐ : {hour}์ {min}๋ถ {sec}์ด </h1> </div> ); } export default Time;
ย
ย