
/src/components/App.js์์ firebase importํ๊ธฐimport AppRouter from "./Router";
import { useState } from "react";
//๐ฅ์๋ ๊ฒฝ๋ก(relative import, = ํ์ผ ๊ฒฝ๋ก)๋ก ์ํฌํธ
import firebase from "../firebase";
function App() {
//useState Hook
const [isLoggedIn, setIsLoggedIn] = useState(false);
//Router ๋ ๋ํ๊ธฐ
//AppRouter์ prop ์ ๋ฌํ๊ธฐ
return (
<>
<AppRouter isLoggedIn={isLoggedIn} />
<footer>© twinkle {new Date().getFullYear()}</footer>
</>
);
}
export default App;
1-2. ์ ๋๊ฒฝ๋ก ๊ฐ์ ธ์ค๊ธฐ(absolute import)๋ฅผ ์ฌ์ฉํด๋ณด์
์ ๋๊ฒฝ๋ก ๊ฐ์ ธ์ค๊ธฐ(absolute import)
์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ง์ํ๋๋ก ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ ์ ์๋ค.
์ด ์์ ์ ํ๋ก์ ํธ์ ๋ฃจํธ์jsconfig.json๋๋tsconfig.jsonํ์ผ์ ๊ตฌ์ฑํ์ฌ ์ํํ ์ ์๋ค.
ํ๋ก์ ํธ์์ TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐtsconfig.jsonํ์ผ์ด ์ด๋ฏธ ์์ ๊ฒ์ด๋ค.
์๋๋ JavaScript ํ๋ก์ ํธ์jsconfig.jsonํ์ผ์ ์์ด๋ค.
ํ์ผ์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค ์ ์๋ค.{ "compilerOptions": { "baseUrl": "src" }, "include": ["src"] }TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํ๋ก์ ํธ์
tsconfig.jsonํ์ผ์compilerOptions๋ด์์baseUrl์ค์ ์ ๊ตฌ์ฑํ ์ ์๋ค.
์ ๋๊ฒฝ๋ก ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ง์ํ๋๋ก ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ์ผ๋ฏ๋กsrc/components/Button.js์ ์์นํ ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ชจ๋์ ๊ฐ์ ธ์ฌ ์ ์๋ค.import Button from 'components/Button';
1-2-1. ๋ฐ๋ผ์ ์ ๋๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํธ์ํด ํด๋์ jsconfig.json ํ์ผ์ ์์ฑํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ๋ค.
{
"compilerOptions": {
"baseUrl": "src"
},
"include": ["src"]
}
1-2-2. ๊ทธ๋ฌ๊ณ ๋์ firebase๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ๋๊ฒฝ๋ก๋ก ๊ฐ์ ธ์จ๋ค.
import firebase from "firebase";
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๊ฒฝ๋ก๋ ์ ๋๊ฒฝ๋ก๋ก ๋ฐ๊ฟ์ฃผ์.
//์ ๋ ๊ฒฝ๋ก(absolute import)
import AppRouter from "components/Router";
import { useState } from "react";
//์ ๋ ๊ฒฝ๋ก(absolute import)
import firebase from "firebase";
function App() {
//useState Hook
const [isLoggedIn, setIsLoggedIn] = useState(false);
//Router ๋ ๋ํ๊ธฐ
//AppRouter์ prop ์ ๋ฌํ๊ธฐ
return (
<>
<AppRouter isLoggedIn={isLoggedIn} />
<footer>© twinkle {new Date().getFullYear()}</footer>
</>
);
}
export default App;
firebase.js ํ์ผ ์ด๋ฆ์ fbase.js๋ก ๋ฐ๊พธ๊ณ ๊ฐ์.firebase์์ ์ํฌํธ ํด์ค๊ณ ๊ทธ๋ฌ๋๋ฐ ์ด๋ฆ์ด ๊ฐ์์ ํท๊ฐ๋ฆฐ๋ค..^^...
๋คํํ ๋๋ํ VSC๋ ํ์ผ ์ด๋ฆ ๋ฐ๊พธ๋ฉด ์๋์ผ๋ก import ๊ฒฝ๋ก ์
๋ํด์ค๋ค.
App.js, index.js์ import firebase from "fbase";๋ก!!
auth๋ ์ ๊ท ์ฌ์ฉ์ ๊ฐ์ ๋ฐ ๊ธฐ์กด ์ฌ์ฉ์ ๋ก๊ทธ์ธ ๋ฑ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๐ฅ (Firebase v.9๋ก ์งํ)
์๋์ฒ๋ผ ์์ฑํ๋ฉด Firebase ์๋น์ค(Cloud Firestore, ์ธ์ฆ, ์ค์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์๊ฒฉ ๊ตฌ์ฑ ๋ฑ)๋ฅผ ๊ฐ๋ณ ํ์ ํจํค์ง ๋ด์์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
import { } from 'firebase/<service>';
- ์น์ ์ฌ์ฉ ๊ฐ๋ฅํ Firebase ์๋น์ค ์ค ์น์ฉ ์ธ์ฆ
import { } from 'firebase/auth';- ์น์ฉ Cloud Firestore
import { } from 'firebase/firestore';- ์น์ฉ Cloud Storage
import { } from 'firebase/storage';
/src/firebase.js ์์ฑimport { initializeApp } from "firebase/app";
//๐ฅ
import { getAuth } from "firebase/auth";
// Follow this pattern to import other Firebase services
// import { } from 'firebase/<service>';
// Your web app's Firebase configuration
const firebaseConfig = {
apiKey: process.env.REACT_APP_API_KEY,
authDomain: process.env.REACT_APP_AUTH_DOMAIN,
projectId: process.env.REACT_APP_PROJECT_ID,
storageBucket: process.env.REACT_APP_STORAGE_BUCKET,
messagingSenderId: process.env.REACT_APP_MESSAGING_SENDER_ID,
appId: process.env.REACT_APP_APP_ID,
};
// Initialize Firebase(Firebase ํ๋ก์ ํธ ์ฑ)
const app = initializeApp(firebaseConfig);
//๐ฅ ๊ตณ์ด firebase ์ ์ฒด ๋ค ์๋ด๋ณด๋ด๊ณ authService๋ง exportํ ์ ์๋ค.
//๐ฅ authService ์ฌ์ฉํ๊ณ ์ถ์ ๋ ๋ง๋ค getAuth(app) ํธ์ถํด์ผ ํ๋๊น app.js์์ ๋จ ํ ๋ฒ๋ง ํธ์ถํ๊ณ export ์ํค๋ฉด ๋๋ค.
export const authService = getAuth(app);
/src/components/App.js ์์ฑ//์ ๋ ๊ฒฝ๋ก(absolute import)
import AppRouter from "components/Router";
import { useState } from "react";
//์ ๋ ๊ฒฝ๋ก(absolute import)
//๐ฅ fbase์์ authService ๊ฐ์ ธ์ค๊ธฐ(export๋ก ๋ด๋ณด๋๊ธฐ ๋๋ฌธ์ {} ์ค๊ดํธ ์ณ์ ๊ฐ์ ธ์์ผ ํจ)
import { authService } from "fbase";
function App() {
//useState Hook
const [isLoggedIn, setIsLoggedIn] = useState(false);
console.log(authService);
//Router ๋ ๋ํ๊ธฐ
//AppRouter์ prop ์ ๋ฌํ๊ธฐ
return (
<>
<AppRouter isLoggedIn={isLoggedIn} />
<footer>© twinkle {new Date().getFullYear()}</footer>
</>
);
}
export default App;
Firebase > Docs > Reference > JavaScript - version 9 > auth > Auth
authService.currentUser๋ฅผ ๋ก๊ทธ๋ก ์ฐ์ด๋ณด์.
//App.js
//์ ๋ ๊ฒฝ๋ก(absolute import)
import AppRouter from "components/Router";
import { useState } from "react";
//์ ๋ ๊ฒฝ๋ก(absolute import)
//fbase์์ authService ๊ฐ์ ธ์ค๊ธฐ(export๋ก ๋ด๋ณด๋๊ธฐ ๋๋ฌธ์ {} ์ค๊ดํธ ์ณ์ ๊ฐ์ ธ์์ผ ํจ)
import { authService } from "fbase";
function App() {
//๐ฅ ์ธ์ฆ์๋น์ค์ ํ์ฌ ์ ์ ์์๋ณด๊ธฐ
console.log(authService.currentUser);
//useState Hook
const [isLoggedIn, setIsLoggedIn] = useState(false);
//Router ๋ ๋ํ๊ธฐ
//AppRouter์ prop ์ ๋ฌํ๊ธฐ
return (
<>
<AppRouter isLoggedIn={isLoggedIn} />
<footer>© twinkle {new Date().getFullYear()}</footer>
</>
);
}
export default App;
๊ฒฐ๊ณผ
null์ด ๋ฌ๋ค. ์ ์! ์ธ์ฆํ ํ์์ด ์๋ฌด๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ^3^~
authService.currentUser()
์ค์ผ์ด ์ด์ ์ด๊ฑธ ์ด๋๋ค ์ฐ๋ฉด ์ข์๊น? ๋ฐ๋ก useState์ ๋ฃ์ด์ ๋ก๊ทธ์ธ ์ธ์ฆ์ ํ์ธ ํด ์ฃผ์.
//App.js
//์ ๋ ๊ฒฝ๋ก(absolute import)
import AppRouter from "components/Router";
import { useState } from "react";
//์ ๋ ๊ฒฝ๋ก(absolute import)
//fbase์์ authService ๊ฐ์ ธ์ค๊ธฐ(export๋ก ๋ด๋ณด๋๊ธฐ ๋๋ฌธ์ {} ์ค๊ดํธ ์ณ์ ๊ฐ์ ธ์์ผ ํจ)
import { authService } from "fbase";
function App() {
//๐ฅ ์ธ์ฆ์๋น์ค์ ํ์ฌ ์ ์ ๊ฐ ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง์ ๋ฐ๋ผ (๋ก๊ทธ์ธํ๋์ง ์ํ๋์ง์ ๋ฐ๋ผ)state ๋ฌ๋ผ์ง
const [isLoggedIn, setIsLoggedIn] = useState(authService.currentUser);
//Router ๋ ๋ํ๊ธฐ
//AppRouter์ prop ์ ๋ฌํ๊ธฐ
return (
<>
<AppRouter isLoggedIn={isLoggedIn} />
<footer>© twinkle {new Date().getFullYear()}</footer>
</>
);
}
export default App;
Firebase > Docs > Reference > JavaScript - version 9 > auth > User
| Property | Type | Description |
|---|---|---|
| emailVerified | boolean | Whether the email has been verified with sendEmailVerification() and applyActionCode(). |
| isAnonymous | boolean | Whether the user is authenticated using the ProviderId.ANONYMOUS provider. |
| metadata | UserMetadata | Additional metadata around user creation and sign-in times. |
| providerData | UserInfo[] | Additional per provider such as displayName and profile information. |
| refreshToken | string | Refresh token used to reauthenticate the user. Avoid using this directly and prefer User.getIdToken() to refresh the ID token instead. |
| tenantId | string/null | The user's tenant ID. |
| Method | Description |
|---|---|
| delete() | Deletes and signs out the user. |
| getIdToken(forceRefresh) | Returns a JSON Web Token (JWT) used to identify the user to a Firebase service. |
| getIdTokenResult(forceRefresh) | Returns a deserialized JSON Web Token (JWT) used to identitfy the user to a Firebase service. |
| reload() | Refreshes the user, if signed in. |
| toJSON() | Returns a JSON-serializable representation of this object. |
Firebase ์ฝ์์์ Authentification์ผ๋ก ๊ฐ๋ฉด ์์ง ์ ์ ๊ฐ ์๋ฌด๋ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

๋ก๊ทธ์ธ ๋ฐฉ๋ฒ ์ค์ ๋ฒํผ์ ํด๋ฆญํด ๋ณด์.
๋ก๊ทธ์ธ ์ ๊ณต ์
์ฒด ํญ๋ชฉ์์ ์ด๋ฉ์ผ/๋น๋ฐ๋ฒํธ๋ฅผ ์ ํํ๋ค.

์ฌ์ฉ ์ค์ ์ผ๋ก ๋ฐ๊พผ ํ ์ ์ฅํ๋ค.
์ ์ ๊ณต์
์ฒด ์ถ๊ฐ ๋ฒํผ์ ํด๋ฆญํ์ฌ ๊ตฌ๊ธ๋ ์ ํํ๋ค.


์ฌ์ฉ ์ค์ ์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ ํ๋ก์ ํธ ์ง์ ์ด๋ฉ์ผ์ ๋ด ์ด๋ฉ์ผ์ ์ ํํ์ฌ ์ ์ฅํ๋ค.
์ ์ ๊ณต์
์ฒด ์ถ๊ฐ ๋ฒํผ์ ํด๋ฆญํ์ฌ ๊นํ๋ธ๋ ์ถ๊ฐํ์.


์น์ธ ์ฝ๋ฐฑ URL์ GitHub ์ฑ ๊ตฌ์ฑ์ ์ถ๊ฐํด์ผ ํ๋ค.
GitHub ์ฑ ๊ตฌ์ฑ์ ์ถ๊ฐํ๋ฌ ๊ฐ๋ณด์.โ
GitHub > Settings > Developer settings > OAuth App > New OAuth App


Applicaion name์ ์
๋ ฅ ํ ํ, Homepage URL์ ์์ ์ฝ๋ฐฑurl์์ ๋ท ๋ถ๋ถ์ ๋บ url์ ์
๋ ฅํ๊ณ , Authorization callback URL์ ์์ ์ฝ๋ฐฑ url ์ ์ฒด๋ฅผ ์
๋ ฅํด ๋์. ์ด๋ GitHub์ ์ํ ๋ถ๋ถ์ด๋ค.
Register application์ ํด๋ฆญํ๋ฉด Client ID์ Client secret์ด ๋ฌ๋ค. ์ด๋ฅผ ๋ณต์ฌํ์.
์ฌ์ฉ ์ค์ ์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ ํด๋ผ์ด์ธํธ ID์ ํด๋ผ์ด์ธํธ ๋ณด์ ๋น๋ฐ๋ฒํธ๋ฅผ ์
๋ ฅํ ํ ์ ์ฅํ๋ค.