[Trello ํด๋ก  ํ•ด๋ณด๊ธฐ] Firebase๋กœ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„

๐Ÿ”ฅ Firebase๋ž€?

`Firebase` ๋Š” Google ์ด ์ œ๊ณตํ•˜๋Š” ๋ฐฑ์—”๋“œ ํ”Œ๋žซํผ(BaaS)!

์„œ๋ฒ„๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์ง€ ์•Š์•„๋„ ์ธ์ฆ, DB, ์Šคํ† ๋ฆฌ์ง€ ๋“ฑ์„ ๋ฐ”๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ๊ตฌ์ถ•ํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ์ ์ธ ์„œ๋น„์Šค ๊ธฐ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํŠน์ง•์ž…๋‹ˆ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋กœ๊ทธ์ธ ๊ตฌํ˜„ํ•˜๋ฉด ๋ณดํ†ต 

  • OAuth ์ฒ˜๋ฆฌ (๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ)
  • ํ† ํฐ ๋ฐœ๊ธ‰
  • ์„ธ์…˜ ๊ด€๋ฆฌ
  • ๋ณด์•ˆ ์ฒ˜๋ฆฌ

์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”๋ฐ์š”. ํŠนํžˆ OAuth์˜ ๊ฒฝ์šฐ, ๊ตฌ๊ธ€/์นด์นด์˜ค ๋“ฑ ์™ธ๋ถ€ ์ธ์ฆ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌํ˜„ ๋‚œ์ด๋„๊ฐ€ ๋†’์€ ํŽธ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์ด ๋ชจ๋“  ๊ฑธ ํŒŒ์ด์–ด๋ฒ ์ด์Šค API ์—ฐ๊ฒฐ๋งŒ ํ•ด์ฃผ๋ฉด ์ „๋ถ€ ๋Œ€์‹  ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Firebase๋Š” ์œ„ ๊ณผ์ •์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๋งŒ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์ €๋Š” ์ด ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ(๊ตฌ๊ธ€ ์†Œ์…œ๋กœ๊ทธ์ธ)๊ณผ ๋ฐฐํฌ๋ถ€๋ถ„์„ ํŒŒ์ด์–ด๋ฒ ์ด์Šค๋กœ ์ง„ํ–‰ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 


Firebase ์—ฐ๊ฒฐํ•˜๊ธฐ

https://firebase.google.com/?hl=ko

 

Firebase | Google's Mobile and Web App Development Platform

๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์ข‹์•„ํ•  ๋งŒํ•œ ์•ฑ๊ณผ ๊ฒŒ์ž„์„ ๋นŒ๋“œํ•˜๋„๋ก ์ง€์›ํ•˜๋Š” Google์˜ ๋ชจ๋ฐ”์ผ ๋ฐ ์›น ์•ฑ ๊ฐœ๋ฐœ ํ”Œ๋žซํผ์ธ Firebase์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์„ธ์š”.

firebase.google.com


1. ํŒŒ์ด์–ด๋ฒ ์ด์Šค Go to console์— ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ

Firebase ์ฝ˜์†”์—์„œ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ํ•ด๋‹น ํ”„๋กœ์ ํŠธ ๋‹จ์œ„๋กœ ์ธ์ฆ/DB/์Šคํ† ๋ฆฌ์ง€ ๋“ฑ์ด ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.


2. ์›น ์•ฑ์— Firebase ์ถ”๊ฐ€

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ํ›„ ์›น ์•ฑ์„ ๋“ฑ๋กํ•˜๋ฉด, ํ•ด๋‹น ์•ฑ์—์„œ ์‚ฌ์šฉํ•  ์„ค์ • ์ •๋ณด(firebaseConfig)๋ฅผ ๋ฐ”๋กœ ๋ฐœ๊ธ‰๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


3.  ํ”„๋กœ์ ํŠธ์— npm ์„ค์น˜, Firebase SDK ์ถ”๊ฐ€


๋กœ๊ทธ์ธ/๋กœ๊ทธ์•„์›ƒ ๊ธฐ๋Šฅ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ 

๋กœ๊ทธ์ธ
๋ฒ„ํŠผ ํด๋ฆญ→ signInWithPopup→ Firebase ์ธ์ฆ→ user ์ •๋ณด ๋ฐ˜ํ™˜→ Redux ์ €์žฅ→ UI ๋ณ€๊ฒฝ
๐Ÿ‘‰ Firebase๊ฐ€ ์ธ์ฆ ๊ณผ์ •์„ ์ฒ˜๋ฆฌํ•œ ๋’ค, ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ userCredential ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
๋กœ๊ทธ์•„์›ƒ
๋ฒ„ํŠผ ํด๋ฆญ→ signOut→ Firebase ์„ธ์…˜ ์‚ญ์ œ→ Redux ์ดˆ๊ธฐํ™”→ UI ๋ณ€๊ฒฝ
๐Ÿ‘‰ Firebase ๋‚ด๋ถ€ ์„ธ์…˜๊ณผ ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ(Redux)๋ฅผ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ์™„์ „ํ•œ ๋กœ๊ทธ์•„์›ƒ์ด ๋ฉ๋‹ˆ๋‹ค.

1. Firebase ์—ฐ๊ฒฐ

๐Ÿ“ firebase.ts : ์ด React ์•ฑ์ด ์–ด๋–ค Firebase ํ”„๋กœ์ ํŠธ๋ฅผ ์“ธ์ง€ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

import { initializeApp } from "firebase/app";

const firebaseConfig = {
  apiKey: "...",
  authDomain: "...",
  projectId: "...",
};

export const app = initializeApp(firebaseConfig);
  • initializeApp(): Firebase ํ”„๋กœ์ ํŠธ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ํ•จ์ˆ˜ - ์ด ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ํ˜„์žฌ React ์•ฑ์ด Firebase ์„œ๋น„์Šค๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • firebaseConfig:  Firebase ์ฝ˜์†”์—์„œ ๋ฐœ๊ธ‰๋ฐ›๋Š” ํ‚ค - ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ์ •๋ณด์ด๋ฉฐ, ์–ด๋–ค Firebase ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Modular SDK (v9 ์ด์ƒ): ํ˜„์žฌ ์‚ฌ์šฉํ•œ ๋ฐฉ์‹์€ ํ•„์š”ํ•œ ํ•จ์ˆ˜(getAuth, initializeApp ๋“ฑ)๋งŒ ๊ณจ๋ผ์„œ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. Firebase v9๋ถ€ํ„ฐ๋Š” 'ํŠธ๋ฆฌ ์‰์ดํ‚น(Tree Shaking)'์„ ์ง€์›ํ•ด์„œ, ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ธฐ๋Šฅ์€ ๋นŒ๋“œํ•  ๋•Œ ์ œ์™ธ๋˜์–ด ์•ฑ ์šฉ๋Ÿ‰์ด ๊ฐ€๋ฒผ์›Œ์ง‘๋‹ˆ๋‹ค!


2. ๋กœ๊ทธ์ธ ๋ฐฉ๋ฒ• ํ™œ์„ฑํ™”

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ตฌ๊ธ€ ์†Œ์…œ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•ด๋ณด๋ คํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— Firebase ์ฝ˜์†”์—์„œ ์„ค์ •์„ ์šฐ์„ ์ ์œผ๋กœ ์ง„ํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. 

Firebase ์ฝ˜์†” > Authentication > Sign-in method ๋ฉ”๋‰ด์—์„œ [Google]์„ '์‚ฌ์šฉ ์„ค์ •'์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

์ด ์„ค์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฉด, ์ฝ”๋“œ์—์„œ GoogleAuthProvider๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ธ์ฆ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


3. Authentication ๊ฐ์ฒด ์ƒ์„ฑ

๐Ÿ“ BoardList.ts

const auth = getAuth(app);
const provider = new GoogleAuthProvider();
  • getAuth(app): ์ธ์ฆ ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์ค€๋น„ - Firebase ์•ฑ(app)์— ์—ฐ๊ฒฐ๋œ ์ธ์ฆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • GoogleAuthProvider(): ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ์„ ์–ธ - ์–ด๋–ค ๋กœ๊ทธ์ธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ• ์ง€ ์ง€์ •ํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

4. ๋กœ๊ทธ์ธ ๊ตฌํ˜„

const handleLogin = () => {
  signInWithPopup(auth, provider)
    .then(userCredential => {
      dispatch(
        setUser({
          email: userCredential.user.email,
          id: userCredential.user.uid,
        })
      )
    })
    .catch(error => {
      console.error(error);
    })
}
 
  1. ํŒ์—… ์—ด๋ฆผ (๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ์ฐฝ) 
  2. ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ
  3. Firebase๊ฐ€ ์‚ฌ์šฉ์ž ์ •๋ณด ๋ฐ˜ํ™˜
- userCredential.user : Firebase๊ฐ€ ์ฃผ๋Š” ์‚ฌ์šฉ์ž ๊ฐ์ฒด (ํฌํ•จ ์ •๋ณด: email / uuid (๊ณ ์œ  ID) / displayName ๋“ฑ)

- dispatch(setUser({...})) : Firebase ์ž์ฒด๋Š” ์ƒํƒœ ๊ด€๋ฆฌ๋Š” ํ•ด์ฃผ์ง€ ์•Š๊ธฐ ๋–„๋ฌธ์— ์ง์ ‘ Redux์— ์ €์žฅํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.


5. ๋กœ๊ทธ์•„์›ƒ ๊ตฌํ˜„

const handleSignOut = () => {
  signOut(auth)
    .then(() => {
      dispatch(removeUser())
    })
}
  1. Firebase ์„ธ์…˜ ์‚ญ์ œ : ํ˜„์žฌ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ƒํƒœ๋ฅผ Firebase์—์„œ ์ œ๊ฑฐ
  2. Redux ์ƒํƒœ ์ดˆ๊ธฐํ™” : ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๋˜ ์‚ฌ์šฉ์ž ์ •๋ณด ์ œ๊ฑฐ

-> ๋‘˜ ๋‹ค ํ•ด์•ผ ์™„์ „ ๋กœ๊ทธ์•„์›ƒ๋œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!


6. Redux๋กœ ๋กœ๊ทธ์ธ ์ƒํƒœ ๊ด€๋ฆฌ

๐Ÿ“ userSlice.ts

์‚ฌ์šฉ์ž์˜ email๊ณผ id๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์•ก์…˜์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

- ์ดˆ๊ธฐ ์ƒํƒœ

const initialState = {
    email: '',
    id: ''
}

- ๋กœ๊ทธ์ธ ์‹œ

setUser: (state, action) => {
    state.email = action.payload.email;
    state.id = action.payload.id;
}

Firebase์—์„œ ๋ฐ›์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ Redux store์— ์ €์žฅ

- ๋กœ๊ทธ์•„์›ƒ ์‹œ

removeUser: (state) => {
    state.email = '';
    state.id = '';
}

์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ


7.  ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ํŒ๋‹จ

๐Ÿ“ useAuth.ts

export function useAuth() {
    const {id, email} = useTypedSelector((state) => state.user);

    return {
        isAuth: !!email, // email์ด ์žˆ์œผ๋ฉด true, ์—†์œผ๋ฉด false
        email,
        id
    }
}

ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์ƒํƒœ์ธ์ง€(isAuth) ์‰ฝ๊ฒŒ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ปค์Šคํ…€ ํ›…์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.


8. UI์—์„œ ๋กœ๊ทธ์ธ ์ƒํƒœ ๋ฐ˜์˜

๐Ÿ“ BoardList.ts

{
  isAuth
  ?
  <GoSignOut onClick={handleSignOut}/>
  : 
  <FiLogIn onClick={handleLogin}/>
}
  • ๋กœ๊ทธ์ธ ์ƒํƒœ -> ๋กœ๊ทธ์•„์›ƒ ๋ฒ„ํŠผ
  • ๋กœ๊ทธ์•„์›ƒ ์ƒํƒœ -> ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ

์ „์ฒด์ฝ”๋“œ๋Š”

https://github.com/lvyest/Trello-Clone

 

GitHub - lvyest/Trello-Clone

Contribute to lvyest/Trello-Clone development by creating an account on GitHub.

github.com

์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.