4์ฃผ ํ๋ก์ ํธ์์ 1์ฃผ์ผ์ด ๋ฑ ์ง๋ฌ๋ค. ์์ง์ ๋นก์ธ๊ฒ ํ๊ณ ์์ง ์์์ ๋ฎ์ ์ฑ ๋ ์ข ์ฝ๊ณ ์ฌ๊ธฐ๋ ํ๋ค. ์ ๋ฒ 2์ฃผ ํ๋ก์ ํธ๋ณด๋ค ๋ง์์ด ๊ฐ๋ฒผ์์ง(๊ฐ๋ฒผ์์ง๋ฉด ์๋๋๋ฐ..?) ๋๋์ด๋ค. ์ค๋๊น์ง ๋ฌด์ฌํ ๋ก๊ทธ์ธ, ๊ตฌ๊ธ๋ก๊ทธ์ธ, ํ์๊ฐ์ ๊น์ง ๋ฐฐํฌํ๋๋ฐ ์๊ฐ๋ณด๋ค ํฐ ์๋ฌ๊ฐ ์ ๋์ ์ด์ํ๋ค... ์๋ฌ ์ ๋๋๊ฒ ์ด์ํด์ง ์ํฉ ๐คฏ ์ข ์ ์ด๋๊ณ ์ถ์ ๊ฒ๋ค์ด ์์ด์ ์ผ์ฃผ์ผ์ด ๊ฐ๊ธฐ ์ ์ (์ง๊ธ์ ์ผ์๋ฐค 11์ 50๋ถ) ์ ์ด๋ณธ๋ค.
// npm install
@fortawesome/fontawesome-free
@fortawesome/fontawesome-svg-core
@fortawesome/free-solid-svg-icons // ๋ฌด๋ฃ๋ฒ์ ๋ง ์ธ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ solid ๋ง ์ค์นํด ์ค
@fortawesome/react-fontawesome
// index.js
import '@fortawesome/fontawesome-free/js/all.js';
์ฐธ๊ณ : How to persist state after a page refresh in React using local storage
์ฐธ๊ณ : Persistent State in React.js using useEffect hook
Redux persist ๋ก ์ํ๊ด๋ฆฌ๋ฅผ ํด ๋ณผ๊น ํ๋ค๊ฐ ์ฐ์ ๋ฆฌ์กํธ๋ก ํด ๋ณด๊ณ ์ ๋๋ฉด ๋ฆฌ๋์ค๋ฅผ ์ฐ์๊ณ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ๊ณ , useEffect ๋ฅผ ์ ๊ทน ์ด์ฉํด ๋ณด๊ธฐ๋ก ํ๋ค. ( ๋ฆฌ์กํธ ์ ํ๊ณ ์ถ๋ค..๐ ) ์ต์์ ์ปดํฌ๋ํธ์์ ๋ก๊ทธ์ธ ์ํ๋ฅผ ์ ์งํ๋ค. useEffect๋ ์ฌ์ฉํ๋ฉด์๋ ์กฐ๊ธ ์์ญ๋ฌ์ญํ ๋ฉด์ด ์๋ค. ์ฐ๋ค๋ณด๋ฉด ์ต์ํด ์ง๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉฐ ๊ธฐ๋กํด ๋ณธ๋ค.
๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ๋ค์ด์ค๋ฉด ์๋ฒ๋ก ๋ณด๋ด๊ณ , ์๋ต์ ๋ด๊ธด ํ ํฐ์ ์ต์์ ์ปดํฌ๋ํธ์ ์๋ ํ ํฐ์ ์ํ ์ ์ฅํด ์ฃผ๊ณ , ๋ก๊ทธ์ธ ์ํ๋ true ๋ก ๋ณ๊ฒฝํ๋ค. ๊ทธ ๋ค์์ App.js ์์ useEffect ๋ฅผ ์ด์ฉํ์ฌ ๋งค๋ฒ ๋ ๋๋ง ๋ ๋๋ง๋ค localStorage.getItem์ผ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ํ ๊ฐ์ ์๋ฐ์ดํธ ํด ์ค๋ค. ๋ง์ง๋ง์ผ๋ก ์ํ์ ์๋ ๊ฐ์ ๊ฐ์ ธ์์ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธ ์ํค๊ณ localStorage.setItem ์ผ๋ก ์ ์ฅํ๋ค.
localStorage๋ ๋ฌธ์์ด๋ง ๋ฐ๊ณ , ๋์ผํ ๊ฐ์ ๋ฐํํ๋ค. ๊ทธ๋์ JSON.stringify()์ JSON.parse() ๋ฅผ ์ฌ์ฉํ๋ค.
// App.jsx
const [isLogin, setIsLogin] = useState(false);
useEffect(() => {
const dataFormLocalStorage = localStorage.getItem('is-Login')
if (dataFormLocalStorage) {
setIsLogin(JSON.parse(dataFormLocalStorage))
}
}, [setIsLogin])
useEffect(() => {
localStorage.setItem('is-Login', JSON.stringify(isLogin))
}, [isLogin])
๊ตฌ๊ธ API๋ก ํด๊ฒฐํ๋ค. react-google-login
์ค์นํ๊ณ , ๊ตฌ๊ธ ํด๋ผ์ด์ธํธ ID๋ฅผ ๋ฐ๊ณ (์ ํ : ์น ์ดํ๋ฆฌ์ผ์ด์
) URI๊ณผ Redirection ์ค์ ์ ํด ์ค๋ค.
๊ตฌ๊ธ ๋ก๊ทธ์ธ ์ปดํฌ๋ํธ์ import GoogleLogin from 'react-google-login';
๋ฐ์์ค๊ณ ์์ํ๋ค. ๊ตฌ๊ธ ๋ฒํผ์ ๋ด๊ฐ ์ง์ ํ ์คํ์ผ๋ก ๊พธ๋ฐ๊ฑฐ๋ผ์ render๋ก button ์ ์์ฑํด ์ฃผ์๋ค. ์ ๋ ฌ ๊ณผ์ ์์ ์ข ๋ฌธ์ ๊ฐ ์์ด์ ๊ตฌ๊ธ๋ก๊ณ ์ด๋ฏธ์ง์ ๊ตฌ๊ธ๋ก๊ทธ์ธ ๊ธ์๋ฅผ span์ผ๋ก ํ ๋ฒ ๋ ๊ฐ์ธ ์ฃผ์๋ค.
const GoogleBtn = () => {
// .env ์ API๋ ๋ฐ๋ก ์ ์ฅํด๋
const GOOGLE_API = process.env.REACT_APP_GOOGLE_API;
const responseGoogle = (res) => {
// ์ฌ๊ธฐ์ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ ์ ์ ์ ๋ณด ๋ฐ ํ ํฐ์ ์ํ๋ก ์ ์ฅํ๊ณ , ์ ์ ์ ๋ณด๋ ์๋ฒ๋ก ๋ณด๋ด์ค
}
return (
<div className="google-login" onClick={responseGoogle}>
{<GoogleLogin
clientId={GOOGLE_API}
render={props => (<button onClick={props.onClick} className="modal-info google-btn social-btn" >
<span><img width="17" src={googleLogo} className="social-logo" /><span>๊ตฌ๊ธ ๋ก๊ทธ์ธ</span></span></button>)}
onSuccess={responseGoogle}
onFailure={responseGoogle}
/>}
</div>
)
}
์.. ์ด์ฉ์ง ๋๋ฌด ์ ๋๋คํ๋๋ฐ ์๋ฌ ๋ฐ๊ฒฌํ๋น..
๋ก๊ทธ์ธ ์ ์ธ๋ฐ ๋ก๊ทธ์ธ ์ํ๊ฐ true๋ก ๋ณํด ๋ฒ๋ฆผ ใ
ใ
ํ ํฐ์ด๋ ๋ก๊ทธ์ธ ์ํ๋ ๋๋ ์ ํด์ผ๋๋ ์ถ๋ค ..
(+ ํ ํฐ์ด ๋ค์ด์จ ํ์ ๋ก๊ทธ์ธ ์ํ๊ด๋ฆฌ๊ฐ ๋ ์ ์๊ฒ ์์ ํ์ฌ ์ฝ๊ฒ ํด๊ฒฐํ๋ค.)