์น ๊ฐ๋ฐ 5์ฃผ์ฐจ์ ๋ฐฐ์ด ๋ด์ฉ
์คํ๋ฅดํํ๋ฆญ์ค
์คํ๋ฅดํํ๋ฆญ์ค ํ๋ก์ ํธ๋ฅผ ์ด์ฉํด์ ๋ฐ์ดํฐ๋ฅผ Firestore Database์ ๋ฃ๊ณ ๋ค์ ๊ฐ์ ธ์ค๋ ๋ด์ฉ์ ๋ณต์ตํ๋ค ๐คจ๐คจ
Firebase ์ฐ๋ ๊ธฐ๋ณธ ์ธํ
๋จผ์ Firebase ์ฐ๋์ ์ํ ๊ธฐ๋ณธ ์ธํ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ฃผ์๋ค!
// Firebase SDK ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ธ์ค๊ธฐ
import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js";
import { getFirestore } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
import { collection, addDoc } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
import { getDocs } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
// For Firebase JS SDK v7.20.0 and later, measurementId is optional
const firebaseConfig = {
apiKey: "",
authDomain: "",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: "",
measurementId: ""
};
// Firebase ์ธ์คํด์ค ์ด๊ธฐํ
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
์ํ ๋ฐ์ดํฐ ๋ฃ๊ธฐ - addDoc
๊ทธ ๋ค์ ์ ๋ ฅํ ์ํ ๋ฐ์ดํฐ๋ฅผ Firestore Database์ ์ ์ฅํ ์ ์๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ฃผ์๋ค!
$("#postingbtn").click(async function () { //๋ฒํผ์ id๋ฅผ ๋ฃ์ด์ ๋ฒํผ์ ํด๋ฆญํ๋ฉด ์๋๋๋ ํจ์ ์์ฑ!
let image = $('#image').val();
let title = $('#title').val();
let star = $('#star').val(); //select๋ก ์ด๋ฃจ์ด์ง ๋ถ๋ถ์์๋ value์ ์๋ ๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ฐ๋ผ์ ์ถ๋ ฅํ๊ณ ์ถ์ ๊ฐ์ผ๋ก value ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋๋ค!
let comment = $('#comment').val();
let doc = { //๋ฐ์ดํฐ๋ค์ ๋ณ์์ ํ๋์ฉ ๋ด์์ฃผ๊ธฐ!
'image': image,
'title': title,
'star': star,
'comment': comment
};
await addDoc(collection(db, "movies"), doc); //PostBox์ ์
๋ ฅํ๋ ๊ฐ๋ค์ Database์ ์ถ๊ฐํ๊ธฐ!
alert('์ ์ฅ ์๋ฃ!'); //ํ์
์ฐฝ์ ํ์ํ์ฌ ์ ์ฅ์ด ์๋ฃ๋์์์ ํ์!
window.location.reload(); //ํ์ฌ ํ์ด์ง ์๋ก๊ณ ์นจ
})
Firestore Database์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ - getDocs
Firestore Database์ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ๋ค์ ๋์ ๋ณผ ์ ์๋๋ก ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ์๋ค!
let docs = await getDocs(collection(db, "movies"));
docs.forEach((doc) => {
let row = doc.data();
let image = row['image'];
let title = row['title'];
let star = row['star']; //select๋ก ์ด๋ฃจ์ด์ง ๋ถ๋ถ์์๋ value์ ์๋ ๊ฐ์ ์ถ๋ ฅํ๋ค. ๋ฐ๋ผ์ ์ถ๋ ฅํ๊ณ ์ถ์ ๊ฐ์ผ๋ก value ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋๋ค!
let comment = row['comment'];
//console.log(image, title, comment); //console ์ฐฝ์ ๊ฐ ๋์ฐ๊ธฐ!
//console.log(star); //console ์ฐฝ์ ๊ฐ ๋์ฐ๊ธฐ!
let temp_html = `
<div class="col">
<div class="card h-100">
<img src="${image}"
class="card-img-top" alt="...">
<div class="card-body">
<h5 class="card-title">${title}</h5>
<p class="card-text">${star}</p>
<p class="card-text">${comment}</p>
</div>
</div>
</div>`;
$('#card').append(temp_html); //์นด๋ ์ถ๊ฐํ๊ธฐ!
});
๋ฐฐํฌ
์ํํธ์จ์ด ๊ฐ๋ฐ ๊ณผ์ ์์ ๊ฐ๋ฐํ ์ ํ๋ฆฌ์ผ์ด์
, ์น์ฌ์ดํธ, ์๋น์ค ๋ฑ์ ์ค์ ์ฌ์ฉ์๋ค์๊ฒ ์ ๊ณตํ๋ ๊ณผ์ ์ ๋งํ๋ค.
์ฆ, ๋ง๋ ์์
๋ฌผ์ ์ธ๋ถ์ ๊ณต๊ฐํ๋ ์ผ์ด๋ค!! ๋งํฌ๊ฐ ์๊ฒจ์ ์์ฒญํ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ ์๋น์ค๋ฅผ ๋ด๋๋ ์ผ์ด๋ค!
URL - Uniform Resource Locator
์ธํฐ๋ท์์ ํน์ ๋ฆฌ์์ค์ ์์น๋ฅผ ๋ํ๋ด๋ ์ฃผ์์ด๋ค. ๊ฐ๋จํ ๋งํด์, ์น ํ์ด์ง๋ ํ์ผ์ ๊ณ ์ ํ ์ฃผ์์ด๋ค!
ํ๋กํ ์ฝ://๋๋ฉ์ธ/๊ฒฝ๋ก
- ํ๋กํ ์ฝ(protocol) : ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ ๊ฐ์ ํต์ ๋ฐฉ์์ ์ง์ ํ๋ค. ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ์ "http://"์ "https://"์ด๋ค.
- ๋๋ฉ์ธ(domain) : ์ธํฐ๋ท ์์์ ๊ณ ์ ํ ์๋ณ์๋ก ์ฌ์ฉ๋๋ ์น ์ฌ์ดํธ์ ์ฃผ์์ด๋ค. ๋๋ฉ์ธ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ดํธ์ ์ด๋ฆ๊ณผ ์ต์์ ๋๋ฉ์ธ(Top-Level Domain)์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ๊ฒฝ๋ก(path) : ์น ์ฌ์ดํธ ๋ด์์ ํน์ ํ์ด์ง๋ ํ์ผ์ ์์น๋ฅผ ์ง์ ํ๋ค. ๊ฒฝ๋ก๋ ์ฌ๋์ฌ(/)๋ก ๊ตฌ๋ถ๋ ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก์ ํ์ผ๋ช ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
ex) https://spartacodingclub.kr/catalog
์๋ฅผ ๋ค์ด, https://spartacodingclub.kr/catalog ๋ผ๋ URL์ HTTPS ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉฐ,
spartacodingclub.kr ๋ผ๋ ๋๋ฉ์ธ์ ์์นํ catalog๋ผ๋ ๊ฒฝ๋ก์ ์๋ ํ์ด์ง๋ฅผ ๋ํ๋
๋๋ค.
Github Pages๋ก ๋ฐฐํฌํ๊ธฐ
Github Pages
Github์์ ์ ๊ณตํ๋ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ ์ธํฐ๋ท์ผ๋ก ๊ณต์ ํ ์ ์๋ ์๋น์ค์ด๋ค.
โ๏ธ์ฐธ๊ณ - ์ ์ ์น ํ์ด์ง
์ค์๊ฐ ๋ณ๊ฒฝ๋๋ ๋ด์ฉ์ ์๊ณ HTML, CSS, JavaScript ๋ฑ์ผ๋ก ์ด๋ฃจ์ด์ง ๋จ์ํ ์น ํ์ด์ง๋ฅผ ์๋ฏธํ๋ค.
Girhub Pages๋ฅผ ์ด์ฉํ์ฌ ์์ ์ ํ๋ก์ ํธ๋ฅผ ์จ๋ผ์ธ์ผ๋ก ํธ์คํ ํ์ฌ ์น ๋ธ๋ผ์ฐ์ ์์ ์ ์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์๋ค!
์ ์ฅ์ ์์ฑํ๊ธฐ
create Repository๋ฅผ ์ ํํ๊ณ ์ ์ฅ์ ์ด๋ฆ ์ ๋ ฅ ํ, public์ ์ ํํ๊ณ Create Repository๋ฅผ ํด๋ฆญํ๋ค!
ํ์ผ ์ ๋ก๋ํ๊ธฐ
Uploading Existing Files๋ฅผ ์ ํํ๊ณ choose your files๋ฅผ ๋๋ฅธ ํ ํ์ผ ์ ํํด์ ์ ๋ก๋ํ๋ค!
๋ฐฐํฌํ๊ธฐ
์ ์ฅ์์์ settings๋ก ๋ค์ด๊ฐ๊ณ ํ๋ฉด ์ผ์ชฝ์์ Pages๋ฅผ ์ฐพ์์ ๋ค์ด๊ฐ๋ค.
Branch Name์ main์ผ๋ก ์ค์ ํ๊ณ save ๋ฒํผ์ ๋๋ฅด๋ฉด ์กฐ๊ธ์ ๊ธฐ๋ค๋ฆผ ํ ์๋ก๊ณ ์นจ ์ ํ๋ฉด์ ์ฃผ์๊ฐ ๋
ธ์ถ๋๋ค ๐ฎ๐ฎ๐ฎ
๋ฐฐํฌํ ๊ฒ ์์ ํ๊ธฐ & ์ฃผ์ ์ฌํญ
์์ ํ๊ธฐ
VS Code์์ ์์ฑํด์ ์ ์ฒด ์ฝ๋๋ฅผ ๊ต์ฒดํ๋ ๊ฒ์ด ์ข๋ค!
Github์์ ์์ ํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ ํ๋ฅ ์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค!!
์ญ์ ํ ์์ ๋ ํ์ผ์ ์ฌ๋ฆด ๋๋ ์ญ์ ํ๊ณ ์ถ์ ํ๋ก์ ํธ์ repository๋ก ๋ค์ด๊ฐ์ ์ญ์ ํ๊ณ ์ถ์ ํ์ผ ์ ํ ํ Delete file์ ํด๋ฆญํ๋ฉด ์ญ์ ๊ฐ ๊ฐ๋ฅํ๋ค.
์ญ์ ๊ฐ ์๋ฃ๋๋ฉด Commit changes๋ฅผ ๋๋ฌ์ฃผ๊ณ ํ์ผ ์ญ์ ํ์ธํ ๋ค์ Add file์ ์ ํ ํ ํ์ผ์ ์
๋ก๋ํ๋ฉด ๋๋ค!
์ฃผ์ ์ฌํญ๐คจ๐คจ
- ๋ฐฐํฌํ๊ธฐ ์ ์ ๋ฐ๋์ ๋ก์ปฌ์์ ํ ์คํธ๋ฅผ ์ํํด์ผ ํ๋ค! ๋ฐฐํฌ๋ ํ์ด์ง์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ ๋ฐ ๋์์ด ๋๋ค!
- ์๊ฒฉ ์ ์ฅ์์๋ ์ค์ํ ์ ๋ณด๋ฅผ ํฌํจํ์ง ์๋๋ก ์ฃผ์ํ๊ธฐ!!
๋น๋ฐ๋ฒํธ, API ํค, ๊ฐ์ธ์ ๋ณด ๋ฑ ๋ฏผ๊ฐํ ์ ๋ณด๋ ์์ค ์ฝ๋์์ ์ ๊ฑฐํด์ผ ํ๋ค!!!
Firebase์ ํ๊ณ์
Firebase๋ฅผ ์ฌ์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํธ์คํ ํ๋ฉด ํธ๋ฆฌํจ๊ณผ ๋น ๋ฅธ ๊ฐ๋ฐ ์๋๋ฅผ ์ป์ ์ ์์ง๋ง, ์ผ๋ถ ์ ํ ์ฌํญ์ด ์กด์ฌํ๋ค.
- ์๋ฒ ์ ์ด ์ ํ : Firebase๋ ์๋ฒ ์ธํ๋ผ์ ๋ํ ์ง์ ์ ์ธ ์ปจํธ๋กค์ด ์ ํ๋๋ค. Firebase์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ๋ฐฉ์์ ๋ฐ๋ผ ์์ ์ ์ํํด์ผ ํ๋ค....
- ํ์ฅ์ฑ ์ ํ : Firebase ๊ท๋ชจ์ ๋ฐ๋ฅธ ๊ฐ๋ก ํ์ฅ์ฑ ์ธก๋ฉด์์ ์ ํ์ด ์์ ์ ์๋ค.
- ์ข ์์ฑ : Firebase๋ฅผ ์ฌ์ฉํ๋ฉด Google์ ์๋น์ค์ ์์กดํ๊ฒ ๋๋ค. Firebase ์ธ๋ถ์ ๋ค๋ฅธ ์๋น์ค๋ ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ ์ด๋ ต๊ฑฐ๋ ์ ํ์ ์ผ ์ ์๋ค.....
์์
- Firebase ๋ถ์ด๋นต ๊ฐ๊ฒ :
ํ์ด์ด๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฆฐ ๋ถ์ด๋นต ๊ฐ๊ฒ๋ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ํ์ด์ด๋ฒ ์ด์ค๋ ์ด๋ฏธ ๋ถ์ด๋นต์ ๋ง๋ค์ด์ฃผ๋ ๊ธฐ๊ณ๋ฅผ ๊ฐ์ถ๊ณ ์์ผ๋ฉฐ, ์๋๋ค์ ๋ค์ํ ๋ง๊ณผ ํฌ๊ธฐ์ ๋ถ์ด๋นต์ ์ ํํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ถ์ด๋นต ๊ฐ๊ฒ ์ฃผ์ธ์ ํ์ด์ด๋ฒ ์ด์ค์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ๋ฐฉ์์ ๋ฐ๋ผ์๋ง ๋ถ์ด๋นต์ ์ ์กฐํ๊ณ ํ๋งคํ ์ ์์ต๋๋ค. - ๋ค๋ฅธ ๊ฐ๋ฐ ํ๋ซํผ ๋ถ์ด๋นต ๊ฐ๊ฒ :
๋ฐ๋ฉด์ ๋ค๋ฅธ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฆฐ ๋ถ์ด๋นต ๊ฐ๊ฒ๋ ๋ ๋ค์ํ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฃผ์ธ์ ์์ ๋ง์ ๊ณ ์ ํ ๋ถ์ด๋นต ๋ ์ํผ๋ฅผ ๊ฐ๋ฐํ๊ณ , ๋ถ์ด๋นต ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ์๋ฆฌ๋ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฃผ์ธ์ ์์ ๋กญ๊ฒ ๊ฐ๊ฒ๋ฅผ ์ด์ํ๊ณ , ์๋ฆฌ๋ฅผ ๋ค์ํํ์ฌ ๋ค๋ฅธ ๋ง๊ณผ ์ ํ์ ์๋๋ค์๊ฒ ์ ๊ณตํ ์ ์์ต๋๋ค.
ํ์ด์ฌ์ ์ฌ์ฉ
- ํ์ด์ฌ์ ๋ค์ํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ํ๋ ๋ฐฉ์์ผ๋ก ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค.
- ํ์ด์ฌ์ ์๋ฒ์ ๋ํ ์์ ํ ์ปจํธ๋กค์ ๊ฐ๊ฒ ๋๋ค. ์ฃผ์ธ์ ์์ ๋ง์ ๊ณ ์ ํ ๋ฐฉ์์ผ๋ก ์๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
- ํ์ด์ฌ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์๋ฒ์ ํ์ฅ์ฑ์ ์กฐ์ ํ ์ ์์ผ๋ฉฐ, ํ์์ ๋ฐ๋ผ ๋ฆฌ์์ค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์กฐ์ ํ ์ ์๋ค. ์ด๋ ๋๊ท๋ชจ ๊ธฐ์ ์ด๋ ๋ง์ ํธ๋ํฝ์ ์ฒ๋ฆฌํด์ผ ํ๋ ํ๋ก์ ํธ์์ ์ค์ํ ์์์ด๋ค.
- ํ์ด์ฌ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ๋ค๋ฅธ ์๋น์ค์์ ํตํฉ์ด๋ ์ํ๋ ๊ธฐ๋ฅ์ ๋์ฑ ์ ์ฐํ๊ฒ ๊ตฌํํ ์ ์๋ค.
5์ฃผ์ฐจ ์์ - Javascript๋ฅผ ํ์ฉํ์ฌ ๋์ ๋ฐ์ดํฐ ์์ฑํ๊ธฐ
4์ฃผ์ฐจ, 5์ฃผ์ฐจ์์ ๋ฐฐ์ด ๋ด์ฉ๋ค์ ํ์ฉํ์ฌ ์ ๊ณต๋ ์ฝ๋ ์ค ๋น ๋ถ๋ถ์ ์ฑ์ฐ๋ ์์ ์๋ค.
๋ง ๊ฐ์๋ฅผ ๋ค์ ํ๋ผ์ ์์ ๊ฐ ์๊ฒ ์์ ํ์ผ์ ๋ค์ด๋ฐ๊ณ ์ฝ๋๋ฅผ ์ด์๋ค. ํ์ง๋ง ์๋ก์ด ์ฝ๋๋ฅผ ๋ง์ฃผํ๋๊น ์ ์ ๋ด ์์ ์ด ํค๋งค๊ณ ์๋ค๋ ๊ฒ์ ๋๋ผ๊ณ ์ฐจ๊ทผ์ฐจ๊ทผ ํ๋์ฉ ํด๊ฒฐํด๋๊ฐ๋ค....
๋จผ์ Firestore Database์ ์ฐ๋ํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ์ ๋ ฅํด์ฃผ์๋ค.
<script type="module">
import { initializeApp } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-app.js";
import { getFirestore } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
import { collection, addDoc } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
import { getDocs } from "https://www.gstatic.com/firebasejs/9.22.0/firebase-firestore.js";
const firebaseConfig = {
// https://firebase.google.com/?hl=ko
// ํ์ด์ด๋ฒ ์ด์ค์ ์ ์ํ ํ ํ๋ก์ ํธ ์ค์ ์ ๋ค์ด๊ฐ๋๋ค.
// ๋ณธ์ธ firebaseConfig ๋ด์ฉ์ผ๋ก ์ค์ ํด ์ค๋๋ค.
apiKey: "",
authDomain: "",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: "",
measurementId: ""
};
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
์ด ๋ถ๋ถ์ ์์ฑํ ๋๋ง๋ค ๋ค๋ฅธ ์ฝ๋์์ ๋ณต์ฌํด์ ์ฌ์ฉํ๋ผ๊ณ ํ์
จ๋ ๊ฐ์ฌ๋์ ๋ง์ ๋ ์ฌ๋ ค ๋ฐ๋ก ์ง์ ์ ์งํํ๋ ์คํ๋ฅดํํ๋ฆญ์ค ํ๋ก์ ํธ์ ์ฝ๋์์ ๋ณต์ฌํด์ ๊ฐ์ ธ์๋ค ๐๐
์ฐ๋ํ๋ ์ฝ๋๋ฅผ ์
๋ ฅ ํ ํ์ด์ง์ ์
๋ ฅํ ๋ด์ฉ์ Database์ ์ ์ฅํ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค. ๊ธฐ๋ณธ ํ์ ์์ฑ๋์ด ์์๊ณ ์์ ๋ด์ฉ๋ฌผ๋ง ์
๋ ฅํ๋ฉด ๋๋๋ฐ.. ํ์ํ ๋ณ์๋ฅผ ์ฝ๋์์ ์ฐพ์์ ์ ์ฒด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์๋ค.
<div class="post" id="input-card">
<div class="form-floating mb-3">
<input type="email" class="form-control" id="floatingInput" placeholder="name@example.com">
<label for="floatingInput">์์ ์ด๋ฏธ์ง ์ฃผ์</label>
</div>
<div class="form-floating mb-3">
<input type="text" class="form-control" id="foodTitle" placeholder="์ํ ์ ๋ชฉ">
<label for="foodTitle">์์๋ช
</label>
</div>
<div class="input-group mb-3">
<button class="btn btn-outline-secondary" type="button">๋ณ์ </button>
<select class="form-select" id="inputGroupSelect03"
aria-label="Example select with button addon">
<option selected>๋ณ์ ์ ํ</option>
<option value="1">โญ</option>
<option value="2">โญโญ</option>
<option value="3">โญโญโญ</option>
<option value="4">โญโญโญโญ</option>
<option value="5">โญโญโญโญโญ</option>
</select>
</div>
<div class="form-floating">
<textarea class="form-control" placeholder="Leave a comment here"
id="floatingTextarea"></textarea>
<label for="floatingTextarea">์ถ์ฒ ์ด์ </label>
</div>
<div class="button2">
<button type="button" class="btn btn-danger" id="addBtn"> ๊ธฐ๋กํ๊ธฐ </button>
</div>
</div>
์ ์ฝ๋์์ ํ์ํ id๋ค์ ์ฐพ์๊ณ id๋ฅผ ํ์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์๋ค ๐๐
๊ทผ๋ฐ ์ฌ๊ธฐ์ ํ๋์ ๋ฌธ์ ์ ์ด ์์๋๋ฐ......
๋ฐ๋ก ๊ฐ์์์ ์์ฑํ๋ ์ฝ๋์ ์์ ์์ ์์ฑํด์ผ ํ๋ ์ฝ๋์ ๊ตฌ์กฐ๊ฐ ๋ฌ๋๋ค ๐ฎ๐ฎ๐ฎ ์ฒ์์ ๋ณด๊ณ ๋นํฉํ์ง๋ง ์ฝ๋์ ์ ํ์๋ ์ฃผ์์ ์ฐธ๊ณ ํ๊ณ try, catch(์์ธ ์ฒ๋ฆฌ) ๋ด์ฉ์ chatgpt๋ฅผ ํตํด ํด๊ฒฐํ ํ ํ๋ํ๋ ์ ๊ณ ๋๋ Firestore Database์ ์ ์์ ์ผ๋ก ์ ์ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค.
$("#addBtn").click(async function () {
// title_input, comment_input, image_input id๋ฅผ ๊ฐ์ง HTML ์์์์ ๊ฐ์ ๊ฐ์ ธ์์ title, comment, image ๋ณ์์ ์ ์ฅํด ์ฃผ์ธ์.
let image = $('#floatingInput').val();
let title = $('#foodTitle').val();
let comment = $('#floatingTextarea').val();
let star = $('#inputGroupSelect03').val();
try {
const docRef = await addDoc(collection(db, "foods"), {
// ๊ฐ๊ฐ ๋ด์ ๋ณ์๋ฅผ ์ปฌ๋ ์
ํ๋์ title, comment, image์ ๊ฐ๊ฐ ๋ฃ์ด์ฃผ์ธ์.
'image': image,
'title': title,
'comment': comment,
'star': star
});
alert("์์์ด ์ถ๊ฐ ๋์์ต๋๋ค!");
window.location.reload();
} catch (e) {
console.error("Error adding document: ", e);
}
});
๊ทธ ๋ค์์ ์ด์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ค์ ์ฐ๋ฆฌ ๋์ ๋ณผ ์ ์๋๋ก Database์์ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ฅผ ์์ฑํ ์ฐจ๋ก์๋ค. ์ด ๋ถ๋ถ ๋ํ ๊ธฐ๋ณธ ํ์ ์์ฑ๋์ด ์์๊ณ , ์ค์ํ ๋ถ๋ถ๋ง ๋ด๊ฐ ์ฑ์๋๊ฐ๋ฉด ๋๋ ๊ฒ์ด์๋ค.
๋๋ ๊ฐ์์์ ๋ค์๋ ๋ด์ฉ๋ค์ ๊ธฐ์ตํด๋ณด๋ฉด์ ์ฝ๋๋ฅผ ์ฑ์๋๊ฐ๊ณ ๋ฌด์ฌํ ํ์ด์ง๋ฅผ ์์ฑํ ํ ๋ฐ์ดํฐ๊ฐ ์ ๋ณด์ฌ์ง๋์ง ํ
์คํธ๊น์ง ํ ์ ์์๋ค ๐๐๐
$(".row-cols-3").empty();
const querySnapshot = await getDocs(collection(db, "foods"));
querySnapshot.forEach((doc) => {
let title = doc.data().title;
let comment = doc.data().comment;
let star = "โญ".repeat(doc.data().star);
let image = doc.data().image;
// ๋ฌธ์์ title, comment, image, star ํ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ ๋ณ์๋ช
์ ๊ฐ๊ณ ,
// tempHtml ๋ฌธ์์ด์ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ ์นด๋์ HTML ์ฝ๋๋ฅผ ์์ฑํ์ธ์.
let tempHtml = `
<div class="col">
<div class="card h-100">
<img src="${image}"
class="card-img-top" alt="...">
<div class="card-body">
<h4 class="card-title">${title}</h4>
<p class="card-text">${comment}</p>
<p>${star}</p>
<button class="card-button">์ฃผ๋ฌธํ๊ธฐ</button>
</div>
</div>
</div>`;
$(".row-cols-3").append(tempHtml);
});
์ ์ฅ๋ ๋ฐ์ดํฐ๋ค์ด ๋ชจ๋ ์ ๋ณด์ด๋ ๊ฒ์ ํ์ธํ ํ ์์ ๋ฅผ ์ ์ถํ๋ค ๐๐
+ ์ค๋ ์คํํ ๊ณํ
- SQL, ์๋ฐ ์๊ณ ๋ฆฌ์ฆ ๊ฐ๊ฐ 2๋ฌธ์ ์ฉ ํ์ด ๐
- SQL ๋ฌธ์ ๋ค์ ๋ชจ๋ ์ ์ ํ์ด๋ดค๋ ๋ฌธ์ ๋ค์ด์ฌ์ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
- ์๋ฐ ๋ฌธ์ ๋ค๋ ๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐ๋๋ ๋ฌธ์ ์ฌ์ ์ด๋ ค์ ์์ด ํด๊ฒฐํ๋ค!
- Java ์
๋ฌธ ๊ฐ์_์ค์ฝํ, ํ๋ณํ ๊ฐ์ ๋ฃ๊ธฐ ๐
- ์ค์ฝํ๋ผ๋ ๊ฐ๋ ์ ์ด๋ฒ์ ์ฒ์ ์๊ฒ ๋์๋๋ฐ, ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ๋ธ๋ก๊ทธ์ ์ ๋ฆฌํ๋ค ๋ณด๋ ๊ฐ๋ ์ ์๋ฒฝํ๊ฒ ์ดํดํ ์ ์์๋ค. ์ฝ๊ฒ ๋งํ๋ฉด ๋ณ์๊ฐ ์์กดํ ์ ์๋ ์์ญ์ ์๋ฏธํ๋ค!
- ์น ๊ฐ๋ฐ ์ข
ํฉ 5์ฃผ์ฐจ ๊ฐ์ ๋ฃ๊ธฐ ๐
- ์น ๊ฐ๋ฐ ํ Github๋ฅผ ํตํด ๋ฐฐํฌํ๋ ๊ณผ์ ๊น์ง ์ง์ ์งํํ๋ฉด์ ๋ด๊ฐ ๋ง๋ ํ์ด์ง์ ์ฃผ์๊น์ง ๋ถ๋ ๊ฑธ ํ์ธํ๋๊น ์ ๊ธฐํ๋ค.... ๋ด๊ฐ ๋ง๋ ํ์ด์ง๊ฐ ๋ค๋ฅธ ์ฌ๋๋ค๋ ํ์ธํ ์ ์๋ค๋ ๐ฎ๐ฎ๐ฎ ๊ฐ์๋ ์ ๋ถ ๋ค์์ง๋ง... ์ฃผ๋ง๋์ ์๋ณด๋ฉด ๊น๋จน์ ๊ฒ ๋ปํ๋ ๋ณต์ต์ ํ์คํ๊ฒ ํด๋ฌ์ผ๊ฒ ๋ค.......
'Today I Learned(TIL) > ์คํ๋ฅดํ ๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ณธ์บ ํ ์์๐๐๐ + Git, Github (4) | 2024.11.04 |
---|---|
4์กฐ S.A (7) | 2024.11.04 |
์น ๊ฐ๋ฐ ์ข ํฉ_4์ฃผ์ฐจ (6) | 2024.10.31 |
์น ๊ฐ๋ฐ ์ข ํฉ_3์ฃผ์ฐจ (3) | 2024.10.30 |
์น ๊ฐ๋ฐ ์ข ํฉ_2์ฃผ์ฐจ (5) | 2024.10.29 |