12.06 TIL - firebase

์•„๋ฆ„ยท2023๋…„ 12์›” 6์ผ
2
post-thumbnail

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ์นดํƒ€

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด1
์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด2

firebase ์ธ์ฆ

firebase๋ฅผ ์“ฐ๋Š” ์ด์œ 

  • ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค
  • ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ์—†์ด๋„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค
  • ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค€๋‹ค - ์›๋ž˜๋Š” ๋ณด์•ˆ์„ ์œ„ํ•ด ์ด๊ฒƒ์ €๊ฒƒ ์‹ ๊ฒฝ์จ์•ผ ํ•จ (jwt, ์„ธ์…˜, ์ฟ ํ‚ค ๋“ฑ)

firebase ์„ธํŒ…ํ•˜๊ธฐ

firebase.js ํ›‘์–ด๋ณด๊ธฐ

// firebase.js
import { initializeApp } from "firebase/app";
import { getAuth } from "firebase/auth";

const firebaseConfig = { // firebase์—์„œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋งŒ๋“ค๋ฉด ์ฃผ๋Š” ์• 
  apiKey: "AIzaSyDdvEFtM7gjWi2MP0UmMWlhoVc1y2uUVpo",
  authDomain: "fir-practice-daf73.firebaseapp.com",
  projectId: "fir-practice-daf73",
  storageBucket: "fir-practice-daf73.appspot.com",
  messagingSenderId: "518889919904",
  appId: "1:518889919904:web:e6ea172519e8d1a33a40c5",
};

const app = initializeApp(firebaseConfig); // ๋‚ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด์„œ firebase๋ฅผ ์‚ฌ์šฉํ•  ๊ฑฐ์ž„
export const auth = getAuth(app); // ๋‚ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ณ„์ • ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋ฝ‘์•„์ฃผ๋Š”๋“ฏ

๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

1. ๊ฐ„๋‹จํ•œ UI ๋งŒ๋“ค๊ธฐ

  • ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„  ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค๊ธฐ
  • email, password ์œ„ํ•œ useState ๋งŒ๋“ค๊ธฐ
  • input 2๊ฐœ ๋งŒ๋“ค๊ธฐ
  • ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ
import { useState } from "react";

function App() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");

  return (      
        <>
          <input
            type="email"
            value={email}
            onChange={(e) => {
              setEmail(e.target.value);
            }}
          />
          <input
            type="password"
            value={password}
            onChange={(e) => {
              setPassword(e.target.value);
            }}
          />
          <button>
            ํšŒ์›๊ฐ€์ž…
          </button>
          <button>
            ๋กœ๊ทธ์ธ
          </button>
          <button>
            ๋กœ๊ทธ์•„์›ƒ
          </button>
        </>
      )
}

export default App;

2. ํšŒ์›๊ฐ€์ž… onClick ๋งŒ๋“ค๊ธฐ

  • firebase.js ํŒŒ์ผ์—์„œ auth importํ•˜๊ธฐ
  • firebase/auth ์—์„œ createUserWithEmailAndPassword import ํ•˜๊ธฐ
import { auth } from "./firebase";
import {
  createUserWithEmailAndPassword,
} from "firebase/auth";

(์ƒ๋žต)
<button
  onClick={async () => {
    try {
      const userCredential = await createUserWithEmailAndPassword(
        auth,
        email,
        password
      );
      console.log(userCredential);
    } catch (error) {
      console.error(error);
    }
  }}
>
  ํšŒ์›๊ฐ€์ž…
</button>

3. ๋กœ๊ทธ์ธ onClick ๋งŒ๋“ค๊ธฐ

  • firebase/auth์—์„œ signInWithEmailAndPassword import ํ•˜๊ธฐ
import {
  createUserWithEmailAndPassword,
  signInWithEmailAndPassword,
} from "firebase/auth";

(์ƒ๋žต)
<button
  onClick={async (event) => {
    try {
      const userCredential = await signInWithEmailAndPassword(
        auth,
        email,
        password
      );
      console.log(userCredential);
    } catch (error) {
      console.error(error);
    }
  }}
>
  ๋กœ๊ทธ์ธ
  </button>

4. ๋กœ๊ทธ์•„์›ƒ onClick ๋งŒ๋“ค๊ธฐ

import {
  createUserWithEmailAndPassword,
  signInWithEmailAndPassword,
  signOut,
} from "firebase/auth";

(์ƒ๋žต)

<button
  onClick={async () => {
    alert("๋กœ๊ทธ์•„์›ƒ ํ• ๊นŒ?");
    await signOut(auth);
  }}
>
  ๋กœ๊ทธ์•„์›ƒ
</button>

5. ๋กœ๊ทธ์ธ ํ›„์—๋Š” input ์ฐฝ์ด ์‚ฌ๋ผ์ง€๊ณ , id๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“ค๊ธฐ

  • useState ํ™œ์šฉํ•˜๊ธฐ
const [currentUser, setCurrentUser] = useState(null);

// ํ•„์š”ํ•œ ๊ณณ์— ์ž‘์„ฑ
setCurrentUser(userCredential.user.email);
setCurrentUser(null);
  • ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋กœ ๋กœ๊ทธ์ธ ์‹œ email ๋ฐ ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์„ ๋ณด์—ฌ์ฃผ๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ input ์ฐฝ ๋ฐ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๋ณด์—ฌ์ฃผ๊ธฐ
{
	currentUser 
		? currentUser๋ณด์—ฌ์ฃผ๊ณ , ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ ๋ณด์—ฌ์ฃผ๊ธฐ 
		: input์ฐฝ๊ณผ ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ๋ณด์—ฌ์ฃผ๊ธฐ 
}

6. onAuthStateChanged๋กœ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฝ”๋“œ ๋ณ€๊ฒฝํ•˜๊ธฐ

  • ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ์— ๋ชจ๋‘ setCurrentUser๋ฅผ ๋„ฃ๊ณ  ์žˆ์Œ
  • onAuthStateChanged๋ผ๋Š” ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • onAuthStateChanged๋Š” ๋กœ๊ทธ์ธ์„ ํ–ˆ์„ ๋•Œ, ๋กœ๊ทธ์•„์›ƒ ํ–ˆ์„ ๋•Œ๋ฅผ ์•Œ์•„์ฐจ๋ฆฌ๋Š” ์—ญํ• (์˜ต์ €๋ฒ„)์„ ํ•จ
  • user ์•ˆ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด currentUser๊ฐ€ null ํ˜น์€ undefined
  • user ์•ˆ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด email์„ ๋„ฃ๊ธฐ
import {
  createUserWithEmailAndPassword,
  signInWithEmailAndPassword,
  onAuthStateChanged,
  signOut,
} from "firebase/auth";

(์ƒ๋žต)
useEffect(() => {
  onAuthStateChanged(auth, (user) => {
    setCurrentUser(user?.email);
  });
}, []);

์•„์›ƒ์†Œ์‹ฑ ํ”„๋กœ์ ํŠธ

๋ฌธ์ œ

์–ด์ฐŒ์ €์ฐŒ ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์—ฐ๋™์„ ๋๋‚ด๊ณ  ๋‚œ ํ›„ ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ ค๋Š”๋ฐ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
๋‚ด๊ฐ€ ๋กœ์ง์„ ์ž˜ ๋ชป ์ง  ๋ถ€๋ถ„์€ ์—†๋Š”์ง€ ์˜คํƒ€๋Š” ์—†๋Š”์ง€ ์ถฉ๋ถ„ํžˆ ํ™•์ธ์„ ํ•ด๋ณธ ํ›„ ๊ฐ™์€ ํŒ€์›๋ถ„๊ป˜ ์งˆ๋ฌธ์„ ํ•ด๋ดค๋‹ค..

ํ•ด๊ฒฐ

๊ฐ™์ด ์ฝ˜์†”๋„ ์ฐ์–ด๋ณด๊ณ  ๊ฒ€์‚ฌ์ฐฝ๋„ ๋œฏ์–ด๋ณด๋‹ˆ ๋ฐ์ดํ„ฐ๋Š” ์ „์†ก์ด ๋˜๋Š”๋ฐ ์ค‘๊ฐ„์— ์ƒˆ๋กœ๊ณ ์นจ์ด ์ผ์–ด๋‚˜์„œ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ๋‹ค. ๋„๋Œ€์ฒด ์™œ..!

์•Œ๊ณ ๋ณด๋‹ˆ ๋‚˜๋Š” ์ž…๋ ฅ์ฐฝ์— form ํƒœ๊ทธ๋ฅผ ์ผ๊ณ  form ํƒœ๊ทธ์—์„œ๋Š” ๋ฆฌ์…‹์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฑธ ๋ง‰์•„์ฃผ๋Š” ๋กœ์ง์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.
e.preventDefault();

๋‘๊ฐ€์ง€์˜ ๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ๋ณด๋ฉด์„œ ํ•ด์„œ ๊ทธ๋Ÿฐ์ง€ ์ € ๋ถ€๋ถ„์„ ๋นผ๋จน์—ˆ๋‹ค.. ๋‹ค์‹œ ๋„ฃ์–ด์ฃผ๋‹ˆ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•จ!

preventDefault

a ํƒœ๊ทธ๋‚˜ submit ํƒœ๊ทธ๋Š” ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด href๋ฅผ ํ†ตํ•ด ์ด๋™ํ•˜๊ฑฐ๋‚˜ ์ฐฝ์ด ์ƒˆ๋กœ๊ณ ์นจํ•˜์—ฌ ์‹คํ–‰๋œ๋‹ค. preventDefault ๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋™์ž‘์„ ๋ง‰์•„์ค„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š”
1. a ํƒœ๊ทธ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ๋„ href ๋งํฌ๋กœ ์ด๋™ํ•˜์ง€ ์•Š๊ฒŒ ํ•  ๊ฒฝ์šฐ
2. form ์•ˆ์— submit ์—ญํ• ์„ ํ•˜๋Š” ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์–ด๋„ ์ƒˆ๋กœ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๊ณ ์‹ถ์„ ๊ฒฝ์šฐ (submit์€ ์ž‘๋™๋จ)

2์˜ ์˜ˆ์‹œ๋กœ๋Š” ์˜ค๋Š˜์˜ ๋‚˜์˜ ๊ฒฝ์šฐ..!
๋ฐ›๋Š” event ์— ๋Œ€ํ•ด preventDefault ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— submit ๋จ๊ณผ ๋™์‹œ์— ์ฐฝ์ด ๋‹ค์‹œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ์ดˆ๊ธฐ ํ™”๋ฉด์œผ๋กœ ๋Œ์•„์˜ค๊ฒŒ ๋œ๋‹ค.


๋‚ด๋ฐฐ์บ  ๋“ค์–ด์˜ค๊ณ  ๋‚˜์„œ ์˜ค๋Š˜ ์ œ์ผ ์—ด์‹ฌํžˆ ํ•œ ๊ฑฐ ๊ฐ™๋‹ค.. ํŒ€์›๋ถ„๋“ค์ด ๋ฐฐ๋ คํ•ด์ฃผ์‹  ๋•์— ์‚ฌ์‹ค์ƒ ์ด๋ฒˆ์—๋„ ์ œ์ผ ์‰ฌ์šด ๊ธฐ์ˆ ์„ ๋งก๊ฒŒ ๋œ ๊ฑฐ ๊ฐ™์ง€๋งŒ ๊ธฐ์กด์— ๋ชฐ๋ž๋˜ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์งง์€ ์‹œ๊ฐ„๋‚ด์— ๊ตฌํ˜„์„ ํ•œ๋‹ค๋Š” ๊ฑฐ ์ž์ฒด๊ฐ€ ๋„ˆ๋ฌด ๋ง‰๋ง‰ํ•˜๊ณ  ๋ฌด์„œ์› ์ง€๋งŒ ํฐ ์‚ฐ ํ•˜๋‚˜๋Š” ๋„˜์€ ๊ฑฐ ๊ฐ™๋‹ค. ๊ทผ๋ฐ ์€๊ทผํžˆ css๊ฐ€ ์ œ์ผ ์–ด๋ ค์šด ๊ฑฐ ๊ฐ™์Œ.......... ์–ผ๋ฅธ ๊ธฐ๋ณธ์ ์ธ ๋ผˆ๋Œ€ ๋งŒ๋“ค๊ณ  ๋ช‡๊ฐ€์ง€ ๋” ๊ธฐ์ˆ ์„ ๋ง๋ถ™์—ฌ์•ผ๊ฒ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜ ๋‚ด๋ฐฐ์บ ์— ๋“ค์–ด์˜ค๊ณ  ์ฒ˜์Œ์œผ๋กœ ๋‹ค๋ฅธ ๋ถ„์˜ ์ฝ”๋“œ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์žก์•„์คฌ๋‹ค..! ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์„ ์ฃผ๋Š” ์ˆœ๊ฐ„์ด ์˜ฌ ๊ฑฐ๋ผ๊ณค ์ƒ๊ฐ๋„ ๋ชปํ–ˆ๋Š”๋ฐ ๋‚ด๊ฐ€ ์กฐ๊ธˆ์€ ์„ฑ์žฅํ–ˆ๊ตฌ๋‚˜ ์‹ถ์—ˆ๋‹ค. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ฉด์„œ ์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ธฐ์จ์„ ๋ง›๋ณด๋‹ˆ ์ฝ”๋”ฉ์ด๋ž‘ ์กฐ๊ธˆ์€ ์นœํ•ด์ง„ ๊ฑฐ ๊ฐ™๋‹คใ…Ž ๋‚˜ ์ด์ œ๋Š” ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์กฐ๊ธˆ ์•ˆ๋‹ค!!!

profile
๋‚ด ๊ฟˆ์€ ๊ฐœ๋ฐœ์ž

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

comment-user-thumbnail
2023๋…„ 12์›” 6์ผ

ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์ดํ•ดํ•˜๊ธฐ ๋„ˆ๋ฌด ์–ด๋ ค์› ๋Š”๋ฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ใ…œ

1๊ฐœ์˜ ๋‹ต๊ธ€