IOS/iOS

[TIL] Moya 장점과 간단한 사용법

 안녕하세요 오늘은 웹 네트워크 쪽을 공부하다가 우연히 Moya를 알게 되어서 신기해서 사용방법을 정리해 보았습니다 ㅎㅎ

Moya의 장점

  • Alamofire는 재사용이 불편하다
  • Moya는 Network layer를 템플릿화 하고 사용할때에는 request, response만 처리 하면된다
  • 테스트가 용이하다

Moya 프레임워크 의존성 ( 왼쪽 일반, 오른쪽 Moya )

Moya 설치방법

pod 'Moya', '~> 14.0'

# or 

pod 'Moya/RxSwift', '~> 14.0'

# or

pod 'Moya/ReactiveSwift', '~> 14.0'

TargetType 용어설명

  • *baseURL: 서버의 도메인*
  • *path: 서버의 도메인 뒤에 추가 될 Path (일반적으로 API)*
  • *method: HTTP method (GET, POST, …)*
  • *sampleData: 테스트용 Mock Data*
  • *task: 리퀘스트에 사용되는 파라미터 설정*
  • *validationType: 허용할 response의 타입*
  • *headers: HTTP header*

모야의 사용 방법과 형태

  1. 데이터 네트워크의 형태를 열거형으로 정의한다

     import Moya
    
     enum GithubAPI {
         case searchUser(query: String)
     }
  2. 열거형으로 정의한 데이터 네트워크를 템플릿 형태로 만들어준다. (TargetType 작성)
    각각의 데이터 네트워크 작업에 따른 URL 분배라던가 get, post형태를 잡아준다.
    여기서 주의해야 할 점은 각각의 프로퍼티들이 조합되서 완전한 full request를 생성하는지 체크해야 합니다.

     extension GithubAPI: TargetType {
         var baseURL: URL {
             return URL(string: "https://api.github.com")!
         }
    
         var path: String {
             switch self {
             case .searchUser:
                 return "search/users"
             }
         }
    
     //moya의 장점 각 메소드가 get 인지 post인지 설정가능
         var method: Method {
             return .get
         }
    
         var sampleData: Data {
             return Data()
         }
    
         var task: Task {
             switch self {
             case .searchUser(let query):
                 return .requestParameters(parameters: ["q" : query], encoding: URLEncoding.default)
             }
         }
    
         var validationType: Moya.ValidationType {
             return .successAndRedirectCodes
         }
    
         var headers: [String : String]? {
             return nil
         }
     }
  3. 사용법

     let provider = MoyaProvider<GithubAPI>()
     provider.rx.request(.searchUser(query: query))
         .subscribe { [weak self] (event) in
             switch event {
             case .success(let response):
                print(response)
             case .error(let error):
                 print(error.localizedDescription)
             }
         }
         .disposed(by: disposeBag)

     

좀더 자세한 내용

- https://woowabros.github.io/swift/2020/12/20/ios-networking-and-testing.html

 

iOS Networking and Testing - 우아한형제들 기술 블로그

Why Networking?

woowabros.github.io