1. Firebase란 무엇인가?
Firebase는 모바일 및 웹 애플리케이션 개발을 위해 Google이 제공하는 통합 플랫폼이다. 일반적으로 앱을 만들 때 필수로 구현해야 하는 기능들을 이미 완성된 서비스 형태로 제공한다.
대표적인 기능은 다음과 같다.
- 인증(Authentication)
- 데이터베이스(Database)
- 스토리지(Storage)
- 푸시 알림(Cloud Messaging)
- 배포 및 호스팅(Hosting)
즉, 👉 “대부분의 앱에서 반복적으로 필요한 기능들을 직접 구현하지 않아도 되게 해주는 플랫폼” 이다.
2. 일반적인 실시간 앱 구조 vs Firebase 사용 구조
2.1 일반적인 Real-Time App 구조
Front-End (React)
↓
Back-End (Node.js)
↓
Database
↓
Socket.IO (실시간 통신)
- 서버 구축 필수
- 인증, DB, 실시간 통신 모두 직접 구현
- 배포 및 운영 비용과 복잡도 ↑
2.2 Firebase를 사용한 Real-Time App 구조
Front-End (React)
↓
Firebase (Auth + DB + Hosting)
- 백엔드 서버 없이도 앱 구성 가능
- 실시간 데이터 동기화 기본 제공
- 인증·배포까지 한 플랫폼에서 처리
👉 개인 프로젝트, MVP, 사이드 프로젝트에 특히 강력한 선택지다.
3. Firebase 프로젝트 생성 및 앱 연결
Firebase를 사용하기 위한 기본 절차는 다음과 같다.
- Firebase 공식 사이트 접속 👉 https://firebase.google.com/
- Google 계정으로 로그인
- 새 프로젝트 생성
- 프로젝트 이름 입력
- Analytics는 선택 사항
- 생성된 프로젝트에 웹 앱 추가
Firebase 콘솔에서 제공하는 SDK 설정 코드를 통해 내 React 앱과 Firebase 프로젝트를 연결한다.
3.1 Firebase 모듈 설치
npm install firebase
3.2 firebase.js 파일 생성
// firebase.js
import { initializeApp } from "firebase/app";
import "firebase/auth";
import "firebase/database";
import "firebase/storage";
const firebaseConfig = {
apiKey: "...",
authDomain: "...",
projectId: "...",
storageBucket: "...",
messagingSenderId: "...",
appId: "..."
};
const app = initializeApp(firebaseConfig);
export default app;
3.3 앱 엔트리 파일에서 import
import app from "./firebase";
👉 이렇게 하면 앱 전체에서 Firebase를 사용할 준비 완료
4. 로그인 페이지 UI 구성 (React + Styled Components)
Firebase 인증을 붙이기 전에 로그인 화면 UI를 먼저 만든다.
👉 UI와 인증 로직을 분리하는 것이 핵심
Separate UI from authentication logic
JayTak
4.1 사용자 경험 (UX) 개선
[분리 안 했을 때]
새로고침 → Firebase 응답 대기 (1-2초) → UI 표시
└── 이 사이에 빈 화면 😢
[분리 했을 때]
새로고침 → localStorage에서 즉시 UI 표시 (0.01초)
→ Firebase 응답 (백그라운드) → 필요시 업데이트
└── 바로 프로필 보임 😊
4.2 관심사의 분리 (Separation of Concerns)
// ❌ 분리 안 한 경우 - 모든 게 섞여있음
const Nav = () => {
// Firebase 인증도 하고
// UI 상태도 관리하고
// 스크롤 이벤트도 처리하고...
// 코드가 복잡해짐!
}
// ✅ 분리한 경우
// 인증 담당
const useAuth = () => { ... } // 커스텀 훅으로 분리 가능
// UI 담당
const Nav = () => {
const { user, isLoading } = useAuth();
// UI만 신경쓰면 됨
}
⬇ 현재코드에서 분리
// 인증 로직 - "진짜" 로그인 상태 확인
useEffect(() => {
onAuthStateChanged(auth, (user) => { // Firebase가 판단
if (user) {
navigate("/main");
} else {
navigate("/");
}
})
}, [auth, navigate, pathname])
// UI 로직 - "빠른" 화면 표시
const initialUserData = localStorage.getItem('userData') ?
JSON.parse(localStorage.getItem('userData')) : {}; // 로컬에서 즉시
[인증 로직] [UI 로직]
│ │
▼ ▼
Firebase 서버에 물어봄 localStorage에서 읽음
│ │
▼ ▼
"이 사람 진짜 로그인됨?" "저장된 프로필 사진 있나?"
│ │
▼ ▼
라우팅 결정 (보안) 화면 표시 (속도)
5. Firebase를 이용한 Google 로그인 구현
5.1 Firebase 초기화 (firebase.js)
// fiberbase.js
// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
import "firebase/auth"
// Your web app's Firebase configuration
const firebaseConfig = {
apiKey: "...",
authDomain: "react-disney-plus-app.firebaseapp.com",
projectId: "react-disney-plus-app",
// ...
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
Firebase App Initialization Overview
JayTak
5.2 Auth 모듈 불러오기 (Nav.js)
import { getAuth, GoogleAuthProvider, onAuthStateChanged, signInWithPopup, signOut } from 'firebase/auth'
Firebase Authentication API Overview
JayTak
5.3 로그인 함수 구현
const auth = getAuth();
const provider = new GoogleAuthProvider();
const handleAuth = () => {
signInWithPopup(auth, provider)
.then((result) => {
setUserData(result.user);
})
.catch((error) => {
alert(error.message);
});
};
(1) firebase.js – Firebase 초기화
initializeApp(firebaseConfig) → Firebase 연결 완료
(2) Nav.js – Authentication 모듈 import
import { getAuth, … } from ‘firebase/auth’
(3) 컴포넌트에서 인증 기능 사용
const auth = getAuth(); → 인증 기능 사용 준비 완료
Firebase Authentication Core APIs Overview
JayTak
👉 결론: Firebase Auth 모듈은 firebase/auth 패키지에서 필요한 함수만 골라서 import하고, getAuth()로 인스턴스를 가져와서 인증 기능을 사용합니다!
5.4 Firebase 콘솔에서 Google 로그인 활성화
Firebase Console → Authentication → Sign-in method 👉 Google Provider 활성화 필수
6. Firebase 인증 상태 체크 (자동 로그인 처리)
Firebase의 강력한 기능 중 하나는 “현재 로그인 상태를 실시간으로 감지할 수 있다”는 점이다.
import { onAuthStateChanged } from "firebase/auth";
useEffect(() => {
onAuthStateChanged(auth, (user) => {
if (user) {
navigate("/main");
} else {
navigate("/");
}
});
}, [auth, navigate]);
- 로그인 상태 → main 페이지
- 로그아웃 상태 → login 페이지
👉 페이지 새로고침에도 로그인 상태 유지 가능
7. 로그아웃 처리 & 사용자 정보 관리
import { signOut } from "firebase/auth";
const handleLogOut = () => {
signOut(auth)
.then(() => {
setUserData({});
navigate("/");
})
.catch((error) => alert(error.message));
};
8. localStorage로 사용자 상태 유지
페이지 새로고침 시 상태가 초기화되는 문제를 해결하기 위해 localStorage를 사용해 userData를 저장한다.
8.1 저장
localStorage.setItem("userData", JSON.stringify(result.user));
8.2 불러오기
const initialUserData = localStorage.getItem("userData")
? JSON.parse(localStorage.getItem("userData"))
: {};
const [userData, setUserData] = useState(initialUserData);
👉 새로고침해도 로그인 상태 유지 가능