아요 개발 일기

[iOS] Moya를 이용한 네트워킹 본문

iOS

[iOS] Moya를 이용한 네트워킹

소진이 2023. 1. 6. 17:36

안녕하세요!

오늘은 Moya를 이용한 네트워킹을 해보겠습니다 :D

API는 영어 명언을 랜덤으로 출력해 주는 친구를 사용해보았습니다!ㅎㅎ

Moya에 대한 이론적인 부분은 Moya가 뭐야? 글을 참고해주세요!


Moya 설치

Swift Package Manager, CocoaPods, Carthage 를 사용하여 install할 수 있기 때문에 가장 익숙하고 편한 방법으로 설치합니다.

 

네트워킹을 담당할 enum을 하나 선언해서 사용될 target들 작성 

enum AdviceAPI {
    case randomAdvice
}

TargetType 구현

  • baseURL: 서버의 endpoint 도메인
  • path: 도메인 뒤에 추가 될 path (/users, /documents, ...)
  • method: HTTP method (GET, POST, ...)
  • sampleData: 테스트용 Mock Data
  • task: request에 사용될 파라미터 .requestPlain: no param, .requestParameters(parameter:, encoding:)
    • plain request : 추가 데이터가 없는 request
    • data request : 데이터가 포함된 requests body
    • parameter request : 인코딩된 매개 변수가 있는 requests body
    • JSONEncodable request : 인코딩 가능한 유형의 requests body
    • upload request
  • headers: HTTP Header

 

extension AdviceAPI: TargetType {

    
    var baseURL: URL {
        return URL(string: "https://api.adviceslip.com")!
    }
    
    var path: String {
        switch self {
        case .randomAdvice:
            return "/advice"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .randomAdvice:
            return .get
        }
    }
    
    var task: Task {
        switch self {
        case .randomAdvice:
            return .requestParameters(parameters: [:], encoding: URLEncoding.queryString)
        }
    }
    
    var headers: [String : String]? {
        return ["Content-type": "application/json"]
    }
}

 

 

Request 보내고 Response 받아서 처리하기

 

response 시 받는 JSON의 형태는 아래와 같습니다.

 

 

JSON형태와 일치하는 struct를 정의해줍니다.

struct Advice: Decodable {
    var slip: Slip

    struct Slip: Decodable {
        var id: Int
        var advice: String
    }
}

 

ViewController에서 button 누를시에 새로운 명언을 받아 올 수 있게 설정해 놓으면 끝!

class ViewController: UIViewController {
    @IBOutlet weak var adviceLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

    }
    @IBAction func nextButton(_ sender: Any) {
        let provider = MoyaProvider<AdviceAPI>()
        provider.request(.randomAdvice) { (result) in
            switch result {
            case let .success(response):
                let result = try? response.map(Advice.self)
                self.adviceLabel.text = result?.slip.advice
            case let .failure(error):
                print(error.localizedDescription)
            }
        }
    }
}

 

결과

 

이렇게 Moya를 통해 네트워킹을 하게되면 enum을 활용하여 안전한 방식으로 캡슐화된 요청을 할 수 있다는 장점이 있고, 코드를 직관적이고 쉽게 작성할 수 있다는 장점이 있습니다.

 

참고 사이트

https://github.com/Moya/Moya 

https://github.com/Moya/Moya/blob/master/docs/Examples/Basic.md

'iOS' 카테고리의 다른 글

[Xcode] Xcode 단축어 정리  (0) 2023.01.10
[iOS] App의 생명주기 (Life Cycle)  (0) 2023.01.10
[iOS] Moya가 뭐야?!  (0) 2023.01.06
[iOS]JSON ObjectMapper vs. Codable (Decodable, Encodable)  (0) 2023.01.06
[iOS] MVP패턴  (0) 2023.01.06