이미지나 동영상 파일은 데이터베이스보다는 스토리지에 올려놓는게 비용적으로 효율적이고 Firebase에 스토리지 서비스가 이미 있기 때문에 한번 써봤습니다. Amazon Web Service도 S3, DynamoDB등 훨씬 더 다양한 리소스를 제공하기 때문에 다음에 프로젝트한다면 AWS로 올려놓고 빌드시킬 생각이 있습니다.
설치는 Auth, Firestore에서도 다루기도 했고 같은 절차이기 때문에 이번 글에서는 생략하겠습니다.
import FirebaseFirestore
class DBViewModel : NSObject {
let storageViewModel = StorageViewModel()
...
func makeDocument(uid:String, date:Date, emotion: String?, content: String, imageData: Data?){
...
if let imageData = imageData {
self.storageViewModel.uploadImage(uID: uid, docID: ref!.documentID, imageData: imageData)
}
}
}
}
...
}
db에서 도큐먼트를 생성할 때 이미지를 업로드하도록 하겠습니다. 저는 이미지의 네임을 자동으로 생성된 docID로 하려고 도큐먼트를 만들 때 스토리지에 이미지를 저장했습니다.
import Foundation
import FirebaseStorage
class StorageViewModel : NSObject {
let storage = Storage.storage()
func uploadImage(uID:String, docID: String, imageData: Data){
let storagePath = "gs://futurediary-1234.appspot.com/\(uID)/\(docID).jpg"
let storageRef = storage.reference(forURL: storagePath)
let uploadTask = storageRef.putData(imageData, metadata: nil){ (metadata, error) in
guard let metadata = metadata else {
print("Upload Image Task has Failed : \(error.debugDescription)")
return
}
storageRef.downloadURL { (url, error) in
guard let url = url else {
print("Downloading URL has Failed : \(error.debugDescription)")
return
}
}
}
}
}
let storage = Storage.storage()
: Firebase Storage에 대한 포인터를 받습니다.
func uploadImage(uID:String, docID: String, imageData: Data)
: user의 document에 따라 이미지를 업로드하는 메서드입니다.
let storagePath = ...
: 저장될 이미지의 경로입니다. DNS는 Firebase Storage 콘솔 메인화면에서 얻을 수 있습니다.let storageRef = storage.reference(forURL: storagePath)
: 경로에 대한 레퍼런스를 얻습니다.let uploadTask = storageRef.putData(imageData, metadata: nil){ (metadata, error) in
: 데이터를 정의한 url 경로로 저장합니다. storageRef.downloadURL { (url, error) in
: 비동기식으로 오래 지속되는 다운로드 URL을 검색합니다. 저장 후 url을 복사하는 용도로 사용할 수 있을 것 같습니다.
Storage 콘솔에서 업로드됨을 확인했고 오른쪽 URL을 클릭하면 사진을 다운로드합니다.
다음 글은 처음 로그인했을 때 유저마다 외장 데이터베이스에서 정보들을, 스토리지에서 이미지를 가져와서 일기 리스트를 로드하는 것을 다루도록 하겠습니다.
잘보고가요