iOS/Swift

[Swift] Moya๋ฅผ ์‚ฌ์šฉํ•ด๋ด…์‹œ๋‹ค.

๊ฒฝํ‘ธ 2022. 2. 7. 18:17
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”~

 

์˜ค๋Š˜์€ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ์— ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ

Moya ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ณผ๊นŒ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋งํฌ์ž…๋‹ˆ๋‹ค : - )

 

GitHub - Moya/Moya: Network abstraction layer written in Swift.

Network abstraction layer written in Swift. Contribute to Moya/Moya development by creating an account on GitHub.

github.com

 


 

๊นƒํ—ˆ๋ธŒ์— ๊ฐ€๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Moya

 

์ด ์ด๋ฏธ์ง€ ์œ„์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธ€์ด ์ ํ˜€์žˆ์Šต๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๋˜‘๋˜‘ํ•œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ์•„๋งˆ URLSession๊ณผ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ถˆ์พŒํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ถ”์ƒํ™”ํ•˜๊ธฐ ์œ„ํ•ด Alamofire๋ฅผ ์‚ฌ์šฉํ• ์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋˜‘๋˜‘ํ•œ ๊ฐœ๋ฐœ์ž ๋„คํŠธ์›Œํฌ ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์ž‘์„ฑํ•  ๊ฒ๋‹ˆ๋‹ค. "APIManager" ๋˜๋Š” "NetworkModel"๋ผ๊ณ  ๋ถˆ๋ฆฌ๋ฉฐ ํ•˜์ง€๋งŒ ์ด ์ž‘์—…์€ ํ•ญ์ƒ ๋ˆˆ๋ฌผ๋กœ ๋์ด ๋‚  ๊ฒ๋‹ˆ๋‹ค. 
- Moya README.md

 

์ฝ๋‹ค๋ณด๋‹ˆ ์ œ ๊ฒฝํ—˜๋‹ด์„ ๋Š˜์–ด๋†“์€ ๊ฒƒ ๊ฐ™์•„์„œ ๋งˆ์Œ์ด ์•„ํŒ ์Šต๋‹ˆ๋‹ค.

 


 

Alamofire๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ 

์ฃผ๋ณ€์— Moya๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹ ๋ถ„๋“ค๋„ ์žˆ์–ด 

์ด๋ฒˆ ๊ธฐํšŒ์— ์ €๋„ ๊ฐ„๋‹จํ•˜๊ฒŒ๋ผ๋„ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์„ ์ตํžˆ๊ณ  ๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฐ„๋‹จํ•œ ์„ค๋ช…

๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ์œ„ํ•ด URLSession์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Moya ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ README์—์„œ ๋ดค๋˜ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณต์žกํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๋ฉฐ ์ถ”์ƒํ™”๋ฅผ ์œ„ํ•ด ์• ์“ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์„ ํƒํ•˜๊ฒŒ ๋˜๋Š” ๊ฒŒ ๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ง„ Alamofire์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ์œ ์ง€๋ณด์ˆ˜์™€ ์œ ๋‹› ํ…Œ์ŠคํŠธ๊ฐ€ ํž˜๋“ค๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์–ด

์ด๋ฅผ ์กฐ๊ธˆ ๋” ์ถ”์ƒํ™”์‹œ์ผœ ํƒ„์ƒํ•œ ๊ฒƒ์ด ๋ฐ”๋กœ๋ฐ”๋กœ Moya๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

                           (์ถ”์ƒํ™”)                  (์ถ”์ƒํ™”)

๊ฒฐ๋ก  : URLSession    ->    Alamofire    ->    Moya  

                                 

์‚ฌ์šฉ๋ฐฉ๋ฒ•

1. ์—ด๊ฑฐํ˜•์„ ํ•˜๋‚˜ ์ž‘์„ฑํ•ด ์ฃผ์„ธ์š”. ์‚ฌ์šฉ๋  Target๋“ค์„ ์ž‘์„ฑํ•  ๊ฒ๋‹ˆ๋‹ค.

- ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•จ๊ป˜ ๊ธฐ์ž…ํ•˜์‹œ๋ฉด ๋˜๊ณ  ํ•„์š” ์—†๋‹ค๋ฉด ์ ์ง€ ์•Š์œผ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

- User๊ด€๋ จ API๊ฐ€ ์žˆ๋‹ค๋ฉด UserTarget ๋“ฑ ๊ฐ๊ฐ์˜ ์กฐ๊ฑด์— ๋งž๊ฒŒ ํƒ€๊ฒŸ์„ ์„ค์ •ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

//DefaultTarget์€ ๋ฌด์‹œํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค!
enum UserTarget : DefaultTarget {
    case getUser(idToken : String) 				//์œ ์ €์ •๋ณด
    case signupUser(idToken: String,SignupParameter)		//ํšŒ์›๊ฐ€์ž…
    case withdrawUser(idToken: String) 				//ํšŒ์›ํƒˆํ‡ด
    case updateMypage(idToken: String,MypageParameter) 		//๋‚ด์ •๋ณด ์—…๋ฐ์ดํŠธ
    case updateFCMToken(idToken: String,FCMtokenParameter)	//FCMํ† ํฐ ๊ฐฑ์‹ 
}

 

2. TargetType์„ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

- TargetType์„ ์ฑ„ํƒํ•˜๊ณ  ๋‚˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ํ”„๋กœํผํ‹ฐ๋“ค์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

extension UserTarget : TargetType {
    var baseURL: URL { }
    
    var path: String { }
    
    var method: Method { }
    
    var task: Task { }
    
    var headers: [String : String]? { }
}

 

ํ‰์†Œ์— Alamofire๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ

๋”ฐ๋กœ ๋ชจ๋“ˆํ™”๋ฅผ ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ํ•œ ๋ฒˆ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ํ”„๋กœํ† ์ฝœ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ํŽธํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

Moya์—์„œ๋Š” MoyaProvider <TargetType>์œผ๋กœ request๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ”„๋กœํ† ์ฝœ์„ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์‹ค ๊ฑฐ์˜ˆ์š”.

โ€ปmethod ๋ถ€๋ถ„์— Moya.Method๋กœ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•ด ์ฃผ๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค   

 

๊ฐ ํ”„๋กœํผํ‹ฐ๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • baseURL: ์„œ๋ฒ„์˜ endpoint ๋„๋ฉ”์ธ
  • path: ๋„๋ฉ”์ธ ๋’ค์— ์ถ”๊ฐ€๋  ๊ฒฝ๋กœ
  • method: HTTP method 
  • task: request์— ์‚ฌ์šฉ๋  ํŒŒ๋ผ๋ฏธํ„ฐ. requestPlain: no param,. requestParameters(parameter:, encoding:)
  • headers: HTTP Header

์ •๋ฆฌํ•ด ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

//์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด์„œ ๋‘๊ฐœ๋งŒ ์ ์–ด๋ณผ๊ฒŒ์š”!
extension UserTarget : TargetType {

    //BaseURL
    var baseURL: URL {
        return URL(string: "http://www.naver.com")!
    }
    
    //Path
    var path: String {
        switch self {
        case .getUser : return "user"
        case .updateFCMToken : return "user/update_fcm_token"
        }
    }
    
    //HTTP Method -> GET, POST, PUT, DELETE
    var method: Moya.Method { 
        switch self {
        case .getUser: return .get
        case .updateFCMToken : return .put
        }
    }
    
    //Task
    var task: Task {
        switch self {
            
        case .getUser:
            return .requestPlain
            
        case .updateFCMToken(_,let parameter):
            return .requestParameters(parameters: [
                "FCMtoken": parameter.FCMtoken
            ], encoding: URLEncoding.default)
        }
    }
    
    //Headers
    var headers: [String : String]? {
        
        switch self {
        case .getUser(let idToken):
            return [
                "idtoken": idToken
            ]
        case .updateFCMToken(let idToken,_):
            return [
                "idtoken": idToken,
                "Content-Type": "application/x-www-form-urlencoded"
            ]
    }
}

 

3. Request๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

RxSwift๋ฅผ ์ด์šฉํ•  ๊ฒฝ์šฐ Request๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

private let provider = MoyaProvider<UserTarget>()

provider.rx.request(.getUser(idToken: idToken))
            .subscribe{ result in
                switch result {
                case .success(let response):
                    onCompletion(try? response.map(User.self),response.statusCode)
                case .failure(let error):
                    onCompletion(nil,error.asAFError?.responseCode)
                }
            }
            .disposed(by: disposeBag)

 

์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

 

provider.request(.getUser)) { result in
    switch result {
    case let .success(response):
         onCompletion(try? response.map(User.self),response.statusCode)
    case let .failure(error):
          onCompletion(nil,error.asAFError?.responseCode)
    }

}

 

 

Moya ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด ๋ดค์Šต๋‹ˆ๋‹ค.

์–ด๋ ต์ง€ ์•Š๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ 

Moya๊ฐ€ ์ฃผ๋Š” ๊ฐ„ํŽธํ•จ๊ณผ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค : - )

 

๊ทธ๋Ÿผ ์ด๋งŒ ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป

๋ฐ˜์‘ํ˜•