
์ด์ Firebase Storage์ bucket์ ํ์ผ์ ์
๋ก๋ํด๋ณด์.
์ด๋ฅผ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๊ฐ ํ์ํ๋ค.
Firebase Storage ์ ์
ํ์ผ ์์น์ ๋ํ reference ๋ง๋ค๊ธฐ
ref()
ํ์ผ ๋ฐ์ดํฐ๋ฅผ ๊ทธ reference๋ก ์
๋ก๋ํ๊ธฐ
UploadString(ref, value, format);
๊ทธ ์ ์ routers/Home.js์ onSubmit ๋ฆฌ์ค๋์์ ํธ์(๋คํ๋จผํธ)์ ์ปฌ๋ ์
์ ์ถ๊ฐํ๋ ๋ถ๋ถ์ ์ฃผ์์ฒ๋ฆฌ(์ฃผ์ ์ฒ๋ฆฌ ์ํ๋ ์ฝ๋ ๋ธ๋ฝ ์ค์ ํ, Option + Shift + A)ํ์.
์ฌ์ง์ ๋จผ์ ์ ๋ก๋ํ๊ณ ๋์ ํธ์์ ์ ๋ก๋ ํ ์ ์๋๋ก ์ผ๋จ ์ฃผ์ ์ฒ๋ฆฌํด ๋์.
const onSubmit = async (event) => {
event.preventDefault();
//ํธ์ํ๊ธฐ ๋๋ฅด๋ฉด ์๋ก์ด document ์์ฑํ๊ธฐ
/* try {
await addDoc(collection(dbService, "tweets"), {
//ํธ์ ์์ฑ์
creatorId: userObj.uid,
text: tweet, //tweet(value๋ก tweet state ๊ฐ)
createdAt: serverTimestamp(), //Date.now(),๋ก ํด๋ ๋์ง๋ง ์ด์ ์๋๊ฑฐ ํจ ์จ๋ณด์(ํ์์กด ๋๋ถ์3 = ์์ธ๋ก ์ค์ ๋์ด ์์)
});
//console.log("Document written with ID: ", docRef.id);
} catch (error) {
console.error("Error adding document: ", error);
}
//state ๋น์์ form ๋น์ฐ๊ธฐ
setTweet(""); */
};
//Firebase Web v.9
//์ฐธ๊ณ : https://firebase.google.com/docs/web/modular-upgrade#refactor_to_the_modular_style
//Follow this pattern to import other Firebase services
//import { } from 'firebase/<service>';
//ํ์ด์ด๋ฒ ์ด์ค์์ ์คํ ๋ฆฌ์ง ๊ฐ์ ธ์ค๊ธฐ
import { getStorage } from "firebase/storage";
//์คํ ๋ฆฌ์ง(์ฌ์ง ์
๋ก๋) ๋ด๋ณด๋ด๊ธฐ
export const storageService = getStorage();
firebase.storage.Reference(๋ ํผ๋ฐ์ค)๋?
- ํ์ผ์ ์ ๋ก๋ํ๊ฑฐ๋, ๋ค์ด๋ก๋ํ๊ฑฐ๋, ํ์ผ์ ์ญ์ ํ๊ฑฐ๋, ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ์ ๋ฐ์ดํธํ๋ ค๋ฉด,
์์ ํ ํ์ผ์ ๋ํ reference๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
- reference๋ ํด๋ผ์ฐ๋์ ํ์ผ์ ๋ํ ํฌ์ธํฐ๋ก ์๊ฐํ ์ ์๋ค.
- reference๋ ๊ฐ๋ณ๊ธฐ ๋๋ฌธ์ ํ์ํ ๋งํผ ๋ง๋ค ์ ์์ผ๋ฉฐ ์ฌ๋ฌ ์์ ์ ์ฌ์ฌ์ฉํ ์๋ ์๋ค.
- ๋ ํผ๋ฐ์ค ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- reference๋ฅผ ์์ฑํ๋ ค๋ฉด
getStorage()๋ฅผ ์ฌ์ฉํ์ฌ ์คํ ๋ฆฌ์ง ์๋น์ค ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์จ ๋ค์, ์๋น์ค๋ฅผ ์ธ์๋ก ์ฌ์ฉํ์ฌref()๋ฅผ ํธ์ถํ๋ค.- ์ด reference๋ ๋ด ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๋ฒํท์ ๋ฃจํธ๋ฅผ ๊ฐ๋ฆฌํจ๋ค(points).
- ์์
//v.9 import { getStorage, ref } from "firebase/storage"; //๋ด ์คํ ๋ฆฌ์ง ๋ฒํท์ references๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์คํ ๋ฆฌ์ง ์๋น์ค์ ๋ํ reference ๊ฐ์ ธ์ค๊ธฐ const storage = getStorage(); // // ๐ฅ ๋ด ์คํ ๋ฆฌ์ง ์๋น์ค์์ ์คํ ๋ฆฌ์ง reference ์์ฑํ๊ธฐ const storageRef = ref(storage); // // ๐ฅ ํ์ ์ฐธ์กฐ(child references) ์์ฑํ๊ธฐ const imagesRef = ref(storage, 'images'); // imagesRef๋ ์ด์ 'images'๋ฅผ ๊ฐ๋ฆฌํจ๋ค. // // ๐ฅ ํ์ ์ฐธ์กฐ(child references)๋ '/'๋ก ๊ตฌ๋ถ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค. const spaceRef = ref(storage, 'images/space.jpg'); // spaceRef๋ ์ด์ "images/space.jpg"๋ฅผ ๊ฐ๋ฆฌํจ๋ค. // images Ref๋ ์ฌ์ ํ "images"๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
ref()
:๊ตฌ๊ธ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ์ค๋ธ์ ํธ = bucket์ ๋ํ ์ฐธ์กฐ(reference)๋ฅผ ๋ํ๋ธ๋ค.
๊ฐ๋ฐ์๋ค์ ์ค๋ธ์ ํธ๋ฅผ ์ ๋ก๋/๋ค์ด๋ก๋/์ญ์ ํ ์ ์๋ค.
์ฌ์ง ํ์ผ์ ์ฒจ๋ถํ์ฌ ์ ๋ก๋ํ๋ฉด, ๊ทธ ํ์ผ์ ๋ฐ์ดํฐ url์ ๋ฐ์์ ํธ์์ ๋ฐ์ดํฐ url์ ์ถ๊ฐํด์ผ ํ๋ค.
์ด๋ฅผ ์ํด ref()๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
const fileRef = ref(storage,`์คํ ๋ฆฌ์ง์๋น์ค์ ์
๋ก๋๋ ํ์ผ์ path`);
์ฐธ์กฐ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋คํ๋จผํธ ์ปฌ๋ ์
๋ง๋ค ๋๋ ๋น์ทํ๋ค. ๋คํ๋จผํธ ์ด๋ฆ ์ ํ ์ ์์๋ฏ์ด ํ์ผ์ด ์
๋ก๋๋ ํด๋ ์ด๋ฆ์ ์ ํ ์ ์๋ค.
(ํ์ ์ฐธ์กฐ(child references)๋ '/'๋ก ๊ตฌ๋ถ๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ์ ์๋ค.)
${userObj.uid} ๋ณ๋ก ๋ง๋ค๋๋ก ์ค์ ํ์.๋ํ ์ฒจ๋ถํ์ผ์ด ์ ๋ก๋ ๋ ๋ ์ด๋ฆ์ ์ ํ ์ ์๋๋ฐ, ์ด๋ ์๋ณ์(id)๋ฅผ ๋๋ค์ผ๋ก ์์ฑํด์ฃผ๋ ํจํค์ง๋ฅผ ํ์ฉํ์.
npm i uuid๋ก uuid ํจํค์ง๋ฅผ ์ค์นํ๋ค.import { v4 as uuidv4 } from "uuid";๋ก uuid๋ฅผ ๊ฐ์ ธ์จ๋ค.uuidv4() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ๋ช
์๋ณ์๋ฅผ ๋๋ค์ผ๋ก ์์ฑํ์. const fileRef = ref(storageService, `${userObj.uid}/${uuidv4()}`);
// ์๋ณ์ ์๋ ์์ฑํด์ฃผ๋ uuid
import { v4 as uuidv4 } from "uuid";
// storageService ๊ฐ์ ธ์ค๊ธฐ
import { dbService, storageService } from "fbase";
// ref() ๊ฐ์ ธ์ค๊ธฐ
import { ref } from "@firebase/storage";
//
const onSubmit = async (event) => {
event.preventDefault();
//file ๋ ํผ๋ฐ์ค ์์น = ํ์ด์ด๋ฒ ์ด์ค ์คํ ๋ฆฌ์ง > user๋ณ ํด๋ > ์
๋ก๋ํ ๋ ๋๋ค์ผ๋ก ์์ฑ๋ id์๋ณ์
const fileRef = ref(storageService, `${userObj.uid}/${uuidv4()}`);
//
์ด๋ ๊ฒ file ๋ ํผ๋ฐ์ค ์์น๋ฅผ ์ฐธ๊ณ ํ ์ ์๋๋ก ์ค์ ํ๋ฉด ๋๋ค.
ํ์ด์ด๋ฒ ์ด์ค ์คํ ๋ฆฌ์ง > user๋ณ ํด๋ > ์
๋ก๋ํ ๋ ๋๋ค์ผ๋ก ์์ฑ๋ id์๋ณ์
์ด์ fileRef๋ user๋ณ ํด๋์ ๋๋ค id(${userObj.uid}/${uuidv4()})๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
uploadString()๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์, base64, base64url ๋๋ data_url ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด์ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง์ ์ ๋ก๋ํ ์ ์๋ค.
uploadString(ref, value, format)
: ๋ฐ์ดํฐ๋ฅผ reference์ ์์น์ ์ ๋ก๋ํ๋ ๋ฉ์๋
- ์ฒซ ๋ฒ์งธ ์ธ์
ref: {@link StorageReference} ์์ ๋ฌธ์์ด(string)์ ์ ๋ก๋ํด์ผ ํ๋ค.- ๋ ๋ฒ์งธ ์ธ์
value: ์ ๋ก๋ํ String- ์ธ ๋ฒ์งธ ์ธ์
format: ์ ๋ก๋ํ String ํ์
- ์์
//v.9 import { getStorage, ref, uploadString } from "firebase/storage"; // const storage = getStorage(); const storageRef = ref(storage, 'some-child'); // // Data URL string const message4 = 'data:text/plain;base64,5b6p5Y+344GX44G+44GX44Gf77yB44GK44KB44Gn44Go44GG77yB'; uploadString(storageRef, message4, 'data_url').then((snapshot) => { console.log('Uploaded a data_url string!'); });
์ฐธ๊ณ ํ ์ ์๋ ์์น๋ฅผ ์์ฑํ์ผ๋, ์ด์ uploadString() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฐ ๋ฐ์ดํฐ๋ฅผ ๋ ํผ๋ฐ์ค๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ์ฐ์ผ๋ก ์
๋ก๋ ํ ์ฐจ๋ก์ด๋ค.
//๋ ํผ๋ฐ์ค(fileRef)๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ์ฐ์ผ๋ก ๋ฐ์ดํฐ ์
๋ก๋ํ๊ธฐ
const response = await uploadString(fileRef, attachment, "data_url");
์ฒซ ๋ฒ์งธ ์ธ์ref์๋ ์
๋ก๋๋ ํ์ผ์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ fileRef๋ฅผ ๋ฃ๋๋ค.
๋ ๋ฒ์งธ ์ธ์ value์๋ attachment์ ๋ค์ด์๋ url์ ๋ฃ๋๋ค.
์ธ ๋ฒ์งธ ์ธ์ ํฌ๋งทํ์์๋ "data_url"๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
import { v4 as uuidv4 } from "uuid";
import { dbService, storageService } from "fbase";
// uploadString ๊ฐ์ ธ์ค๊ธฐ
import { ref, uploadString } from "@firebase/storage";
//
const onSubmit = async (event) => {
event.preventDefault();
//storage์ ํ์ผ ๋ฐ์ดํฐ๊ฐ ์
๋ก๋๋ ์์น ๊ฐ๋ฆฌํค๋ ๋ ํผ๋ฐ์ค ์์ฑํ๊ธฐ
const fileRef = ref(storageService, `${userObj.uid}/${uuidv4()}`);
//๋ ํผ๋ฐ์ค(fileRef)๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ์ฐ์ผ๋ก ๋ฐ์ดํฐ ์
๋ก๋ํ๊ธฐ
//fileRef๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ attachment์ ๋ค์ด์๋ ์ฒจ๋ถํ์ผ url์ ๋ฃ์ด๋ผ, ํฌ๋งทdata_url
const response = await uploadString(fileRef, attachment, "data_url");
//๋ง์ง๋ง์ผ๋ก ํ์ผ์ด ์ ์
๋ก๋ ๋๊ณ ์๋์ง ํ์ธํ๊ธฐ ์ํด ์ฝ์์ ์ฐ์ด๋ณด์!
console.log(response);
//
์
๋ก๋ ํ๋ ค๊ณ ํ๋ permission์ด ์๋ฌ๋ค๊ณ ์๋ฌ๊ฐ ๋ฌ๋ค.

Firebase > Storage > Rules ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด ์ฃผ์.

๊ทธ๋ฌ๋ฉด ์ ๋๋ค!

์ฝ์์ ์
๋ก๋ํ ํ์ผ์ ์ฐ์ด๋ณด๋ ๋ค์๊ณผ ๊ฐ์ด ๋ฌ๋ค.

๋ณด๋ค์ํผ ๋ ํผ๋ฐ์ค์ ์์น์ ํธ์ํด ๋ฒ์ผ์ด ๋จ๊ณ path๊ฐ user์ uid/๋๋คid๋ก ๋จ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
ํ์ด์ด๋ฒ ์ด์ค ์คํ ๋ฆฌ์ง์์๋ ํ์ธ ๊ฐ๋ฅ!
