개발을 잘하고 싶은 주니어?

URLSession 공부하기 - 2 (실습) 본문

개발/iOS

URLSession 공부하기 - 2 (실습)

데쿠! 2021. 11. 20. 02:34
반응형

오늘은 앞에서 배운 URLSession 개념을 이용해서 실제로 서버와 통신을 해보겠습니다.

제 경험을 봤을 때 이 부분은 실제로 과제 코딩 테스트가 있을 때 자주 나왔던 주제입니다.

그때 당시(라고 해봤자 한두달전...)에는 몰랐던 개념이었어서 당황을 해서 결국은 통과를 하지 못했었는데요... 다시는 그런 일이 없도록 공부를 해보겠습니다..!

이번 실습에서 사용할 url은 애플에서 제공하는 아이튠즈 사이트에서 제공하는 것입니다.

itunes search api라고 해서 구글에 검색을 해보시면 관련 내용을 찾아볼 수 있습니다. 물론 바로 찾으실 수 있게 링크도 제공해드립니다!

https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/iTuneSearchAPI/index.html

 

iTunes Search API: Overview

 

developer.apple.com

 

목표는 특정 url을 통해 곡 리스트를 받아서 위와 같이 화면에 보여주는 것입니다.

func getSongList(){
    // 1
    let config = URLSessionConfiguration.default
    let session = URLSession(configuration: config)
    // 2
    var urlComponents = URLComponents(string: "https://itunes.apple.com/search?")
    // 3
    let mediaQuery = URLQueryItem(name: "media", value: "music")
    let entityQuery = URLQueryItem(name: "entity", value: "song")
    let termQuery = URLQueryItem(name: "term", value: "Gdragon")
    urlComponents?.queryItems?.append(mediaQuery)
    urlComponents?.queryItems?.append(entityQuery)
    urlComponents?.queryItems?.append(termQuery)
    let requestURL = urlComponents?.url
    // 4
    let dataTask = session.dataTask(with: requestURL!) { data, response, error in
        // 5
        guard error == nil else { return }
        guard let statusCode = (response as? HTTPURLResponse)?.statusCode else { return }
        let successRange = 200..<300
        guard successRange.contains(statusCode) else {
            print("error http ---> \(error?.localizedDescription)")
            return
        }
        // 6
        guard let resultData = data else { return }
        let resultString = String(data: resultData, encoding: .utf8)
        do{
            // 7
            let decoder = JSONDecoder()
            let response = try decoder.decode(DataModel.self, from: resultData)
            self.tracks = response.tracks
        }catch{
            print("---> error: \(error.localizedDescription)")
        }
    }
    // 8
    dataTask.resume()
}

위의 getSongList는 특정 url을 통해서 데이터를 가져오는 함수입니다. 순서대로 보겠습니다.

1. 앞에서 말씀드렸듯이 URLSession을 생성할 때 URLSessionConfiguration이 필요합니다. (물론 추가적인 설정을 하고 싶지 않다면 shared 싱글톤 객체를 이용해도 됩니다.)

2. 그리고나서 URL객체를 생성을 해줘야 하는데 여기서는 URLComponents 구조체를 이용합니다. URL구조체를 사용해서 만들어도 되지만 url에 포함되어 있는 한글이나 띄어쓰기를 제대로 처리해주지 못합니다. URLComponents구조체로 생성을 하면 한글, 띄어쓰기같이 서버가 이해하지 못하는 것을 서버가 이해할 수 있게 인코딩해줍니다.

위에 사진에서 query의 값을 한글로 설정하고 실제 생성된 url을 보면 Korean뒤에 서버가 이해할 수 있는 언어로 인코딩 된 것을 볼 수 있습니다.

3. URLComponents의 string값을 보면 search뒤에 ?가 있는 것을 볼 수 있습니다. 서버에 GET 메서드를 요청할 때 url에 얻고자 하는 정보를 포함시켜서 보낼 수 있습니다. 이때 ? 뒤에 작성합니다.

그리고 나서 사진의 주소를 자세히 보면 각 query들이 &연산으로 연결된 것을 볼 수 있는데 이것의 의미는 media는 music이고 entity는 song이고 term은 Gdragon인 리스트를 원한다입니다. (여기서 굵게 표시된 이고가 &의 의미입니다.)

또한 이것들은 URLQueryItem으로 생성을 합니다. URLComponents로 url을 생성하면 이렇게 파라미터들을 따로 관리할 수도 있습니다.

원하는 query를 생성했으면 이것을 URLComponents의 queryItems배열에 추가를 해주면 결과적으로 원하는 url을 생성할 수 있습니다.

4. 여기서는 단순히 원하는 데이터를 얻는 작업만 하기 때문에 URLSessionDataTask를 이용합니다.

dataTask뒤에 클로저는 실제 네트워크 과정을 끝낸 후에 실행되는 completion handler입니다. 파라미터로는 data, response, error가 있습니다. 이것들은 모두 서버에서 보내는 것입니다.

response : 이 파라미터를 이용해서 서버에서 보내는 상태 코드를 확인할 수 있습니다. 만약 네트워킹에 성공을 하면 기본적으로 200을 보냅니다. 아래는 상태 코드가 잘 정리되어있는 블로그입니다. 참고하셨으면 좋겠습니다.

https://www.whatap.io/ko/blog/40/

 

HTTP 상태 코드 정리 | 와탭 블로그

HTTP 응답 상태 코드의 목록을 정리하여 소개합니다. 클라이언트의 요청에 따라 어떻게 서버가 응답하는지 알아봅시다.

www.whatap.io

 

HTTP 응답 상태 코드의 목록을 정리하여 소개합니다. 클라이언트의 요청에 따라 어떻게 서버가 응답하는지 알아봅시다.

data : 우리가 원하는 데이터입니다. 우리는 이것을 가지고 원하는 액션을 취할 수 있습니다.

error : 만약 오류가 발생했을 때 error를 이용해서 확인할 수 있습니다.

6. 우선 데이터를 String을 이용해서 인코딩해줍니다.

7. 그러고 나서 do-catch 구문을 내에서 디코딩을 진행합니다. 디코딩할 때는 미리 만들어둔 DataModel객체의 형태로 디코딩되도록 합니다.

struct DataModel: Codable{
    let trackCount: Int
    let tracks: [Track]

    enum CodingKeys: String, CodingKey{
        case trackCount = "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"
    }
}

8. 마지막으로 dataTask.resume()을 통해서 실제로 코드가 실행이 되도록 하면 끝입니다.

위의 Codable 관련해서는 따로 게시글을 만들 예정입니다. 그리고 ui 구성 같은 경우에는 단순해서 따로 언급하지 않아도 될 듯합니다. (table view도 마찬가지!)

 

 

본 게시글은 패스트 캠퍼스 iOS 앱 개발 올인원 패키지 Online 수업을 듣고 예제를 만들면서 공부한 내용입니다.

반응형

'개발 > iOS' 카테고리의 다른 글

URLSession 공부하기 - 3  (0) 2021.11.23
Diffable Data Source 공부하기 - 2 (실습)  (0) 2021.11.21
URLSession 공부하기 - 1 (이론)  (0) 2021.11.19
Diffable Data Source 공부하기 - 1 (이론)  (0) 2021.11.05
Compositional Layouts  (1) 2021.10.24
Comments