[swift] Swift Moya에서 이미지 업로드 기능 구현하기

Moya는 Swift에서 네트워크 호출을 쉽게 처리하기 위한 라이브러리입니다. 이미지 업로드 기능을 구현하기 위해서는 Moya의 기능을 알아야 합니다. 이번 포스트에서는 Swift Moya를 이용하여 이미지를 업로드하는 방법을 알아보겠습니다.

MultipartFormData 업로드

Moya는 MultipartFormData 업로드를 지원합니다. MultipartFormData는 웹 양식에서 여러 파트의 데이터를 동시에 서버로 전송하는 방식입니다.

1. 이미지를 선택하고 업로드하기

이미지를 선택하고 업로드하기 위해 UIImagePickerController를 사용하겠습니다. UIImagePickerController를 사용하여 이미지를 선택한 후에 업로드를 진행합니다.

import UIKit

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    @IBAction func uploadImageButtonTapped(_ sender: UIButton) {
        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self
        imagePickerController.sourceType = .photoLibrary
        imagePickerController.allowsEditing = false
        present(imagePickerController, animated: true, completion: nil)
    }
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let image = info[UIImagePickerController.InfoKey.originalImage] as? UIImage {
            uploadImage(image: image)
        }
        
        picker.dismiss(animated: true, completion: nil)
    }
    
    func uploadImage(image: UIImage) {
        // TODO: Moya를 사용하여 이미지 업로드 구현
    }
}

2. Moya를 사용하여 이미지 업로드 구현하기

Moya에서 MultipartFormData 업로드를 구현하기 위해 Provider의 request 메서드를 사용합니다. request 메서드는 MultipartFormData를 매개변수로 받아 원하는 엔드포인트에 요청을 보냅니다.

import Moya

enum ImageUploadAPI {
    case upload(image: UIImage)
}

extension ImageUploadAPI: TargetType {
    
    var baseURL: URL {
        return URL(string: "http://api.example.com")!
    }
    
    var path: String {
        return "/upload"
    }
    
    var method: Moya.Method {
        return .post
    }
    
    var sampleData: Data {
        return Data()
    }
    
    var task: Task {
        switch self {
        case .upload(let image):
            let imageData = image.jpegData(compressionQuality: 0.5) // 이미지를 Data로 변환
            let formData = MultipartFormData(provider: .data(imageData!), name: "image", fileName: "image.jpg", mimeType: "image/jpeg") // MultipartFormData 생성
            return .uploadMultipart([formData])
        }
    }
    
    var headers: [String: String]? {
        return nil
    }
}

위와 같이 Moya의 TargetType을 구현하여 엔드포인트를 정의하고, 업로드할 이미지를 파라미터로 받는 upload 메서드를 정의합니다.

3. 이미지 업로드하기

이제 이미지 업로드를 진행합니다. 앞서 구현한 Moya ImageUploadAPI를 사용하여 이미지를 업로드하고 결과를 처리합니다.

import Moya

func uploadImage(image: UIImage) {
    let provider = MoyaProvider<ImageUploadAPI>()
    
    provider.request(.upload(image: image)) { result in
        switch result {
        case .success(let response):
            // 업로드 성공
            // 응답 처리
            break
        case .failure(let error):
            // 업로드 실패
            // 에러 처리
            break
        }
    }
}

위 코드에서는 MoyaProvider를 생성하고, request 메서드를 통해 업로드를 진행합니다. 성공 시 응답 처리를, 실패 시 에러 처리를 할 수 있습니다.

마무리

이번 포스트에서는 Swift Moya를 사용하여 이미지 업로드 기능을 구현하는 방법에 대해 알아보았습니다. MultipartFormData를 사용하여 이미지 업로드를 진행하고, Moya의 request 메서드를 이용해 업로드 요청을 처리했습니다.