Notice
Recent Posts
Recent Comments
Link
๊ด€๋ฆฌ ๋ฉ”๋‰ด

lgvv98

๐Ÿ˜ผ ch15 ๊ฒ€์ƒ‰์„ ์ด์šฉํ•ด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ํŒŒ์‹ฑ๊นŒ์ง€! ๋ณธ๋ฌธ

โš ๏ธ deprecated โš ๏ธ/ํŒจ์บ (์˜ฌ์ธ์›)

๐Ÿ˜ผ ch15 ๊ฒ€์ƒ‰์„ ์ด์šฉํ•ด ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ํŒŒ์‹ฑ๊นŒ์ง€!

๐Ÿฅ• ์บ๋Ÿฟ๋งจ 2021. 6. 29. 11:28

โœ… ์ด๋ฒˆ์‹œ๊ฐ„์—๋Š” ์„œ๋ฒ„์—์„œ API๋ฅผ ๋ฐ›์•„์™€์„œ ํŒŒ์‹ฑ๊นŒ์ง€ ํ•˜๋Š” ๊ฒƒ์„ ์•Œ์•„๋ณด์ž!

 

โœ… ์ด๋ฒˆ์‹œ๊ฐ„์— ์•Œ์•„๋ณผ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ์ด๋‹ค.

class SearchAPI {
    static func search(_ term: String, completion: @escaping ([Movie]) -> Void) { // completion ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
        // ์ด์Šค์ผ€์ดํ•‘์ด ์žˆ์œผ๋ฉด ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ๋‚˜์„œ ์‹คํ–‰
        
        let session = URLSession(configuration: .default) // 1. ์„ธ์…˜ ๋งŒ๋“ค๊ธฐ
        
        var urlComponents = URLComponents(string: "https://itunes.apple.com/search?")!
        let mediaQuery = URLQueryItem(name: "media", value: "movie")
        let entityQuery = URLQueryItem(name: "entity", value: "movie")
        let termQuery = URLQueryItem(name: "term", value: term)
        urlComponents.queryItems?.append(mediaQuery)
        urlComponents.queryItems?.append(entityQuery)
        urlComponents.queryItems?.append(termQuery)
        
        let requestURL = urlComponents.url! // 2. url ๊ตฌ์„ฑ
        
        let dataTask = session.dataTask(with: requestURL) { data, response, error in
            let successRange = 200..<300
            guard error == nil,
                let statusCode = (response as? HTTPURLResponse)?.statusCode,
                successRange.contains(statusCode) else {
                // ์—๋Ÿฌ๊ฐ€ ์—†๊ณ , ์ƒํƒœ์ฝ”๋“œ์— ์‘๋‹ต์— ๋Œ€ํ•œ HTTPURLResponse์—์„œ ์ฐพ์•„ ํ• ๋‹นํ•˜๊ณ , ์ƒํƒœ์ฝ”๋“œ๊ฐ€ ๋ฒ”์œ„ ์•ˆ์— ํฌํ•จ๋œ๋‹ค๋ฉด ์Šค๋ฌด์Šคํ•˜๊ฒŒ ๋„˜์–ด๊ฐ€๊ณ 
                // ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด completion์„ ๋นˆ ๋ฐฐ์—ด์„ ์ค€๋‹ค
                    completion([]) // completion๋ถ€๋ถ„์— ์•„๋ฌด๊ฒƒ๋„ ์ •๋ณด๋ฅผ ๋‹ด์ง€ ์•Š๋Š”๋‹ค.
                    return
            }
            
            guard let resultData = data else {
                // ์œ„์˜ error์ด ์—†๋Š”๊ฑธ ํ™•์ธํ–ˆ๊ณ , dataTask์˜ data๋ฅผ ๊ฒฐ๊ณผํ…Œ์ดํ„ฐ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜๋Š”๋ฐ, ์ด ์ž‘์—…์ด ์‹คํŒจํ•˜๋ฉด completion์— ๋นˆ๋ฐฐ์—ด ์ฃผ๊ณ  ๋ฆฌํ„ด
                completion([])
                return
            }
            
            let movies = SearchAPI.parseMovies(resultData) //
            completion(movies)
        }
        dataTask.resume() // 3. resume์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๊ธฐ
    }
    
    static func parseMovies(_ data: Data) -> [Movie] { // ํƒ€์ž…๋ฉ”์†Œ๋“œ๋กœ ์„ ์–ธ
        let decoder = JSONDecoder() // 1. ๋””์ฝ”๋” ์„ ์–ธํ•˜๊ณ 

        do {
            let response = try decoder.decode(Response.self, from: data) // data๋กœ๋ถ€ํ„ฐ Responseํƒ€์ž…์œผ๋กœ ๋””์ฝ”๋”ฉ!
            let movies = response.movies
            return movies
        } catch let error {
            print("--> parsing error: \(error.localizedDescription)")
            return []
        }
    }
}

struct Response: Codable {
    let resultCount: Int
    let movies: [Movie]
    
    enum CodingKeys: String, CodingKey {
        case resultCount
        case movies = "results"
    }
}

struct Movie: Codable {
    let title: String
    let director: String
    let thumbnailPath: String
    let previewURL: String
    
    enum CodingKeys: String, CodingKey {
        case title = "trackName"
        case director = "artistName"
        case thumbnailPath = "artworkUrl100"
        case previewURL = "previewUrl"
    }
}

 

์šฐ์„  search ์ชฝ์—์„œ URL ์„ธ์…˜์„ ํ†ตํ•ด ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ์–ด.

๊ทธ ๋‹ค์Œ์— dataTask ์ชฝ์ธ๋ฐ ๋ณผ๊นŒ?

์šฐ์„  successRange๋Š” HTTP ์‘๋‹ต์ฝ”๋“œ์—์„œ 200๋ฒˆ๋Œ€๊ฐ€ ์„ฑ๊ณต์ ์ธ ์‘๋‹ต์ด๋ผ์„œ ์ €๋ ‡๊ฒŒ ๋ฒ”์œ„๋ฅผ ์ •ํ•œ๊ฑฐ์•ผ.

๊ทธ ๋‹ค์Œ์—๋Š” ์—๋Ÿฌ๊ฐ€ ์—†๊ณ , ์‘๋‹ต์ฝ”๋“œ๊ฐ€ ์„ฑ๊ณต์ ์ธ ๋ฒˆํ˜ธ์— ์†ํ•˜๋ฉด guard ๋ฌธ์„ ์ง€๋‚˜๊ฐ€์•ผ๊ฒ ์ง€?

๊ทธ ๋‹ค์Œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•ด์„œ ๊ทธ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋ณด๋‚ด์ฃผ๋ฉด ๋ผ.

๊ทธ ๋‹ค์Œ์€ parseMovie ์ชฝ์ธ๋ฐ ์Šคํƒœํ‹ฑ ๋ฉ”์†Œ๋“œ๋ผ ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ผ.

โ—๏ธ ๊ทธ๋ฆฌ๊ณ  ์ œ์ผ ์ค‘์š”ํ•œ๊ฒŒ resume ๊ผญ ์ž‘์„ฑํ•ด์ค˜์•ผ ์ฝ”๋“œ๊ฐ€ ์ž‘๋™ํ•˜๋‹ˆ๊นŒ.. ์žŠ์ง€๋ง๊ธฐ!

 

โœ… parseMovie ์ชฝ์ด ์ด์ œ ์ง„์งœ parsing ๋ถ€๋ถ„์ด์•ผ.

1. ๋ฐ˜ํ™˜ํ•  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ช…์‹œํ•˜๊ณ ( ํ•จ์ˆ˜ ์„ ์–ธ๋ถ€์— )

2. JSONDecoder๋ฅผ ๋Œ€์ž…ํ•˜๊ณ  ( JSON ํŒŒ์ผ ๋””์ฝ”๋”ฉ ํ•  ์˜ˆ์ •์ด๋ผ์„œ )

3. decoder.decode๋ฅผ ํ†ตํ•ด ํŒŒ์‹ฑ์„ ์–ด๋–ป๊ฒŒ ํ• ๊ฑด์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์ •ํ•ด์ฃผ๋Š”๋ฐ ( try๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฑด ์ด์œ ๋Š” ์ด ์ž‘์—…์ด ์‹คํŒจํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ) 

--> ์‹คํŒจํ•˜๋ฉด catch๋กœ ์ด๋™

decode์˜ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ฉด 

 ์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์–ด๋–ค ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ€๊ฑด๊ฐ€

 ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ(from)๋Š” ๋ฐ”๊ฟ€ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ค๊ฑด์ง€

์ฆ‰ from A to B (A์—์„œ๋ถ€ํ„ฐ B๋กœ) ์˜ ์˜๋ฏธ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ๋‹ค.

4. ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ๊ฑด movies์ธ๋ฐ, ์‘๋‹ต๋ฐ›์•„์˜จ๊ฑฐ๋ฅผ ๋‹ค ์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ทธ ์ค‘์—์„œ movies์— ๋Œ€ํ•œ ์ •๋ณด๋งŒ ํ•„์š”ํ•จ์œผ๋กœ ๊ทธ์— ๋งž๊ฒŒ๋” ๋ณ€ํ™˜ํ•ด์ค€ ๋ชจ์Šต์ด์•ผ. 

๐Ÿ“ก ๋‚ด๊ฐ€ ์˜ˆ์‹œ์—์„œ ์‚ฌ์šฉํ•œ ๋ฐ์ดํ„ฐ์—์„œ JSON ํŠธ๋ฆฌ ๊ตฌ์„ฑ๋œ๊ฑธ ์ฐธ๊ณ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

5. ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ movies์˜ ํ˜•ํƒœ๋กœ ๋ฆฌํ„ด!

var movies: [Movie] = [] // ๋‹ค๋ฅธ viewController์—์„œ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ

์œ„์— ์ด๋Ÿฐ ์‹์œผ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค!

 

โœ… CodingKey ์ € ๋ถ€๋ถ„์€ Codable์„ ์‚ฌ์šฉํ•  ๋•Œ, ์„œ๋ฒ„์—์„œ ๋‚ด๋ ค์ค€ key์™€ ์šฐ๋ฆฌ๊ฐ€ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ช…์ด ๊ฐ™์•„์•ผ๋งŒ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋ฐ, ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๋ณ€์ˆ˜๋ช…์œผ๋กœ ๋ฐ”๊ฟ”์ค„ ๋•Œ ์ € ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

โ—๏ธ ์ฝ”๋”ฉํ‚ค ์ชฝ์— s ์ž˜๋ชป ๋ถ™์—ฌ์„œ ์—๋Ÿฌ ๋งŽ์ด ๋‚ด๋Š”๋ฐ,,, ์ด๊ฑฐ ์Šค์Šค๋กœ ์ฃผ์˜ํ•˜์ž...

 

 

(์ถ”๊ฐ€)

JSONSerializaition์„ ์“ฐ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ ์˜ˆ์ œ์—์„œ๋Š” JSON์—์„œ ํ•˜๋‚˜์˜ key:value๋งŒ ํ•„์š”ํ•˜๋‹ˆ๊นŒ ์ด๊ฒŒ ํ•„์š” ์—†์—ˆ์ง€๋งŒ ๋งŒ์•ฝ JSON์„ ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด์‹์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผํ•˜๋ฉด ์ด ์ฝ”๋“œ๊ฐ€ ๊ผญ ๋“ค์–ด๊ฐ€์•ผํ•œ๋‹ค. 

์ด์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด ํฌ์ŠคํŒ…์„ ์ฐธ๊ณ ํ•˜๊ธฐ

https://rldd.tistory.com/126

 

Comments