๐ŸŒ [project #2] Jigu-tory #2

soor.devยท2021๋…„ 6์›” 25์ผ
0

Project

๋ชฉ๋ก ๋ณด๊ธฐ
4/8

4์ฃผ ํ”„๋กœ์ ํŠธ์—์„œ 1์ฃผ์ผ์ด ๋”ฑ ์ง€๋‚ฌ๋‹ค. ์•„์ง์€ ๋นก์„ธ๊ฒŒ ํ•˜๊ณ  ์žˆ์ง„ ์•Š์•„์„œ ๋‚ฎ์— ์ฑ…๋„ ์ข€ ์ฝ๊ณ  ์‰ฌ๊ธฐ๋„ ํ–ˆ๋‹ค. ์ €๋ฒˆ 2์ฃผ ํ”„๋กœ์ ํŠธ๋ณด๋‹ค ๋งˆ์Œ์ด ๊ฐ€๋ฒผ์›Œ์ง„(๊ฐ€๋ฒผ์›Œ์ง€๋ฉด ์•ˆ๋˜๋Š”๋ฐ..?) ๋Š๋‚Œ์ด๋‹ค. ์˜ค๋Š˜๊นŒ์ง€ ๋ฌด์‚ฌํžˆ ๋กœ๊ทธ์ธ, ๊ตฌ๊ธ€๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…๊นŒ์ง€ ๋ฐฐํฌํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ํฐ ์—๋Ÿฌ๊ฐ€ ์•ˆ ๋‚˜์„œ ์ด์ƒํ–ˆ๋‹ค... ์—๋Ÿฌ ์•ˆ ๋‚˜๋Š”๊ฒŒ ์ด์ƒํ•ด์ง„ ์ƒํ™ฉ ๐Ÿคฏ ์ข€ ์ ์–ด๋‘๊ณ  ์‹ถ์€ ๊ฒƒ๋“ค์ด ์žˆ์–ด์„œ ์ผ์ฃผ์ผ์ด ๊ฐ€๊ธฐ ์ „์— (์ง€๊ธˆ์€ ์ผ์šœ๋ฐค 11์‹œ 50๋ถ„) ์ ์–ด๋ณธ๋‹ค.

๋ฐฐ์šด ์ 

1. Fontawesome ์„ค์น˜

// 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';

2. ๋ฆฌ์•กํŠธ ํ›…์Šค๋กœ ๋กœ๊ทธ์ธ ์ƒํƒœ ์œ ์ง€ (persist state after a page refresh in React hooks using local storage)

์ฐธ๊ณ  : 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])

3. ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ

๊ตฌ๊ธ€ 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๋กœ ๋ณ€ํ•ด ๋ฒ„๋ฆผ ใ… ใ…œ ํ† ํฐ์ด๋ž‘ ๋กœ๊ทธ์ธ ์ƒํƒœ๋ž‘ ๋‚˜๋ˆ ์„œ ํ•ด์•ผ๋˜๋‚˜ ์‹ถ๋‹ค ..
(+ ํ† ํฐ์ด ๋“ค์–ด์˜จ ํ›„์— ๋กœ๊ทธ์ธ ์ƒํƒœ๊ด€๋ฆฌ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ฒŒ ์ˆ˜์ •ํ•˜์—ฌ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค.)

๋‚ด์ผ ํ•  ์ผ

  • ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์—๋Ÿฌ ๋‚˜๋˜๊ฑฐ ๋‹ค์‹œ ํ•ด ๋ณด๊ธฐ (+ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„๋ฆฌ๊ณ  ๊ฐ€๊ธฐ๋กœ ํ•จ..)
  • ์นด์นด์˜ค ์ง€๋„ ์ž‘์—… ์‹œ์ž‘ + ํ”„๋ก ํŠธ ์—…๋ฌด ๋ถ„๋ฐฐ
  • ๋กœ๊ทธ์ธ ์‹œ, ์œ ์ €์ •๋ณด๋งŒ ์„œ๋ฒ„์— ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •

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