๊ธฐํƒ€/iOS๐ŸŽ

[Swift/iOS] ์‹ค์ œ API๊ฐ€ ๋‚˜์˜ค๊ธฐ ์ „, Mock json์„ ์ด์šฉํ•œ ๊ฐ€์งœ ํ†ต์‹ 

yujindonut 2022. 6. 13. 14:19
728x90

1. ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ๋งŒ๋“ ๋‹ค

2. API ๋ช…์„ธ์„œ์— ๋”ฐ๋ผ ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ  ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•œ๋‹ค.

    2-1. ๋ชจ๋ธ์„ ๊ตฌ์„ฑํ•˜๊ณ , ์ž„์˜๋กœ ๋”๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ ๋‹ค.

    2-2. json ํŒŒ์ผ์„ ์ด์šฉํ•ด์„œ ํ†ต์‹ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•œ๋‹ค. (๊ฐ€์งœ ํ†ต์‹ )

 

1. json ํŒŒ์ผ ์ƒ์„ฑํ•˜๊ธฐ 

- strings File๋กœ ์ž‘์„ฑํ•˜๊ณ  .json ํ™•์žฅ์ž ๋ถ™์—ฌ์ฃผ๊ธฐ! -> Use .json ํด๋ฆญ

Mock : ๋ชจ์กฐํ’ˆ

[
    {
        "userId": 1,
        "id": 1,
        "title": "delectus aut autem",
        "completed": false
    },
    {
        "userId": 1,
        "id": 2,
        "title": "quis ut nam facilis et officia qui",
        "completed": false
    },
    {
        "userId": 1,
        "id": 3,
        "title": "fugiat veniam minus",
        "completed": false
    },
    {
        "userId": 1,
        "id": 4,
        "title": "et porro tempora",
        "completed": true
    },
]

2. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์ƒ์„ฑ

import Foundation

struct Todo: Codable {
    let userId: Int
    let id: Int
    let title: String
    let completed: Bool
}

3. Mock Parser ์ƒ์„ฑํ•˜๊ธฐ

- json์„ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€ํ™˜ ๊ณผ์ •

 

import Foundation

final class MockParser {
    static func load<D: Codable>(_ type: D.Type, from resourceName: String) -> D? {
    // type : ๋””์ฝ”๋”ฉ ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋ธ์˜ ํƒ€์ž…
    // resourceName : json ํŒŒ์ผ์˜ ์ด๋ฆ„
        guard let path = Bundle.main.path(forResource: resourceName, ofType: "json") else {
            return nil
        }
    	// ํ™•์žฅ์ž๊ฐ€ json์ธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ถ€๋ถ„
        guard let jsonString = try? String(contentsOfFile: path) else {
            return nil
        }
     	// ํŒŒ์ผ ์•ˆ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ(json)์„ String ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค
        print(jsonString)
        
        let decoder = JSONDecoder()
        let data = jsonString.data(using: .utf8)
        // string ํ˜•ํƒœ๋กœ ๊ฐ€์ ธ์˜จ json์„ dataํ˜•์œผ๋กœ ๋ณ€ํ™˜
        print(data)
        
        guard let data = data else { return nil }
        return try? decoder.decode(type, from: data)
        // data๋ฅผ swift ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด decodingํ•˜๋Š” ๊ณผ์ •
    }
}

 

3. ์„œ๋น„์Šค ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

import Foundation

final class TodoManager {
    // service code
    static let shared = TodoManager()
    private init() {}
}

extension TodoManager {
    func getTodoMock() -> [Todo] {
        return MockParser.load([Todo].self, from: "Todo")!
    }
}

 

 

 

 

728x90