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

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

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


์˜ค๋Š˜ ์™„๋ฃŒํ•œ ๋ชฉ๋ก
1. uuid ์—๋Ÿฌ ํ•ด๊ฒฐ
2. ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์Šคํ† ๋ฆฌ์ง€์— ์‚ฌ์ง„ ์ €์žฅ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
3. ํŠธ์œ— ์‚ญ์ œ์‹œ ์Šคํ† ๋ฆฌ์ง€์—์„œ ์‚ญ์ œํ•˜๊ธฐ


1. uuid ์—๋Ÿฌ ํ•ด๊ฒฐ

๋จผ์ € uuid ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š”,
์Šคํ† ๋ฆฌ์ง€๋Š” ํŒŒ์ด์–ด์Šคํ† ์–ด์™€ ๋‹ค๋ฅด๊ฒŒ ๋ฌธ์„œ์— ์•„์ด๋””๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค.
๊ณ ์œ  ์‹๋ณ„์ž๋ฅผ ๋งŒ๋“ค์–ด ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅํ•  ๋ฐ์ดํ„ฐ์— ์ง์„ ์ง€์–ด์ค˜์•ผ ํ•˜๋Š”๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค ๊ณ ์œ ์‹๋ณ„์ž๋ฅผ
๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์„ uuid ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.

uuid๋Š” ๋ฒ„์ „์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ๋ฐ,


Create a UUID (ES6 module syntax)

import { v4 as uuidv4 } from 'uuid';
uuidv4(); // โ‡จ '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d'

(uuid ๊ณต์‹ ๋ฌธ์„œ https://github.com/uuidjs/uuid)


๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์ €๋Ÿฐ ์‹์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๊ณ  ๋˜์–ด์žˆ์—ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋˜‘๊ฐ™์ด import๋ฅผ ํ•ด์คฌ์ง€๋งŒ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๊ณ  ์ฒ˜์Œ์—๋Š” uuid ์„ค์น˜๊ฐ€ ์ž˜๋ชป๋๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ
์ด๊ฒƒ ์ €๊ฒƒ ๊ฑด๋“ค๋‹ค๊ฐ€ ์™„์ „ ๋…ธ๋“œ๋ชจ๋“ˆ ์ „์ฒด๊ฐ€ ์—‰์ผœ๋ฒ„๋ ธ๋‹ค..ใ…Žใ…Ž

๊ฒฐ๋ก ์ ์œผ๋กœ ๋‚ด๊ฐ€ ๋ฐœ๊ฒฌํ•œ ๋ฐฉ๋ฒ•์€ ์™„์ „ํžˆ ๋‹ฌ๋ž๋‹ค..

import {v4} from 'uuid';

v4();

์•„์ง๊นŒ์ง€ ์ด๊ฒŒ ์™œ ์ด๋ ‡๊ฒŒ ์ž‘๋™๋œ์ง€๋Š” ์ •ํ™•ํžˆ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ๋‘˜๋Ÿฌ๋ด๋„ ๋‹ต์ด ์•ˆ ๋‚˜์™€์„œ
ํ˜ผ์ž ์ด๊ฒƒ์ €๊ฒƒ ๊ฑด๋“ค์ด๋‹ค ๋ณด๋‹ˆ๊นŒ ์ž‘๋™์ด ๋๋‹ค...

๋ญ.. ์ผ๋‹จ ๋์œผ๋‹ˆ๊นŒ ๋‹ค์Œ์— ์—ฌ์œ ๊ฐ€ ์žˆ์„ ๋•Œ uuid์— ๋Œ€ํ•ด ๋” ์ž์„ธํ•˜๊ฒŒ ๊ณต๋ถ€ํ•ด๋ด์•ผ๊ฒ ๋‹ค.


2. ํŒŒ์ด์–ด๋ฒ ์ด์Šค ์Šคํ† ๋ฆฌ์ง€์— ์‚ฌ์ง„ ์ €์žฅ ๋ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

์Šคํ† ๋ฆฌ์ง€๋ž€?

์Šคํ† ๋ฆฌ์ง€๋Š” ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์ปดํ“จํ„ฐ ํ•˜๋“œ๋””์Šคํฌ๋ž‘ ๋น„์Šทํ•˜๋‹ค.
ํ•˜๋“œ๋””์Šคํฌ์— ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค.
๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Šคํ† ๋ฆฌ์ง€์— ์‚ฌ์šฉ์ž์•„์ด๋””(ํด๋”)๋ฅผ ๋งŒ๋“ค๊ณ  uuid(ํŒŒ์ผ ์ด๋ฆ„)์„ ์ •ํ•ด ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋จผ์ € ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ด์–ด๋ฒ ์ด์Šค ํŒŒ์ผ์—์„œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ import ํ•ด์•ผํ–ˆ๋‹ค.

fbase.js

import {getStorage} from "firebase/storage";

export const storageService = getStorage();

์Šคํ† ๋ฆฌ์ง€๋ฅผ import ํ•ด์ฃผ๊ณ  ๋‹ค๋ฅธ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ export ์ฒ˜๋ฆฌํ•ด์คฌ๋‹ค.

Home.js

๊ธฐ์กด ์ฝ”๋“œ

 const onSubmit = async (e) => {
        try{
        e.preventDefault();
        const docRef = await addDoc(collection(dbService, "nweets"),
            {
            nweet,
            createdAt: Date.now(),
            creatorId : userObj.uid, // db์— ์œ ์ €์•„์ด๋”” ์ถ”๊ฐ€
        }); // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ 
        console.log("Document Written with Id:", docRef.id);
        }catch(error){
            console.log("Error adding document", error)
        }

        setNweet("");
    };

์ˆ˜์ • ํ›„ ์ฝ”๋“œ

// ์ƒ๋žต
import { storageService } from 'fbase';
const onSubmit = async (e) => {
        
        e.preventDefault();
        let attachmentUrl =""
        if(attachment !== ""){
            const attachmentRef = ref(storageService, `${userObj.uid}/${v4()}`);
            const response = await uploadString(attachmentRef, attachment, "data_url");
            console.log(getDownloadURL(response.ref));
            attachmentUrl = await getDownloadURL(response.ref);
        }
        const nweetObj = {
            nweet,
            createdAt: Date.now(),
            creatorId : userObj.uid, // db์— ์œ ์ €์•„์ด๋”” ์ถ”๊ฐ€
            attachmentUrl
        }
        await addDoc(collection(dbService, "nweets"),(nweetObj)); 
        setNweet("");
        setAttachment("");

    };

์Šคํ† ๋ฆฌ์ง€์—์„œ ์‚ฌ์ง„์„ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด์˜ ์ฝ”๋“œ์—์„œ ์ˆ˜์ •์ด ํ•„์š”ํ–ˆ๋‹ค.

const attachmentRef = ref(storageService, `${userObj.uid}/${v4()}`);

์œ„์— ์žˆ๋Š” ์ฝ”๋“œ๋Š” ์Šคํ† ๋ฆฌ์ง€, ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๋‚˜์„œ ์‚ฌ์šฉ์ž์˜ ์•„์ด๋””๋ฅผ ํด๋”์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ ํ›„ ํŒŒ์ผ ์ด๋ฆ„์„ v4(uuid)๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.

์ด์ œ ํŒŒ์ผ ํด๋”๋ฅผ ๋งŒ๋“ค์–ด์คฌ์œผ๋‹ˆ ์ €์žฅ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

const response = await uploadString(attachmentRef, attachment, "data_url");

์ €์žฅ๊ธฐ๋Šฅ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” uploadString ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

์ด์ „ ๋ฒ„์ „์—์„œ๋Š” putString ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๋ฒ„์ „์ด ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜๋ฉด์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค.
(์‚ฌ์šฉ๋ฌธ์„œ https://modularfirebase.web.app/common-use-cases/storage/#upload-a-string)

์—ฌ๊ธฐ์„œ attachmentRef๋Š” ์•„๊นŒ ๋งŒ๋“  ํŒŒ์ผํด๋”์ด๋‹ค. ์‚ฌ์ง„ํŒŒ์ผ์˜ URL์€ attachment์— ์ €์žฅ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ํŒŒ์ผํด๋”์™€ ํŒŒ์ผURL์„ ๋„ฃ์–ด์ค˜ ํŒŒ์ผ์— ์‚ฌ์ง„์„ ์ €์žฅํ–ˆ๋‹ค.

๋‹ค์Œ์€ ์‚ฌ์ง„์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋‹ค

์‚ฌ์ง„์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ์œ„ํ•ด์„œ response.ref.getDownloadURL()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์•„๊นŒ ์‚ฌ์ง„ ์ €์žฅ ์ฝ”๋“œ๋ฅผ response ๋ณ€์ˆ˜์— ๋„ฃ์–ด์ฃผ๊ณ 

attachmentUrl = await getDownloadURL(response.ref);

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  attachmentUrl์— ์ €์žฅํ•ด์คฌ๋‹ค.

(์‚ฌ์šฉ๋ฒ•)

  const nweetObj = {
           nweet,
           createdAt: Date.now(),
           creatorId : userObj.uid, // db์— ์œ ์ €์•„์ด๋”” ์ถ”๊ฐ€
           attachmentUrl
       }

๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ์œ„ํ•ด attachmentUrl์„ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค.

์ด์ œ ๋ถˆ๋Ÿฌ์˜จ ์‚ฌ์ง„ํŒŒ์ผ์„ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด์ฃผ๊ธฐ ์œ„ํ•ด img์—˜๋ฆฌ๋จผํŠธ ์†์„ฑ์— nweetObj.attachmentUrl๋ฅผ ์ถ”๊ฐ€ํ•ด์คฌ๋‹ค.

nweet.js

	 <>
          <h4>{nweetObj.nweet}</h4>
          {nweetObj.attachmentUrl &&(
               <img src  ={nweetObj.attachmentUrl} alt='~' width="50px" height="50px" />
          )}
          {isOwner && (
              <>
                  <button onClick={onDeleteClick}>Delete tweet</button>
                  <button onClick={toggleEditing}>Edit Nweet</button>            
              </>
          )}
          </>

์ด์ œ ์ „์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ๋‹ค๋“ฌ์–ด์ค˜์•ผํ•œ๋‹ค.

๋จผ์ €

if(attachment !== ""){
            const attachmentRef = ref(storageService, `${userObj.uid}/${v4()}`);
            const response = await uploadString(attachmentRef, attachment, "data_url");
            console.log(getDownloadURL(response.ref));
            const attachmentUrl = await getDownloadURL(response.ref);
        }
        const nweetObj = {
            nweet,
            createdAt: Date.now(),
            creatorId : userObj.uid, // db์— ์œ ์ €์•„์ด๋”” ์ถ”๊ฐ€
            attachmentUrl
        }

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ attachmentUrl์„ if๋ฌธ ์•ˆ์—์„œ ์ •์˜ํ•˜๊ฒŒ ๋˜๋ฉด if๋ฌธ์•ˆ์—์„œ๋งŒ ์ฐธ์กฐ๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋œ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— let์„ ์ด์šฉํ•˜์—ฌ if๋ฌธ ๋ฐ–์—์„œ ๋”ฐ๋กœ ์ •์˜ํ•ด์คฌ๋‹ค.

์ˆ˜์ • ํ›„

 e.preventDefault();
        let attachmentUrl =""
        if(attachment !== ""){
            const attachmentRef = ref(storageService, `${userObj.uid}/${v4()}`);
            const response = await uploadString(attachmentRef, attachment, "data_url");
            console.log(getDownloadURL(response.ref));
            attachmentUrl = await getDownloadURL(response.ref);
        }

if๋ฌธ ์ „์— ์ •์˜๋ฅผ ํ•ด์ค˜ ์ „์ฒด์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ฝ”๋“œ๋ฅผ ๋ฐ”๊ฟ”์คฌ๋‹ค.

๊ตฌํ˜„ ์งค


3. ํŠธ์œ— ์‚ญ์ œ์‹œ ์Šคํ† ๋ฆฌ์ง€์—์„œ ์‚ญ์ œํ•˜๊ธฐ

ํ˜„์žฌ ํŠธ์œ— ๊ธ€์€ ํŒŒ์ด์–ด์Šคํ† ์–ด์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œํ•ด๋„ ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋œ ํŒŒ์ผ์€ ๊ทธ๋Œ€๋กœ ์žˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” ํŒŒ์ด์–ด์Šคํ† ์–ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” deleteObject ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

nweet.js

const NweetTextRef = doc(dbService,"nweets", `${nweetObj.id}`); 
  const NweetImageRef = ref(storageService, nweetObj.attachmentUrl);
  // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํŠธ์œ—์˜ ์•„์ด๋””๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ.

  const onDeleteClick = async () => { // ํŠธ์œ— ์‚ญ์ œ ํ•จ์ˆ˜
      const ok = window.confirm("Are you sure you want to delete this tweet?");        
      if(ok){
         await deleteDoc(NweetTextRef); // ํŠธ์œ— ๊ธ€ ์‚ญ์ œ๊ธฐ๋Šฅ
         await deleteObject(NweetImageRef); // ํŠธ์œ— ์ด๋ฏธ์ง€ ์‚ญ์ œ
      };

๋จผ์ € ์ด๋ฏธ์ง€์˜ url์„ ์ฐพ์•„์•ผํ–ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์•„๊นŒ ์ด๋ฏธ์ง€ url์„ ์ €์žฅํ•ด๋†จ๋˜ attachmentUrl์„ ์ด์šฉํ–ˆ๋‹ค.
ํŒŒ์ด์–ด๋ฒ ์ด์Šค์˜ ref() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ฝ์–ด NweetImageRef์— ์ €์žฅํ•ด์คฌ๊ณ ,
deleteObject ํ•จ์ˆ˜์— ๋„ฃ์–ด์คฌ๋‹ค.

๊ตฌํ˜„ ์งค


์˜ค๋Š˜ ๊ฒฐ๋ก 

์ƒ๊ฐ๋ณด๋‹ค ์˜ค๋Š˜ ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค.. ์ด๋ฒˆ ๋‹ฌ ์•ˆ์— ๋งŒ๋“œ๋Š”๊ฒŒ ๋ชฉํ‘œ์˜€์ง€๋งŒ ํ•™๊ต ๊ณผ์ œ๋ž‘ ์ˆ˜์—… ๋“ฑ ์ด๊ฒƒ์ €๊ฒƒ์œผ๋กœ ๋งŽ์ด ๋ฐ€๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค!
๋นจ๋ฆฌ ๋ถ€์ง€๋Ÿฐํžˆ ํ•ด์„œ ๋๋‚ด์•ผ๊ฒ ๋‹ค.

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