Archive/패캠(올인원)

📡 ch14 URLSession (feat. Codable)

lgvv 2021. 6. 28. 12:29

✅ 자 그럼 이번시간에는 URLSession에 대해서 알아보도록 하자.

URLSessoon에 대한 설명

✅ URLSessionConfiguration Class에 대해서 보자

URLSessionConfiguration Class

대부분은 default로 사용 가능하다.

Ephemeral 같은 경우는 크롬의 시크릿모드 처럼 쿠키나 정보들을 저장하지 않을 때 이용한다.

 

✅ 다음은 URLSessionTask다 

이걸 통해서 실제로 서버와 통신한다.

URLSessionTask

데이터 받는거면 DataTask를 사용하면 된다. 이건 background 세션에 대한 지원이 안되서 네트워킹을 통해 데이터를 받아오는게 안된다. 

나머지 2개는 업로드랑 다운로드에 사용한다.

 

✅ 그럼 이제 코드리뷰를 몇몇 부분만 한번 봐볼까? (코드에 대한 내용은 이 글의 맨끝에 첨부해 두었어) 

 

⭐️1️⃣ Codable의 사용

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

struct Track: Codable {
    let title: String
    let artistName: String
    let thumbnailPath: String
    
    enum CodingKeys: String, CodingKey {
        case title = "trackName"
        case artistName
        case thumbnailPath = "artworkUrl100"
    }
}

그토록 내가 어려워했던 Codable이야. 

Codable은 인코딩과 디코딩을 쉽게해주는데, 주의할점은 변수명이 파일을 내려받는 이름이랑 일치해야한다는 점이야.

하지만 우리가 사용하는 변수명으로 바꾼다면 더욱 좋겠지?

그래서 우리가 채택한 방법인 enum CodingKey ~ 이 부분이야

네트워크를 통해 받아온 변수를 그대로 사용할거면, 그냥 냅두면 되는데, 그렇지 않고 바꾸고 싶은 경우에는 위처럼 대입해서 사용할 수 있어. 

그리고 Codable 사용시 생성자를 통해서 init하는 과정이 필요한데, CodingKeys 부분이 이걸 대신해주고 있기도 해!!

참 편리하지?

 

2️⃣ 다음으로는 파싱하는 부분과 데이터를 가져오는 부분이야

let dataTask = session.dataTask(with: requestURL) { (data, respnse, error) in
    guard error == nil else { return } // 에러가 있으면 그냥 끝내기
    
    guard let statusCode = (respnse as? HTTPURLResponse)?.statusCode else { return } // 위키피디아에 들억가면 에러코드에 대한 설명이 나온다.
    let successRange = 200..<300 // 200에서 300전까지의 숫자
    
    guard successRange.contains(statusCode) else {
        // handle response error
        return
    }
    
    guard let resultData = data else { return }
    let resultString = String(data: resultData, encoding: .utf8)
    //print("-->result\(resultData)")
    
    // 목표 : 트랙리스트 오브젝트로 가져오기
    
    // 하고 싶은 작업 목록
    // - Data -> Track 목록으로 가져오고 싶다 [Track]
    // - Track 오브젝트를 만들어야 겠다
    // - Data에서 struct로 파싱하고 싶다 > Codable 이용해서 만들자
    //  - JSON 파일, 데이터 > 오브젝트 (Codable 이용하겠다)
    //  - Response, Track 이렇게 두개 만들어야 겠다.
    
    // 해야할 일
    // - Response, Track struct
    // - struct의 프로퍼티 이름과 실제 데이터의 키와 맞추기 (Codable 디코딩 하기 위해서)
    // - 파싱하기 (Decoding)
    // - 트랙리스트 가져오기
    
    
    // 파싱 및 트랙 가져오기
    do {
        let decoder = JSONDecoder()
        let response = try decoder.decode(Response.self, from: resultData) // try는 이 작업이 항상 성공한다는 보장이 없다는 말. 실패시 catch로 이동 -> 리절트 데이터를 리스폰스.self로 디코딩한다.
        let tracks = response.tracks
        
        print("--> tracks : \(tracks.count)")
    } catch let error {
        print("--> error : \(error.localizedDescription)")
    }
    
}

dataTask.resume()

 

서버에서 내려오는 데이터가 에러가 날 수 있는 상황을 가정해서 guard문으로 보호하고, 에러 처리 후 가져오면 ㅍ돼

try 구문도 작업이 항상 성공한다는 보장은 없으니까 꼭 사용하길 바래 그 경우 catch로 이동해서 핸들링하게 

디코딩 하는 코드는 쭉 보면 쉽게 이해되니까 천천히 살펴보고

구체적인건 깃허브 방문해서 알아보도록 하자

 

 

https://github.com/lgvv/fastCampus/tree/main/URLSession.playground

 

lgvv/fastCampus

Contribute to lgvv/fastCampus development by creating an account on GitHub.

github.com

 

실습을 보면 간단하게 이해되니 찾아보기!!

 

(추가)

✅  그럼 실제로 서치바를 이용해서 텍스트를 입력한 뒤 네트워크를 통해 받아오는 과정을 알아보자!