- Firebase
- React Project
앱을 만들 때 필요한 여러가지 기능을 편리하게 구현 가눙.
Firebase 하나로 백엔드 부분을 대체 가능.
$ npm install firebase
// Import the functions you need from the SDKs you need
import { initializeApp } from "firebase/app";
// TODO: Add SDKs for Firebase products that you want to use
// https://firebase.google.com/docs/web/setup#available-libraries
// Your web app's Firebase configuration
const firebaseConfig = {
apiKey: "AIzaSyC63UwfU5W3xQfqOR9CVObrdwtNQNe4Gak",
authDomain: "react-firebase-30fd5.firebaseapp.com",
projectId: "react-firebase-30fd5",
storageBucket: "react-firebase-30fd5.appspot.com",
messagingSenderId: "1055997579956",
appId: "1:1055997579956:web:fece8bcb3636855b037de1"
};
// Initialize Firebase
const app = initializeApp(firebaseConfig);
<Route path="/" element={<Layout />}>
<Route index element={<MainPage />} />
<Route path="/login" element={<LoginPage />} />
</Route>
const Layout = () => {
return (
<>
<div></div>
<Outlet />
</>
)
}
예> localhost:3000/login 에서는
Layout이 보이고, LoginPage가 보임.
props
를 사용할 수 있음const Button = styled.button`
color: ${(props => props.primary ? "red" : "white"};
`;
styled()
)const Button = styled.button`
// styling
`;
const BlueButton = styled(Button)`
color: blue;
`;
const [show, setShow] = useState(false);
const listener = () => {
if (window.scrollY > 50) {
setShow(true);
} else {
setShow(false);
}
}
useEffect(() => {
window.addEventListener('scroll', listner);
return () => {
window.removeEventListener('scroll', listner);
}
}, []);
/login
일 때만 보이도록 설정const { pathname } = useLocation(); // '/login'
...
// return
{pathname === '/login' ? (<LoginButton />) : null}
import { getAuth, signInWithPopup, GoogleAuthProvider } from 'firebase/auth';
import app from '../firebase';
const auth = getAuth(app);
const provider = new GoogleAuthProvider();
signInWithPopup(auth, provider);
const handleAuth = () => {
signInWithPopup(auth, provider)
.then(result => {
console.log(result);
})
.catch(error => {
console.error(error);
})
}
'firebase/auth'의 onAuthStateChanged
메서드 사용
import { getAuth, onAuthStateChanged } from "firebase/auth";
const auth = getAuth(app); // auth 인스턴스
onAuthStateChanged(auth, (user) => {
if (user) {
// User Signed in
const uid = user.uid;
} else {
// User Signed out
}
});
import { useNavigate } from 'react-router-dom';
const navigate = useNavigate();
useEffect(() => {
const unsubscribe = onAuthStateChanged(auth, (user) => {
if (!user) {
navigate('/login');
} else if (user && pathname === '/login') {
// 로그인 상태인데 로그인 페이지로 가려고 할 경우
navigate('/');
}
});
// return으로 정리해줘야함
return () => {
unsubscribe();
}
}, []);
const [userData, setUserData] = useState({})
const handleAuth = () => {
signInWithPopup(auth, provider)
.then(result => {
setUserData(result.user);
})
.catch(error => {
console.error(error)
});
}
userData.photoURL을 이용하여 유저 프로필 이미지 보여주기 가능.
import { signOut } from 'firebase/auth';
const handleLogout = () => {
signOut(auth).then(() => {
setUserData({});
})
.catch(error => {
console.error(error);
});
}
result.user
은 객체이기 때문에, localStorage에 저장할 때는JSON.stringify()
를 통해 스트링화JSON.parse()
를 이용$ npm install -g firebase-tools
$ firebase login
$ npm run build
$ firebase init
hosting 기능 선택 후 스페이스바 + 엔터 후
Existing Project 선택 후 엔터
퍼블릭 디렉토리 선택
-> dist
입력 후 엔터
위와 같은 과정을 통해 배포 완료.
다시 한 번 소스코드를 git에 push.
github > Actions 탭 확인해보면
build_and_deploy진행 과정 볼 수 있음.