suvera-dev ๐Ÿฅฆ

iOS) Router pattern with Alamofire’s URLRequestConvertible protocol Tutorial ๋”ฐ๋ผํ•ด๋ณด๊ธฐ ! ๋ณธ๋ฌธ

iOS

iOS) Router pattern with Alamofire’s URLRequestConvertible protocol Tutorial ๋”ฐ๋ผํ•ด๋ณด๊ธฐ !

suvera 2022. 5. 16. 11:33

์•ˆ๋…•ํ•˜์„ธ์šฅ ! ์˜ค๋Š˜์€ Alamofire๋ผ๋Š” 

์„œ๋ฒ„ํ†ต์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ URLRequestConvertible์ด๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ 

์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. !

 

์˜ค์˜น ์ œ๋ฒ• ์–ด๋ ค์›Œ๋ณด์ด์ง€๋งŒ, ์š”๊ฑฐ๋ฅผ ์ฐพ๊ณ  ๊ณต๋ถ€ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ๋ฅผ 

์„ค๋ช…ํ•ด๋ณด์ž๋ฉด.. ์ž‘๋…„์— ์ฒ˜์Œ์œผ๋กœ ์•Œ๋ผ๋ชจ๋กœ ์„œ๋ฒ„ํ†ต์‹ ์„ ํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์—

ํ•ฉ๋™์„ธ๋ฏธ๋‚˜์—์„œ๋Š” ์•Œ๋ผ๋ชจ๋ณด๋‹ค ๋” ์ถ”์ƒํ™”๋œ ๋ชจ์•ผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Moya ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ •๋ง .. ํŽธํ–ˆ๊ณ  ๊ทธ๋ƒฅ ์ดํ•ด๋„ ๋ชปํ•˜๊ณ  ํ›„๋ฃจ๋ฃฉ 

์ ์–ด๋„ ์„œ๋ฒ„ํ†ต์‹ ์ด ์ง  ~ ํ•˜๊ณ  ๋˜๋Š” ์นœ๊ตฌ์˜€์Šต๋‹ˆ๋‹ค..

 

๋ฒ„๋ฆ‡์ด ์ž˜๋ชป๋“ค์–ด์ง„๊ฑฐ์ฃ .. ๊ทธ๋Ÿฐ๋ฐ ์•ฑ์žผ์—์„œ URLSession์„ ์“ฐ๊ฒŒ ๋˜์—ˆ๊ณ ,

๊ทธ๋ ‡๊ฒŒ ์ €๋Š” ๋ถ€์…”์กŒ์Šต๋‹ˆ๋‹ค.. ์„œ๋ฒ„ํ†ต์‹ ์˜ ใ……์ž๋„ ๋ชจ๋ฅด๋Š” ๊ฐ์ž์˜€๊ธฐ ๋•Œ๋ฌธ...

๋’ค์ฃฝ๋ฐ•์ฃฝ ์„œ๋ฒ„ํ†ต์‹  ํ”Œ๋กœ์šฐ๊ฐ€ ์ •๋ฆฌ๊ฐ€ ์•ˆ๋˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ.. 

๋‹ค์‹œ ์„ธ๋ฏธ๋‚˜๋ฅผ ๋“ค์œผ๋ฉด์„œ Alamofire๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

 

๊ทธ๋Ÿฐ๋ฐ ์ด์ œ์™€์„œ ๋‹ค์‹œ ๋ณด๋‹ˆ๊น Alamofire๋ฅผ ํ™œ์šฉํ•ด์„œ ์„œ๋ฒ„ํ†ต์‹ ํ•˜๋Š” ์ฝ”๋“œ๋Š”

๊ต‰์žฅํžˆ ๋งŽ์€ ๋ถ€๋ถ„๋“ค์ด ๊ฐ™์€ ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๊ณ , ์ด ๋ถ€๋ถ„์„ ๋ชจ์•ผ์ฒ˜๋Ÿผ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋ชจ๋“ˆํ™” ํ•  ์ˆœ ์—†์„๊นŒ?

๋Œ€์‹  ๋ชจ์•ผ๋ฅผ ์“ฐ์ง€๋ง๊ณ ... ์•Œ๋ผ๋ชจ๋กœ ๋ชจ์•ผ์ฒ˜๋Ÿผ ์จ๋ณด์ž.. ๋ผ๋Š” ๋ชฉ์ ์„ ๊ฐ€์ง€๊ณ  ์•Œ์•„๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค !

 


1. URLRequestConvertible์ด ๋ญ์•ผ !

 

ํ•ญ์ƒ ์ €ํฌ๋Š” ๊ธฐ๋ณธ request ๋ฉ”์„œ๋“œ์—๋‹ค๊ฐ€

ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์—ˆ์ฃ .. !! 

ํ•˜์ง€๋งŒ URLRequestConvertible์ด๋ผ๋Š” ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด์„œ 

URLRequest๋ฅผ ๋”ฐ๋กœ ์ •์˜ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค !

 

์˜ค์˜ค ๊ทธ๋Ÿฌ๋ฉด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด์„œ ์ดˆ๊ธฐ๊ตฌํ˜„์„ ํ•ด์ฃผ๋Š”๋ฐ,

๊ทธ ๊ณผ์ •์—์„œ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฏธ๋ฆฌ ๋„ฃ์–ด์ค€๋‹ค๋ฉด.. request ํ•  ๋•Œ๋งˆ๋‹ค 

๊ทธ ํ•จ์ˆ˜์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋„ฃ์–ด์ฃผ๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๊ฒ ๋„ค์š” !!

 

์‹ค์ œ ํŠœํ† ๋ฆฌ์–ผ? ์—๋„ ์ฝ”๋“œ ๋ณต์ œ ๋ฐฉ์ง€์— ๋Œ€ํ•œ ์žฅ์ ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋„ค์š” !

 

This tutorial teaches about the Alamofire router pattern, 

which helps us have a clean network layer and avoid duplicating code.

 

์ด ํŠœํ† ๋ฆฌ์–ผ์€ Alamofire ๋ผ์šฐํ„ฐ ํŒจํ„ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. 
์ด ํŒจํ„ด์€ ๊นจ๋—ํ•œ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์„ ๋งŒ๋“ค๊ณ  ์ฝ”๋“œ ๋ณต์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

์ด์ „์— Alamofire๋ฅผ ์‚ฌ์šฉํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•œ

URL ๊ฒฝ๋กœ, HTTP ๋ฉ”์„œ๋“œ ๋ฐ ์ฟผ๋ฆฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 
์ฝ”๋“œ ์ค‘๋ณต์„ ์œ ๋ฐœํ•˜๋Š” API ๊ด€๋ฆฌ์ž ๋˜๋Š” ์ผ๋ถ€ ๋„คํŠธ์›Œํฌ ๋ชจ๋ธ์„ ์•ฑ์— ์ƒ์„ฑํ–ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์•ฑ ํฌ๊ธฐ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๋„คํŠธ์›Œํฌ ์Šคํƒ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. 
์ •๋‹ต์€ URLRequestConvertible ํ”„๋กœํ† ์ฝœ๊ณผ ๋ผ์šฐํ„ฐ ๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ผ์šฐํ„ฐ๋Š” API ๊ด€๋ฆฌ์ž(๋˜๋Š” API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ)๊ฐ€ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก 
URL ์š”์ฒญ์„ ์ƒ์„ฑํ•  ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋„ค.. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•˜๋„ค์š”.. 

 

 

 

์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋‚˜์š” ??? ใ…‡ใ…‚ใ…‡

it has a single requirement, asURLRequest()

์ € ํ”„๋กœํ† ์ฝœ์—๋Š” asURLRequest ๋ผ๋Š” ๋‹จ์ผ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค 

 

To start, we will declare a router. 

It will be an enum with a case for each type of call we want to make.

๋ผ์šฐ๋”๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ  URLRequestConvertible ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  enum์œผ๋กœ ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆ ์„œ ์—ฌ๋Ÿฌ endpoint์— ๋Œ€ํ•ด์„œ

path, method, parameter๋ฅผ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ! 

 

import Alamofire
enum UserRouter: URLRequestConvertible {
    
    // 1.
    case login(user: User)
    case getUserInfo
    
    // 2.
    var path: String {
        switch self {
        case .login:
            return "login"
        case .getUserInfo :
            return "userInfo"
        }
    }
    
    // 3.
    var method: HTTPMethod {
        switch self {
        case .login:
            return .post
        case .getUserInfo:
            return .get
        }
    }
    
    // 4.
    var parameters: Parameters? {
        switch self {
        case .login(let user):
            return [
                "username" : user.username,
                "password" : user.password
            ]
        default:
            nil
        }
    }
    
    // 5.
    func asURLRequest() throws -> URLRequest {
       // 6.
        let url = try URL(string: Constant.BaseURL.asURL()
                                                  .appendingPathComponent(path)
                                                  .absoluteString.removingPercentEncoding!)
        // 7.
        var request = URLRequest.init(url: url!)
        // 8.
        request.httpMethod = method.rawValue
        // 9.
        request.timeoutInterval = TimeInterval(10*1000)
        // 10.
        return try URLEncoding.default.encode(request,with: parameters)
    }
}

 

1. First, add a case for each URLRequest endpoint. 

Swift enums can have arguments, and we can pass our data to the router.

: ๋จผ์ € ๊ฐ URLRequest Endpoint์— ๋Œ€ํ•œ case๋“ค์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 

์Šค์œ„ํ”„ํŠธ enum์œผ๋กœ ๋งŒ๋“ค์–ด๋‘” ๋’ค ๋ผ์šฐํ„ฐ์— ์ „๋‹ฌํ•œ๋‹ค๊ณ  ํ•ฉ๋‰˜๋‹ค.

 

2. Define the endpoint for each URLRequest.

: ๊ฐ URLRequest์— ๋Œ€ํ•œ endpoint๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค !

 

3. Add http method like .get, .post, .delete, .put… for each case.

: ๊ฐ case์— ๋Œ€ํ•˜์—ฌ HTTPMethod๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. 

 

4. You can add parameters property to set API parameters.

: ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค 

 

5. To conform URLRequestConvertible protocol

we must add asURLRequest() function to the router.
: ์ด ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋ ค๋ฉด ๋ผ์šฐํ„ฐ์—

asURLRequest() ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค !

 

6. In the asURLRequest function,

define URL as BaseURL and append path as request endpoint.

: asURLRequest ํ•จ์ˆ˜์—์„œ URL์„ baseURL๋กœ ์ •์˜ํ•˜๊ณ 

path๋ฅผ request Endpoint๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค !

 

7. Define request as URLRequest.

: ์š”์ฒญ์„ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  URLRequest๋กœ ์ •์˜ํ•˜๊ธฐ 

 

8. Add HTTP method to the request.

: ์š”์ฒญ์— HTTP method ์ถ”๊ฐ€ํ•˜๊ธฐ 

 

9. Optionally, we can add a timeout to the request.

: ์„ ํƒ์ ์œผ๋กœ timeout ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค !!

 

10. Finally, return URLEncoding with the request I define earlier.

: ๋งˆ์ง€๋ง‰์œผ๋กœ ์•ž์„œ ์ •์˜ํ•œ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ URLEncoding ์„ ๋ฐ˜ํ™˜ !

 

 

 

์•„๋ž˜์™€ ๊ฐ™์ด ๋ผ์šฐํ„ฐ๋งŒ ์ „๋‹ฌํ•ด์ฃผ๋ฉด,, ์‹ค์ œ request ํ• ๋•Œ ์ฝ”๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ  

์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹น !! 

AF.request(UserRouter.login(user: user))
	.validate()
	.responseData { response in
             // Do whatever you wnat with response
        }

we no longer have to declare URL, query parameters, and headers locally for each API call.

๋” ์ด์ƒ API ํ˜ธ์ถœ์— ๋Œ€ํ•ด URL, ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ, ํ—ค๋”๋ฅผ ๋กœ์ปฌ๋กœ ์„ ์–ธํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง‘๋‹ˆ๋‹ค ! ๊ตณ

 

 

 

 

 

 

๊ทธ๋ƒฅ ์ฐพ๋‹ค๊ฐ€ ๋ฐœ๊ฒฌํ•œ.,,, ์•Œ๋ผ๋ชจ๋ฅผ ์“ฐ๋Š” ์ด์œ ... ์ •๋„ ??

 

Why do you need Alamofire at all? 

Apple already provides URLSession and other classes for downloading content via HTTP,

 so why complicate things with another third-party library?
The short answer is Alamofire is based on URLSession,

 but it frees you from writing boilerplate code, which makes writing networking code much easier.

 You can access data on the Internet with minimal effort,

 and your code will be much cleaner and easier to read.

 

์š”์•ฝํ•˜์ž๋ฉด URLSession์ด ์žˆ๋Š”๋ฐ ์™œ ์•Œ๋ผ๋ชจ๋ฅผ ์“ฐ๋Š”์ง€?

์•Œ๋ผ๋ชจ๋Š” ์œ ์•Œ์—˜์„ธ์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ธฐ ๋•Œ๋ฌธ์—

๋„คํŠธ์›Œํ‚น ์ฝ”๋“œ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ !

์ตœ์†Œํ•œ์˜ ๋…ธ๋ ฅ์œผ๋กœ ์ธํ„ฐ๋„ท์˜ ๋ฐ์ดํ„ฐ์— ์—‘์„ธ์Šค + ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฌ์›€ !

 

์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค ~ :) 

 

์•ฑ์žผ๋•Œ๋„ URLSession์„ ๋ชจ๋“ˆํ™”ํ•ด์„œ ์ผ์—ˆ๋Š”๋ฐ, ์•„์ง ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ด๋ฅผ ๋ชปํ–ˆ๋„ค์š”..

๋‚˜์ค‘์— ์กฐ๊ธˆ ๋” ์ดํ•ด๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ„๋‹ค๋ฉด ๊ทผ๋ณธ์ธ

URLSession์œผ๋กœ ๋‹ค์‹œ ์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค.. ํœด ~~ 

 

 

 

์ด ํŠœํ† ๋ฆฌ์–ผ์„ ์ฐธ๊ณ ํ•ด์„œ ๋ฒˆ์—ญ.. ํ–ˆ์Šต๋‹ˆ๋‹ค!!

 

Router pattern with Alamofire’s URLRequestConvertible protocol

If you are an iOS developer and have been developing for some time, your app probably needs to communicate with API over the network and…

mohammadrezakhatibi.medium.com

์ด์ œ ์‹ค์ œ๋กœ ์ ์šฉํ•ด๋ณด๋Ÿฌ ๋– ๋‚˜๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ~์•ˆ๋‡ฝ... 

Comments