[swift] Firebase 스토리지를 활용한 파일 업로드 및 다운로드 기능 구현하기

Firebase는 클라우드 기반의 개발 플랫폼으로, 다양한 기능을 제공합니다. Firebase 스토리지는 이 중 하나로, 사용자들이 파일을 업로드하고 다운로드할 수 있는 기능을 제공합니다. 이번 블로그에서는 Firebase 스토리지를 활용하여 파일 업로드 및 다운로드 기능을 구현하는 방법에 대해 알아보겠습니다.

Firebase 프로젝트 설정

먼저 Firebase 프로젝트를 생성하고 해당 프로젝트에 Firebase 스토리지를 추가해야 합니다. Firebase 콘솔(https://console.firebase.google.com/)에 접속하여 새로운 프로젝트를 생성하고, Firebase 스토리지를 활성화합니다.

Firebase SDK 설정

Firebase SDK는 Firebase 스토리지와의 통신을 도와주는 라이브러리입니다. Cocoapods를 통해 Firebase SDK를 설치할 수 있습니다. 프로젝트 폴더에서 Podfile을 열고 아래와 같이 Firebase SDK를 추가합니다.

pod 'Firebase/Storage'

저장 후 터미널에서 pod install 명령어로 Firebase SDK를 설치합니다. 이후 Xcode에서 .xcworkspace 파일을 열어 Firebase SDK를 사용할 수 있습니다.

파일 업로드 구현

파일 업로드를 위해서는 우선 사용자로부터 파일을 선택받아야 합니다. UIImagePickerController를 사용하여 파일을 선택할 수 있습니다. 다음은 파일 선택 및 업로드하는 코드 예제입니다.

import UIKit
import FirebaseStorage

class UploadViewController: UIViewController, UIImagePickerControllerDelegate & UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func uploadButtonTapped(_ sender: UIButton) {
        let imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .photoLibrary
        present(imagePicker, animated: true, completion: nil)
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let pickedImage = info[.originalImage] as? UIImage {
            uploadImageToFirebase(image: pickedImage)
        }
        dismiss(animated: true, completion: nil)
    }

    func uploadImageToFirebase(image: UIImage) {
        guard let imageData = image.jpegData(compressionQuality: 0.8) else { return }
        let storageRef = Storage.storage().reference()
        let timestamp = NSDate().timeIntervalSince1970
        let imageRef = storageRef.child("\(timestamp).jpg")
        let uploadTask = imageRef.putData(imageData, metadata: nil) { (metadata, error) in
            guard let metadata = metadata else {
                // handle error
                return
            }
            // 업로드 성공 시, 다운로드 URL을 가져옵니다.
            imageRef.downloadURL { (url, error) in
                guard let downloadURL = url else {
                    // handle error
                    return
                }
                // 다운로드 URL을 가져오면 처리할 로직을 작성합니다.
                print(downloadURL.absoluteString)
            }
        }
    }

}

위의 예제 코드에서는 UIImagePickerController를 사용하여 이미지 파일을 선택하고, 선택된 이미지를 Firebase 스토리지에 업로드합니다. 업로드가 성공하면 이미지의 다운로드 URL을 가져와 처리할 수 있습니다.

파일 다운로드 구현

파일 다운로드를 위해서는 Firebase 스토리지에 저장된 파일의 다운로드 URL이 필요합니다. 이전에 업로드한 파일의 다운로드 URL을 가지고 있다면, 아래와 같은 코드로 다운로드할 수 있습니다.

import UIKit
import FirebaseStorage

class DownloadViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func downloadButtonTapped(_ sender: UIButton) {
        let storageRef = Storage.storage().reference()
        let imageRef = storageRef.child("image.jpg")
        imageRef.downloadURL { (url, error) in
            guard let downloadURL = url else {
                // handle error
                return
            }
            // 다운로드 URL을 이용하여 파일을 다운로드하는 로직을 작성합니다.
            URLSession.shared.dataTask(with: downloadURL) { (data, response, error) in
                guard let imageData = data, error == nil else {
                    // handle error
                    return
                }
                // 다운로드 받은 데이터를 이용하여 UI를 갱신하거나 로컬에 저장하는 등의 로직을 작성합니다.
                let image = UIImage(data: imageData)
                DispatchQueue.main.async {
                    // UI 갱신 로직
                }
            }.resume()
        }
    }

}

위의 예제 코드에서는 downloadURL 메소드를 이용하여 파일의 다운로드 URL을 가져오고, 가져온 URL을 이용하여 파일을 다운로드합니다. 다운로드한 데이터를 적절하게 활용하여 UI를 갱신하거나 로컬에 저장할 수 있습니다.

결론

Firebase 스토리지를 활용한 파일 업로드 및 다운로드 기능 구현 방법에 대해 알아보았습니다. Firebase 스토리지는 안정적이고 편리한 파일 관리 기능을 제공하므로, 이를 활용하여 다양한 파일 관련 기능을 개발할 수 있습니다. 더 자세한 내용은 Firebase 공식 문서를 참고하시기 바랍니다.

참고 자료: