반응형
마감날까지 못 끝낼 줄 알았던 프로젝트가 드디어 끝났습니다.
오늘은 제가 진행했던 로그인 회원가입 로그아웃 마이페이지 부분 코드를 뜯어보겠습니다.
login.js
// 로그인 부분
document.addEventListener("DOMContentLoaded", () => {
const logInButton = document.querySelector("#loginButton");
if (logInButton) {
// if문으로 로그인 버튼이 존재하는지 확인. 없으면 null, 안정성 향상
logInButton.addEventListener("click", (event) => {
event.preventDefault(); // 페이지가 새로고침 되는 것을 방지
const loginID = document.getElementById("loginID").value;
const loginPassword = document.getElementById("loginPassword").value;
// 이메일과 비밀번호 입력 시 auth 로 로그인 인증 상태 확인
signInWithEmailAndPassword(auth, loginID, loginPassword)
.then((userCredential) => {
// Firebase 인증 메서드가 성공적으로 완료됐을 때 반환되는 객체 userCredential
const user = userCredential.user;
localStorage.setItem("userID", user.uid);
})
.then(() => (window.location.href = "/index.html")) // 로그인 정보를 가져오고 성공 시 index.html 로 이동
.catch((error) => {
alert("로그인 정보가 일치하지 않습니다.");
const errorCode = error.code;
const errorMessage = error.message;
// ..
});
});
}
// 회원가입 버튼 클릭 시 회원가입 페이지로 이동
const signupButton = document.querySelector(".moveToSignUpPageButton");
if (signupButton) {
signupButton.addEventListener("click", () => {
window.location.href = "signup.html";
});
}
});
signup.js
// 회원가입 부분
document.addEventListener("DOMContentLoaded", () => {
const signUpButton = document.querySelector("#signUpButton");
if (signUpButton) { // 회원가입 버튼이 있는지 확인
signUpButton.addEventListener("click", (event) => {
event.preventDefault(); // 클릭하면 페이지가 새로고침 되는 것을 방지하고
const signUpEmail = document.getElementById("signUpEmail").value;
const signUpPassword = document.getElementById("signUpPassword").value;
// 이메일, 비밀번호 id값을 signupEmail, signupPassword 에 넣어주고
createUserWithEmailAndPassword(auth, signUpEmail, signUpPassword) // 유저 정보를 저장해라 auth에
.then(async (userCredential) => {
alert("회원가입 완료");
// auth 를 통한 Firebase 인증 메서드가 성공적으로 완료됐을 때 반환되는 객체 userCredential
const user = userCredential.user;
localStorage.setItem("userID", user.uid);
// 추가로 localstorage 에 유저 정보를 저장해라
await setDoc(doc(firestoreDB, "user", `${user.uid}`), { saveMovies: [], reviewMovies: {} });
}) // 성공적으로 회원가입 완료 시 index.html 로 이동
.then(() => (window.location.href = "/index.html"))
.catch((error) => {
console.log("error: ", error);
alert("이메일 주소 혹은 비밀번호를 다시 확인해주세요");
const errorCode = error.code;
const errorMessage = error.message;
// ..
});
});
}
// 로그인 버튼 클릭시 login page 로 이동
const loginButton = document.querySelector(".moveToLoginPageButton");
if (loginButton) {
loginButton.addEventListener("click", () => {
window.location.href = "login.html";
});
}
});
logoutstatus.js
// 로그인 인증 상태 확인 해서 버튼 표시하는 부분
document.addEventListener("DOMContentLoaded", function () {
const loginButton = document.querySelector(".moveToLoginPageButton");
const signUpButton = document.querySelector(".moveToSignUpPageButton");
const logoutButton = document.getElementById("logoutButton");
const myMoviesButton = document.getElementById("moveToMyMoviesButton");
// 기본적으로 모든 버튼을 숨긴 상태로 만듦
if (loginButton) loginButton.style.display = "none";
if (signUpButton) signUpButton.style.display = "none";
if (logoutButton) logoutButton.style.display = "none";
if (myMoviesButton) myMoviesButton.style.display = "none";
const userLoggedIn = localStorage.getItem("userLoggedIn");
// localStorage 를 통해 로그인 인증 상태가 true이면 아래 버튼을 보여라
if (userLoggedIn === "true") {
if (loginButton) loginButton.style.display = "none";
if (signUpButton) signUpButton.style.display = "none";
if (logoutButton) logoutButton.style.display = "block";
if (myMoviesButton) myMoviesButton.style.display = "block";
} else { // localStorage 를 통해 로그인 인증 상태가 false면 아래 버튼을 보여라
if (loginButton) loginButton.style.display = "block";
if (signUpButton) signUpButton.style.display = "block";
if (logoutButton) logoutButton.style.display = "none";
if (myMoviesButton) myMoviesButton.style.display = "none";
}
// Firebase Auth 상태 감지
// 원래는 회원가입 시 로그인 상태(true)를 localstorage 에 저장해주면 더 빨리 호출되지만,
// 보안상 계정 정보만 localstorage 에 저장하고, 로그인 상태는 auth 에서 가져온다.
// 계정 정보만 localstorage에 넣어줘도 기존보다 딜레이 없이 더 빠르다.
onAuthStateChanged(auth, (user) => { // firebase auth 계정 인증정보를 확인
if (user) {
localStorage.setItem("userLoggedIn", "true"); // 로그인 상태인 경우 로컬 저장소에 사용자 ID 저장
if (loginButton) loginButton.style.display = "none";
if (signUpButton) signUpButton.style.display = "none";
if (logoutButton) logoutButton.style.display = "block";
if (myMoviesButton) myMoviesButton.style.display = "block";
} else { // 로그아웃 상태인 경우 로컬 저장소에서 사용자 ID 제거
localStorage.setItem("userLoggedIn", "false");
if (loginButton) loginButton.style.display = "block";
if (signUpButton) signUpButton.style.display = "block";
if (logoutButton) logoutButton.style.display = "none";
if (myMoviesButton) myMoviesButton.style.display = "none";
}
});
// 로그아웃 후 index.html로 리디렉션
if (logoutButton) {
logoutButton.addEventListener("click", () => {
signOut(auth)
.then(() => {
console.log("User logged out");
localStorage.setItem("userID", null);
})
.then(() => (window.location.href = "index.html"))
.catch((error) => {
console.error("Logout failed:", error);
});
});
}
});
이 외 module 을 사용해서 import 와 export 를 활용하여 코드 정리를 하여 가독성을 높혔고, 각 구역마다 헤더부분에 버튼 기능을 코드 복붙으로 기능 구현을 해주었습니다. 그리고 마이페이지 부분 사용자 프로필 이미지도 랜덤색상 및 zep 아바타로 넣었는데 코드가 겹쳐 이미지가 여러개 생성 될 때는 while 문으로 기존 이미지 제거를 해서 해결하였습니다.
내일 팀 프로젝트가 끝나고 팀장으로써 발표를 해야하는데 말도 잘 못하고 부담이 되지만, 열심히 마무리 잘 해보도록 하겠습니다.
반응형
'코딩 > React 본 캠프' 카테고리의 다른 글
[본 캠프 19일차] 걷기반 5주차 실습 + React 입문 1주차 (0) | 2024.08.08 |
---|---|
[본 캠프 18일차] 팀 프로젝트 끝 (0) | 2024.08.07 |
[본 캠프 16일차] 팀 프로젝트 4일차 (1) | 2024.08.05 |
[본 캠프 15일차] 5회차 걷기반 강의 + 팀 프로젝트 3일차 (0) | 2024.08.02 |
[본 캠프 14일차] 팀 프로젝트 2일차 + 걷기반 실습 4회차 + 알고리즘 특강 (0) | 2024.07.31 |