๐ฅ 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);
})
}
- ํ์ ์ด๋ฆผ (๊ตฌ๊ธ ๋ก๊ทธ์ธ ์ฐฝ)
- ์ฌ์ฉ์ ๋ก๊ทธ์ธ
- Firebase๊ฐ ์ฌ์ฉ์ ์ ๋ณด ๋ฐํ
- dispatch(setUser({...})) : Firebase ์์ฒด๋ ์ํ ๊ด๋ฆฌ๋ ํด์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ Redux์ ์ ์ฅํด์ฃผ์ด์ผํฉ๋๋ค.
5. ๋ก๊ทธ์์ ๊ตฌํ
const handleSignOut = () => {
signOut(auth)
.then(() => {
dispatch(removeUser())
})
}
- Firebase ์ธ์ ์ญ์ : ํ์ฌ ๋ก๊ทธ์ธ๋ ์ฌ์ฉ์ ์ธ์ฆ ์ํ๋ฅผ Firebase์์ ์ ๊ฑฐ
- 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
์ฌ๊ธฐ์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
'Devcourse' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Trello ํด๋ก ํด๋ณด๊ธฐ] Firebase Hosting์ผ๋ก ๋ฐฐํฌํด๋ณด์. (1) | 2026.04.14 |
|---|---|
| [BookShop ํ๋ก์ ํธ] CartItem (0) | 2026.03.03 |
| [Node.js] Node.js์ ๋น๋๊ธฐ ์ฒ๋ฆฌ - Promise / Async&await (0) | 2026.02.22 |
| [BookShop ํ๋ก์ ํธ] - ๋์๋ชฉ๋ก ์กฐํ ํ์ด์ง ๊ตฌํ - MySQL ์๊ฐ ๋ฒ์ ๊ตฌํ๊ธฐ, DB ํ์ด์ง(paging) (0) | 2026.02.16 |
| Express-generator ํ๋ก์ ํธ ๊ตฌ์กฐ (0) | 2026.02.13 |