์ฌ์ด๋ ์ดํํธ = ์ดํํธ Side Effect
๋ฆฌ์กํธ์ ์ฃผ์ ์๋ฌด
- UI๋ฅผ ๋ ๋๋ง ํ๋ ๊ฒ. ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ์ํ์ฌ ํ์ํ ๋ UI๋ฅผ ๋ค์ ๋ ๋๋ง ํ๋ ๊ฒ์ด๋ค.
- ์ฌ์ฉ์ ์ ๋ ฅ์ ๋ฐ๋ฅธ ๋ฐ์ ํ๋ฉด์ ๋ณด์ด๊ฒ ํ๊ธฐ
๊ทธ๋ ๋ค๋ฉด ๋ฆฌ์กํธ์ ์ฌ์ด๋ ์ดํฉํธ๋??
์ฃผ์ ์๋ฌด ์ธ์ ๋ชจ๋ ๊ฒ!
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);
}
...
๊ทธ๋์ ๐์ ์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ง ๋ค๋ฉด ๋จ์ => ๋ฌดํ ๋ฃจํ๋ฅผ ๋ง๋ค ์๋ ์๋ค.
์๋ํ๋ฉด
๊ฐ ์ ์ฅ๋์ด ์๋์ง ํ์ธํ๊ณ ์ ์ฅ๋์ด ์์ผ๋ฉด
๋ฅผ 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;