21.10.23 ๊ณต๋ถ€๊ธฐ๋ก๐Ÿง‘โ€๐Ÿ’ป

devduckยท2021๋…„ 10์›” 23์ผ
0
post-thumbnail

FireBase, React๋ฅผ ํ™œ์šฉํ•œ ํŠธ์œ„ํ„ฐ ํด๋ก ์ฝ”๋”ฉ๐Ÿง‘โ€๐Ÿ’ป


์˜ค๋Š˜ ์™„๋ฃŒํ•œ ๋ชฉ๋ก
1. ํŠธ์œ— ์ƒ์„ฑ ๋ฐ ํŠธ์œ— ๋ชฉ๋ก์ถœ๋ ฅ
2. ์ „๊ณต ์ˆ˜์—… ํŒ€ํ”Œ ๊ณผ์ œ..ing


const [nweet, setNweet] = useState("");
    const [nweets, setNweets] = useState([]); //  ํŠธ์œ—๋“ค์„  ์ƒํƒœ๋กœ ๋ฐ›์•„์„œ ๋ณด๊ด€ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด๋กœ usestate ์ƒ์„ฑ
    const getNweets = async ()=> {
        const q = query(collection(dbService,"nweets"));
        const querySnapshot = await getDocs(q);
        querySnapshot.forEach((doc) => {
        const nweetObj = { //nweetObj => ํŠธ์œ— ๋‚ด์šฉ 
            ...doc.data(), 
            id:doc.id,
        } 
         setNweets(prev => [nweetObj,...prev]);   
        });

ํŠธ์œ— ๋ฐ์ดํ„ฐ๋“ค์„ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•ด์•ผํ•œ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— useState()์„ ์ด์šฉํ•˜์—ฌ ํŠธ์œ— ๋ฐ์ดํ„ฐ๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ฐ›์•„ ์ €์žฅํ–ˆ๋‹ค.

ํŒŒ์ด์–ด๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ํŠธ์œ— ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ querySnapshot์„ ์ด์šฉํ–ˆ๋Š”๋ฐ, ์—ฌ๊ธฐ ์•ˆ์— ์žˆ๋Š” index์ค‘ doc๊ฐ€ ํŠธ์œ— ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— doc๋กœ ๋ฐ›์•„์™”๋‹ค.

const querySnapshot = await getDocs(q);
        querySnapshot.forEach((doc) => {
        const nweetObj = { //nweetObj => ํŠธ์œ— ๋‚ด์šฉ 
            ...doc.data(), 
            id:doc.id,
        } 

์—ฌ๊ธฐ์„œ doc(ํŠธ์œ—๊ฐฏ์ˆ˜)๊ฐ€ ๋งŒ์•ฝ 5๊ฐœ๋ฉด forEachํ•จ์ˆ˜๋Š” 5๋ฒˆ์ด ์ˆœํšŒ๊ฐ€ ๋œ๋‹ค.
์ด๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ํŠธ์œ—๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœ๋กœ ๋ณด๊ด€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“  nweets์— ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๊ธฐ ์œ„ํ•ด์„œ ์ˆœํšŒ ์ด์ „์˜ nweets์™€ ์ˆœํšŒ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฅผ[nweetObj,...prev]์ฒ˜๋Ÿผ ํ•ฉ์ณค๋‹ค.

setNweets(prev => [nweetObj,...prev]);   
        });

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ˆœํšŒ ์ด์ „์˜ nweets๋Š” setNweet์— ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜์–ด์˜ค๊ฒŒ ๋˜์„œ nweetobj(ํŠธ์œ— ๋ฐ์ดํ„ฐ)์—๋Š” ์ตœ์‹  ํŠธ์œ—์ด 0๋ฒˆ์งธ ๋ฐฐ์—ด๋กœ ์œ„์น˜ํ•˜๊ณ  ์ด์ „์— ์˜จ ํŠธ์œ—์€ 1๋ฒˆ์งธ ๋ฐฐ์—ด์— ์œ„์น˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 const nweetObj = { //nweetObj => ํŠธ์œ— ๋‚ด์šฉ 
            ...doc.data(), 
            id:doc.id,
        } 

๋˜ํ•œ nweetObj์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด querySnapshot์—์„œ ๋ถˆ๋Ÿฌ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ด€ํ–ˆ๋Š”๋ฐ ...์ด doc.data()์•ž์— ๋ถ™์€ ์ด์œ ๋Š” ES6 ์ „๊ฐœ๊ตฌ๋ฌธ์„ ์ด์šฉํ–ˆ๋‹ค.


์ „๊ฐœ๊ตฌ๋ฌธ์ด๋ž€?

์ „๊ฐœ๊ตฌ๋ฌธ์ด ์•„์ง ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ์˜ˆ์ œ๋ฅผ ์ฐพ์•„๋ณด์•˜๋Š”๋ฐ

function sum(x, y, z) {
  return x + y + z;
}

const numbers = [1, 2, 3];

console.log(sum(...numbers));
// expected output: 6

console.log(sum.apply(null, numbers));
// expected output: 6

์‰ฝ๊ฒŒ ์ •์˜ํ•˜์ž๋ฉด ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ํŽผ์ณ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ํŽผ์น  ๋Œ€์ƒ์ด ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ

const myObject1 = {
    laptop: 'MacBook Pro',
    tablet: 'iPad Pro 11'
}

const myObject2 = {...myObject1};

console.log(myObject1); // {laptop: "MacBook Pro", tablet: "iPad Pro 11"}
console.log(myObject2); // {laptop: "MacBook Pro", tablet: "iPad Pro 11"}

console.log(myObject1 === myObject2); // false

{...myObject1}๋ฅผ ๋ณด๋ฉด ์ „๊ฐœ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํŽผ์น  ๋Œ€์ƒ์ด ๋ฐฐ์—ด์ธ ๊ฒฝ์šฐ

const myArray1 = ['Canna', 'Cuzz', 'Faker', 'Teddy', 'Effort'];

const myArray2 = [...myArray1];

console.log(myArray1); // ["Canna", "Cuzz", "Faker", "Teddy", "Effort"]
console.log(myArray2); // ["Canna", "Cuzz", "Faker", "Teddy", "Effort"]

console.log(myArray1 === myArray2); // false

๋ฐฐ์—ด์„ ํŽผ์ณ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ถœ์ฒ˜ : https://bigtop.tistory.com/62 (BigTop_Log๋‹˜)


๋‹ค์‹œ ๋ณธ๋ก ์œผ๋กœ ๋Œ์•„์™€์„œ

<div> 
        {nweets.map((nweet) => (
// map ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ nweets ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ jsx๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ํŠธ์œ— ๋ฐฐ์—ด๋“ค์„ ์›น์— ๋‚˜ํƒ€๋ƒ„.
        <div key={nweet.id}>
            <h4>{nweet.nweet}</h4>
        </div>
            ))}
    </div>

์œ„ ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠธ์œ—๋ชฉ๋ก๋“ค์„ ํ™”๋ฉด์— ์ถœ๋ ฅ์‹œ์ผœ์คฌ๋‹ค.

๊ฒฐ๊ณผ ํ™”๋ฉด


์ฐธ๊ณ 

ํŒŒ์ด์–ด๋ฒ ์ด์Šค querySnapshot ์‚ฌ์šฉ๋ฒ•(https://firebase.google.com/docs/reference/node/firebase.firestore.QuerySnapshot)


์ „์ฒด ์ฝ”๋“œ

import { dbService } from 'fbase';
import React,{useState, useEffect} from "react";
import {addDoc, collection,getDocs,query} from "firebase/firestore";

const Home = () => {
    const [nweet, setNweet] = useState("");
    const [nweets, setNweets] = useState([]); //  ํŠธ์œ—๋“ค์„  ์ƒํƒœ๋กœ ๋ฐ›์•„์„œ ๋ณด๊ด€ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด๋กœ usestate ์ƒ์„ฑ
    const getNweets = async ()=> {
        const q = query(collection(dbService,"nweets"));
        const querySnapshot = await getDocs(q);
        querySnapshot.forEach((doc) => {
        const nweetObj = { //nweetObj => ํŠธ์œ— ๋‚ด์šฉ 
            ...doc.data(), // ES6 spread attribute ๊ธฐ๋Šฅ(์ „๊ฐœ๊ตฌ๋ฌธ)
            id:doc.id,
        } // ์ค‘์š”!!) querySnapShot์— ์žˆ๋Š” doc(ํŠธ์œ— ๊ฐฏ์ˆ˜)๊ฐ€ 5๊ฐœ๋ฉด forEachํ•จ์ˆ˜๋Š” 5๋ฒˆ ์ˆœํšŒ๊ฐ€ ๋จ.
        // ์ด๋•Œ nweets์— ํŠธ์œ— ๋ฐ์ดํ„ฐ๋ฅผ ์Œ“๊ณ  ์‹ถ์œผ๋ฉด ์ˆœํšŒ ์ด์ „์˜ nweets์™€ ์ˆœํšŒ์ค‘์ธ ๋ฐ์ดํ„ฐ๋ฅผ [nweetObj,...prev]์ฒ˜๋Ÿผ ํ•ฉ์นจ.
         setNweets(prev => [nweetObj,...prev]);   
         // ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ˆœํšŒ ์ด์ „์˜ nweets๋Š” setNweet์— ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ํ•จ์ˆ˜์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜์–ด์˜ค๊ฒŒ๋จ.
         // ์ฆ‰ nweetobj์—๋Š” ์ตœ์‹  ํŠธ์œ—์ด 0๋ฒˆ์งธ ๋ฐฐ์—ด๋กœ ์œ„์น˜ํ•˜๊ณ  ์ด์ „์— ์˜จ ํŠธ์œ—์€ 1๋ฒˆ์งธ ๋ฐฐ์—ด์— ์œ„์น˜ํ•˜๊ฒŒ ๋จ.
        });
    };
    useEffect(() => {
        getNweets();
    
    }, [])
    const onSubmit = async (e) => {
        try{
        e.preventDefault();
        const docRef = await addDoc(collection(dbService, "nweets"),
            {
            nweet,
            createdAt: Date.now(),
        }); // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ 
        console.log("Document Written with Id:", docRef.id);
        }catch(error){
            console.log("Error adding document", error)
        }

        setNweet("");
    };
    const onChange = (event) =>{
        const {target : {value},
        }= event;
        setNweet(value);
    };
    console.log(nweets);

return (
 <>   
<div>
    <form onSubmit={onSubmit}>
        <input value={nweet} onChange={onChange} type = "text" placeholder ="what's on your mind" maxLength={120} />
        <input type="submit" value="nweet"/>
    </form>
    <div> 
        {nweets.map((nweet) => (
// map ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ nweets ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ jsx๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์„œ ํŠธ์œ— ๋ฐฐ์—ด๋“ค์„ ์›น์— ๋‚˜ํƒ€๋ƒ„.
        <div key={nweet.id}>
            <h4>{nweet.nweet}</h4>
        </div>
            ))}
    </div>
</div>
</>
    );
};



export default Home;

์ด๋ฒˆ ์ฃผ๋Š” ํ•™๊ต ์ „๊ณต์ˆ˜์—… ํŒ€ ํ”„๋กœ์ ํŠธ ๋•๋ถ„์— ๊ฐœ์ธ ์›น ๊ณต๋ถ€๋ฅผ ๋งŽ์ด ๋ชปํ–ˆ๋‹ค.. ๋‚ด์ผ์€ ์ฃผ๋ง์ด๋‹ˆ๊นŒ ๊ฐœ์ธ ์ค‘๊ฐ„ ๋ณด๊ณ ์„œ ๊ณผ์ œ๋ฅผ ์–ผ๋ฅธ ๋๋‚ด๊ณ  ๋ฆฌ์•กํŠธ ๊ณต๋ถ€๋ฅผ ํ•ด์•ผ๊ฒ ๋‹ค..

์ฒ˜์Œ์œผ๋กœ ํ…์„œํ”Œ๋กœ์šฐ๋ฅผ ๊ฑด๋“ค์—ฌ๋ณด๋‹ˆ ์ •๋ง ์–ด๋ ต๊ณ  ์–ด์ง€๋Ÿฌ์šด ํ•™๋ฌธ์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋๋‹ค.. ๋‚˜๋Š” ๋จธ์‹ ๋Ÿฌ๋‹์ชฝ์ด๋ž‘์€ ์™„์ „ํžˆ ์•ˆ ๋งž๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฒˆ ํ•™๊ธฐ๋™์•ˆ ๋‚ด๋‚ด ๋Š๋ผ๊ณ  ์žˆ๋‹ค..๐Ÿ˜ต

๋ฆฌ์•กํŠธ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ES6 ๋ฌธ๋ฒ•์„ ์กฐ๊ธˆ ๋” ์ตํžˆ๊ณ  ๊ณต๋ถ€ํ–ˆ์œผ๋ฉด ๋” ์ข‹์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.. ๊ณต๋ถ€ํ• ๊ฒŒ ์‚ฐ๋”๋ฏธ์ธ๋ฐ ํฐ์ผ์ด๋‹ค ใ…Žใ…Ž,,

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