๐Ÿ”ฅ Firestore ์ด์šฉํ•˜๊ธฐ (ํŒ€ํ”„๋กœ์ ํŠธ 2์ผ์ฐจ)

๋ฆผ๋ฏผ์ง€ยท2025๋…„ 2์›” 19์ผ

Today I Learn

๋ชฉ๋ก ๋ณด๊ธฐ
3/62

ํŒ€ ํŽ˜์ด์ง€์— ๊ฒŒ์‹œ๊ธ€์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, firebase์—์„œ ๊ฒŒ์‹œ๊ธ€ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ์™€ ๋Œ“๊ธ€ ๊ด€๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค!


๐Ÿ”ฅ Firebase ์„ธํŒ…

1. firebase ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ


firebase ์ฝ˜์†”์—์„œ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ด TeamIntroduction์ด๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ–ˆ๋‹ค.

2. ํ”„๋กœ์ ํŠธ ๊ธฐ์ดˆ ์„ธํŒ…ํ•˜๊ธฐ


์˜ค๋ฅธ์ชฝ ๋ฐ”์— ์žˆ๋Š” firestore Database์— ๋“ค์–ด๊ฐ€ ๊ธฐ์ดˆ ์„ธํŒ…์„ ํ•˜์ž
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ด seoul์„ ์„ ํƒํ•˜๊ณ  ์ƒ์„ฑํ•œ๋‹ค.


๊ทธ๋ฆฌ๊ณ  ๊ทœ์น™์—์„œ false๋ฅผ true๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค


ํ”„๋กœ์ ํŠธ ์„ค์ •์— ๋“ค์–ด๊ฐ„๋‹ค

sdk ์„ค์ •์„ ๊ตฌ์„ฑ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.
๋‚˜์ค‘์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ, ์ด ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๋„ฃ์œผ๋ฉด firestore Database๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค!

๐Ÿ”ฎ ์ฝ”๋“œ ์„ธํŒ…ํ•˜๊ธฐ

1. ๊ธฐ๋ณธ ์„ธํŒ…

html ์ฝ”๋“œ์˜ <script> ๋ฅผ <script type="module"> ๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ์ž
๊ทธ๋ฆฌ๊ณ  ์ œ์ด์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ•„ํžˆ ๋„ฃ์ž!(์•ˆ๋„ฃ์—ˆ๋‹ค๊ฐ€ ์™œ ์•ˆ๋˜๋Š”์ง€ ํ•œ์ฐธ ๊ณ ๋ฏผํ–ˆ๋‹ค..)

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>

2. Firestore ์ฝ”๋“œ ์‚ฝ์ž…ํ•˜๊ธฐ

Firestore์˜ ๊ธฐ๋ณธ ์„ธํŒ… ์ฝ”๋“œ ์ค€๋น„!

// 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";


// Firebase ๊ตฌ์„ฑ ์ •๋ณด ์„ค์ •
const firebaseConfig = {
        ๋ณธ์ธ ์„ค์ • ๋‚ด์šฉ ์ฑ„์šฐ๊ธฐ 
};


// Firebase ์ธ์Šคํ„ด์Šค ์ดˆ๊ธฐํ™”
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);

"Firebase ๊ตฌ์„ฑ ์ •๋ณด ์„ค์ •" ์—ฌ๊ธฐ์—๋‹ค๊ฐ€ ์•„๊นŒ ์šฐ๋ฆฌ์˜ Firestore์— ์žˆ๋˜ SDK ๊ตฌ์„ฑ ์ฝ”๋“œ(api key ๋“ค์–ด์žˆ๋Š”)๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค!

์ด์ œ ์ค€๋น„๋Š” ๋๋‚ฌ๋‹ค! ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋ณด์ž

โœจ ์ฝ”๋“œ ์ ์šฉํ•˜๊ธฐ

1. addDoc

addDoc์„ ์‚ฌ์šฉํ•˜๋ฉด, firestore base์— ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.
์˜ˆ์‹œ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์•Œ์•„๋ณด์ž

$("#postingbtn").click(async function () {
        let isValid = true;

        let title = $("#title").val();
        let content = $("#content").val();
        let link = $("#link").val();
        let file = $("#file")[0].files.length;
        //Firestore ์ €์žฅํ•˜๊ธฐ
        let doc = {
            'title': title,
            'content': content,
            'link': link,
            'file': file
        };
        await addDoc(collection(db, "postings"), doc);
        alert('์ €์žฅ ์™„๋ฃŒ!');
        window.location.reload();
      });

์•„๋ž˜ body ์•ˆ์— ์žˆ๋Š” div์˜ ์š”์†Œ์˜ id๊ฐ€ "#postingbtn"์ธ ๊ณณ์— ์ ์šฉ์ด ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ ๊ฑฐ๊ธฐ์—์„œ id์— ๋งž๋Š” ๋ณ€์ˆ˜๋“ค์„ let์„ ํ™œ์šฉํ•ด ์ €์žฅํ•œ๋‹ค
doc์ด๋ผ๋Š” Dictionary๋ฅผ ํ™œ์šฉํ•ด ์š”์†Œ๋“ค์„ ์ €์žฅํ•ด์ฃผ๊ณ ,
์ด๋ฅผ await addDoc(collection(db, "postings"), doc); firestore์˜ ์ฝœ๋ž™์…˜์—์„œ postings๋ผ๋Š” ์ด๋ฆ„์˜ db์— doc์„ ์ €์žฅํ•œ๋‹ค. ๋ผ๋Š” ๋œป์„ ๊ฐ€์ง„ ์ฝ”๋“œ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿซถ ์ด๋ฏธ์ง€ file์„ url๋กœ ์ €์žฅํ•˜๊ธฐ

๊ทธ๋ฆฌ๊ณ  ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผํ•˜๋ฏ€๋กœ

// ํŒŒ์ผ URL ์ƒ์„ฑ
                    let fileURL = "";
                    if (file) {
                        let reader = new FileReader();
                        reader.onload = function (e) {
                            fileURL = e.target.result;  // data URL ํ˜•ํƒœ๋กœ ํŒŒ์ผ์˜ URL์„ ๊ฐ€์ ธ์˜ด
                            console.log("ํŒŒ์ผ URL:", fileURL);

                            // Firestore์— ๋ฐ์ดํ„ฐ ์ €์žฅ
                            let doc = {
                                'title': title,
                                'content': content,
                                'link': link,
                                'fileURL': fileURL // ํŒŒ์ผ URL์„ Firestore์— ์ €์žฅ
                            };

                            addDoc(collection(db, "postings"), doc)
                                .then(() => {
                                    alert('์ €์žฅ ์™„๋ฃŒ!');
                                    window.location.reload();
                                })
                                .catch((error) => {
                                    console.error("์—๋Ÿฌ ๋ฐœ์ƒ: ", error);
                                    alert("์ €์žฅ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ");
                                });
                        };
                        reader.readAsDataURL(file);  // ํŒŒ์ผ์„ ์ฝ์–ด์„œ data URL๋กœ ๋ณ€ํ™˜
                    }
fileURL = e.target.result; 

์š” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜ํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ €์žฅ๋œ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

2. getDoc

์ด์ œ ์ €์žฅํ–ˆ์œผ๋‹ˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค!
๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์™€์•ผํ•œ๋‹ค. postings๋กœ ๋งŒ๋“ค์–ด ๋ถˆ๋ €์œผ๋‹ˆ postings์— ์žˆ๋Š” db๋ฅผ ๊บผ๋‚ด๋ณด์ž

let docs = await getDocs(collection(db, "postings"));

๊ฐ๊ฐ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•ด์ฃผ์ž

docs.forEach((doc) => {
                let row = doc.data();
                console.log(row);
                let link = row['link'];
                let title = row['title'];
                let content = row['content'];
                let fileURL = row['fileURL'];

๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ํŽ˜์ด์ง€์— ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์œผ๋‹ˆ๊นŒ ์ด ๋กœ์ง๋„ ์ถ”๊ฐ€ํ•ด๋ด…์‹œ๋‹ค

let temp_html =
                    `<div class="col">
              <div class="card h-100">
                <img src="${fileURL}">
                <div class="card-body">
                  <h5 class="card-title">${title}</h5>
                  <p class="card-text">${content}</p>
                </div>
                <div class="card-footer">
                  <small class="text-body-secondary">${link}</small>
                </div>
              </div>
            </div>
            `
            $("#card").append(temp_html);
            });

temp_html ๋ณ€์ˆ˜์— ํ˜•์‹์— ๋งž์ถ”์–ด ์•„๊นŒ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ ,
body>์— ์žˆ๋Š” ๋‚ด๊ฐ€ ๋„ฃ๊ณ ์‹ถ์€ ๋ถ€๋ถ„์˜ div์— id์ด๋ฆ„์„ ์ด๋ ‡๊ฒŒ $("#card")๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ์™„์„ฑ!

์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค๐Ÿ‘

0๊ฐœ์˜ ๋Œ“๊ธ€