node -v로 nodejs 설치되어있는지 확인npm install -g firebase-tools로 해당 폴더에 파이어베이스 설치firefirebase --version으로 버젼 확인firebase login으로 로그인 -> firebase CLI 환경으로 로그인 됨firebase login firebase init
firebase deploy 
firebase deploy 하면 수정한 것 올라감
firebase serve

npm run buildfirebase deploy 










querySnapshotdocument.addEventListener('DOMContentLoaded', function() {});db.collection("users").get().then((querySnapshot) => {})then 블록 내의 함수가 실행querySnapshot.forEach((doc) => { ... });let user = doc.data(); user.id = doc.iduser 객체에 추가 console.log(${user.id} => ${user.name}, ${user.city}, ${user.phone});<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Welcome to Firebase Hosting</title>
<script defer src="/__/firebase/10.12.2/firebase-app-compat.js"></script>
<script defer src="/__/firebase/10.12.2/firebase-firestore-compat.js"></script>
<script defer src="/__/firebase/10.12.2/firebase-storage-compat.js"></script>
<script defer src="/__/firebase/init.js?useEmulator=true"></script>
</head>
<body>
<h1>Hello world</h1>
<script>
document.addEventListener('DOMContentLoaded', function() {
try {
//console.log(app);
//console.log(db);
db.collection("users").get().then((querySnapshot) => { //db의 user 컬렉션에 저장된 데이터 출력 확인
querySnapshot.forEach((doc) => {
let user = doc.data();
user.id = doc.id;
console.log(`${user.id} => ${user.name}, ${user.city}, ${user.phone}`);
});
});
} catch (e) {
console.error(e);
}
});
</script>
</body>
</html>
<script type="module">
import { initializeApp } from "https://www.gstatic.com/firebasejs/10.12.2/firebase-app.js";
const firebaseConfig = {
// 해당 프로젝트 정보 넣는 부분
apiKey: "정보 넣기",
authDomain: "밑에도",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: "",
measurementId: ""
};
window.app = initializeApp(firebaseConfig);
window.db = firebase.firestore();
</script>
</head>
</html>

<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Firebase Hosting에 오신 것을 환영합니다</title>
<!-- 부트스트랩 CDN -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.4/dist/jquery.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js"></script>
<!-- Firebase CDN -->
<script defer src="/__/firebase/10.12.2/firebase-app-compat.js"></script>
<script defer src="/__/firebase/10.12.2/firebase-firestore-compat.js"></script>
<script defer src="/__/firebase/10.12.2/firebase-storage-compat.js"></script>
<script defer src="/__/firebase/init.js?useEmulator=true"></script>
<style>
.input-group {
display: flex;
align-items: flex-start;
margin-bottom: 10px;
}
.input-group img {
max-width: 200px;
max-height: 200px;
display: none;
margin-left: 50px;
}
.input-group .input-fields {
margin-left: 10px;
margin-bottom: 20px;
}
</style>
</head>
<body>
<div class="container">
<h1>사용자 정보 입력</h1>
<hr/>
<div>
<div id="userInfo">
<div class="input-group">
<div class="input-fields">
- ID : <br/>
- 이 름 : <input id="name" type="text" placeholder="성명을 입력하세요" /><br /><br />
- 도 시 : <input id="city" type="text" placeholder="도시를 입력하세요" /><br /><br />
- 전 화 : <input id="phone" type="text" placeholder="전화를 입력하세요" /><br /><br />
- 사 진 : <br/>
<input type="file" id="photo" /><br/>
</div>
<!-- 사진 미리보기 -->
<div id="previewContainer">
<img id="preview" src="#" alt="사진 미리보기" style="max-width: 200px; max-height: 200px; display: none;"/>
</div>
</div>
<button id="appendBtn" style="width:120px">추가</button>
<button id="editBtn" style="width:120px">수정</button>
</div>
</div>
<hr/>
<table class="table table-striped">
<thead>
<tr>
<th>선택</th>
<th>번호</th>
<th>이름</th>
<th>도시</th>
<th>전화</th>
<th>사진</th>
<th>삭제</th>
</tr>
</thead>
<tbody id="showBox"></tbody>
</table>
</div>
<script>
// DOMContentLoaded 이벤트 발생 시 실행
document.addEventListener('DOMContentLoaded', function() {
var userList = []; // 사용자 목록을 저장하는 배열
var showBox = document.getElementById("showBox");
var appendBtn = document.getElementById("appendBtn");
var editBtn = document.getElementById("editBtn");
var nameElement = document.getElementById("name");
var cityElement = document.getElementById("city");
var phoneElement = document.getElementById("phone");
var previewElement = document.getElementById("preview");
var selectedUserId = null;
// Firebase Storage 참조
var storageRef = firebase.storage().ref(); // Firebase Storage의 참조를 가져옴
// 파일 선택 시 미리보기
var photoElement = document.getElementById("photo");
photoElement.addEventListener('change', function() {
var file = photoElement.files[0];
if (file) {
var reader = new FileReader();
reader.onload = function(e) {
previewElement.src = e.target.result;
previewElement.style.display = 'block';
};
reader.readAsDataURL(file);
}
});
// 사용자 추가
appendBtn.onclick = function() {
if (selectedUserId) {
alert("선택된 사용자입니다. 수정하려면 수정 버튼을 눌러주세요.");
return;
}
var newUser = {
name: nameElement.value,
city: cityElement.value,
phone: phoneElement.value,
};
console.log(newUser);
// 필드가 비어있을 때
if (!newUser.name || !newUser.city || !newUser.phone || !photoElement.files[0]) {
alert("모든 정보를 입력해주세요.");
return;
}
// Firestore에서 중복 체크
db.collection("users").where("phone", "==", newUser.phone).get().then((querySnapshot) => {
if (!querySnapshot.empty) {
console.error("Error: Phone number already exists.");
alert("전화번호가 이미 존재합니다.");
return;
}
// 중복이 없을 때, 사용자 추가
var file = photoElement.files[0];
var storageRef = firebase.storage().ref();
var uploadTask = storageRef.child('user_photos/' + file.name).put(file);
uploadTask.on('state_changed', function(snapshot) {
}, function(error) {
console.error("Error uploading file: ", error);
}, function() {
// 업로드 성공 시 파일 URL을 얻어서 Firestore에 저장
uploadTask.snapshot.ref.getDownloadURL().then(function(downloadURL) {
newUser.photo = downloadURL;
db.collection("users").add(newUser)
.then((docRef) => {
console.log("Document written with ID: ", docRef.id);
drawList();
// 필드 비우기
nameElement.value = "";
cityElement.value = "";
phoneElement.value = "";
photoElement.value = "";
previewElement.src = "#";
previewElement.style.display = 'none';
})
.catch((error) => {
console.error("Error adding document: ", error);
});
});
});
});
};
// 선택된 사용자 정보 표시 및 수정 기능
window.selectUser = function(btn) {
var idx = userList.findIndex((item) => item.id === btn.dataset.userid);
if (idx !== -1) {
var user = userList[idx];
nameElement.value = user.name;
cityElement.value = user.city;
phoneElement.value = user.phone;
selectedUserId = user.id;
// 선택된 사용자의 사진 미리보기
previewElement.src = user.photo; // 사용자의 사진 URL 설정
previewElement.style.display = 'block'; // 사진 미리보기 보이기
}
};
// 사용자 수정 기능
editBtn.onclick = function() {
if (!selectedUserId) {
alert("수정할 사용자를 선택하세요.");
return;
}
var updateUser = {
name: nameElement.value,
city: cityElement.value,
phone: phoneElement.value,
};
// 파일을 새로 선택한 경우에만 사진 업데이트
var file = photoElement.files[0];
if (file) {
var uploadTask = storageRef.child('user_photos/' + file.name).put(file);
uploadTask.on('state_changed', function(snapshot) {
}, function(error) {
console.error("Error uploading file: ", error);
}, function() {
// 업로드 성공 시 파일 URL을 얻어서 Firestore에 저장
uploadTask.snapshot.ref.getDownloadURL().then(function(downloadURL) {
updateUser.photo = downloadURL;
// 기존 사용자 정보 업데이트
var userRef = db.collection("users").doc(selectedUserId);
userRef.get().then(function(doc) {
if (doc.exists) {
// 기존 사용자 정보 업데이트
userRef.update(updateUser)
.then(() => {
console.log("Document successfully updated!");
confirm("사용자 정보를 업데이트 하시겠습니까?");
drawList();
// 필드 비우기
nameElement.value = "";
cityElement.value = "";
phoneElement.value = "";
photoElement.value = "";
previewElement.src = "#";
previewElement.style.display = 'none';
// 사용자 선택 초기화
selectedUserId = null;
})
.catch((error) => {
console.error("Error updating document: ", error);
});
} else {
console.error("No such document!");
}
}).catch(function(error) {
console.error("Error getting document:", error);
});
});
});
} else {
// 파일을 선택하지 않은 경우 기존 사진 URL 유지하고 사용자 정보 업데이트
var userRef = db.collection("users").doc(selectedUserId);
userRef.update(updateUser)
.then(() => {
console.log("Document successfully updated!");
confirm("사용자 정보를 업데이트 하시겠습니까?");
drawList();
// 필드 비우기
nameElement.value = "";
cityElement.value = "";
phoneElement.value = "";
previewElement.src = "#";
previewElement.style.display = 'none';
// 사용자 선택 초기화
selectedUserId = null;
})
.catch((error) => {
console.error("Error updating document: ", error);
});
}
};
// 사용자 삭제 기능
window.deleteUser = function(btn) {
var userId = btn.dataset.userid;
// Firestore에서 사용자 문서 가져오기
db.collection("users").doc(userId).get().then((doc) => {
if (doc.exists) {
var user = doc.data();
// Firestore에서 사용자 문서 삭제
db.collection("users").doc(userId).delete().then(() => {
console.log("사용자 문서 삭제 완료");
// Firestore에서 삭제된 후 사진도 삭제
if (user.photo) {
// 기존 사진 URL 가져오기
var existingPhotoUrl = user.photo;
// 파일 URL로부터 Reference 생성
var existingPhotoRef = firebase.storage().refFromURL(existingPhotoUrl);
// 파일 삭제
existingPhotoRef.delete().then(function() {
console.log("기존 사진 삭제 완료");
confirm("해당 유저를 삭제하시겠습니까?.");
drawList(); // 사용자 목록 다시 그리기
}).catch((error) => {
console.error("기존 사진 삭제 오류:", error);
});
} else {
console.log("해당 사용자의 사진이 없습니다.");
confirm("해당 유저를 삭제하시겠습니까?.");
drawList(); // 사용자 목록 다시 그리기
}
}).catch((error) => {
console.error("해당 유저를 삭제하지 못했습니다. ", error);
});
} else {
console.error("해당 유저를 찾을 수 없습니다.");
}
}).catch((error) => {
console.error("사용자 문서를 가져오지 못했습니다: ", error);
});
};
// 사용자 목록 그리기 함수
function drawList() {
try {
db.collection("users").get().then((querySnapshot) => {
var html = "";
userList = [];
querySnapshot.forEach((doc) => {
let user = doc.data();
user.id = doc.id;
userList.push(user);
html += `<tr>
<td align="center">
<button data-userid="${user.id}">선택</button>
</td>
<td>${user.id.substring(0, 3)}</td>
<td>${user.name}</td>
<td>${user.city}</td>
<td>${user.phone}</td>
<td><img src="${user.photo}" alt="사용자 사진" style="max-width: 50px; max-height: 50px;" /></td>
<td><button data-userid="${user.id}">삭제</button></td>
</tr>`;
});
showBox.innerHTML = html; // HTML 테이블에 사용자 목록 추가
});
} catch (e) {
console.error(e);
}
}
drawList(); // 페이지 로드 시 사용자 목록을 초기화
});
</script>
</body>
</html>
<script type="module">
import { initializeApp } from "https://www.gstatic.com/firebasejs/10.12.2/firebase-app.js";
const firebaseConfig = {
// Firebase 프로젝트 설정
apiKey: "여기 설정 작성",
authDomain: "밑에도",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: "",
measurementId: ""
};
window.app = initializeApp(firebaseConfig);
window.db = firebase.firestore(); // Firestore 인스턴스를 전역 객체에 할당
</script>

firebase.storage().ref()
addEventListener('change', function() { })photoElement.files[0]FileReaderonloade.target.resultpreviewElement.src = e.target.result;previewElement.style.display = 'block';reader.readAsDataURL(file);

db.collection("users")db : Friestore 데이터 베이스에 대한 참조collection("users") : "user"라는 이름의 컬렉션 참조.where("phone", "==", newUser.phone).get()QuerySnapshotthen 메서드

storageRef.child('user_photos/' + file.name)put(file)uploadTask
uploadTask.snapshot.ref.getDownloadURL()downloadURL
db.collection("users").add(newUser).add() 메서드docRefdocRef.id 새로 추가된 문서의 고유 ID
window.selectUseruserList.findIndex((item) => item.id === btn.dataset.userid);var user = userList[idx];previewElement.src = user.photo;

var existingPhotoUrl = doc.data().photo;var existingPhotoRef = firebase.storage().refFromURL(existingPhotoUrl);existingPhotoRef.delete().then(function() {});userRef.update(updateUser).then(() => {});
db.collection("users").doc(userId).delete().then(() => {}existingPhotoRef.delete().then(function() {}