iOS스터디/iOS

[iOS] URLSession Alamofire

슬라임 통통 2021. 3. 3. 19:00
728x90
Alamofire는 HTTP 네트워킹을 하는데 자주 사용하게 되는 코드나 함수를 더 쉽게 사용할 수 있도록 모아놓은 라이브러리

Alamore란 iOS, macOS를 위한 Swift 기반의 HTTP 네트워킹 라이브러리

Alamofire는 URLSession 기반이며 URLSession은 네트워킹 호출에서 모호한 부분이 많은데 Alamofire를 사용한다면 데이터를 접근하기 위한 노력을 줄일 수 있으며 코드를 더 깔끔하고 가독성 있게 쓰는 것이 가능해짐

 

 

 

URLSession

iOS에서 기본적으로 제공하고 있는 HTTP통신 방법은 여러가지가 있지만 URLSession을 이용한 방법이 대표적.

 

 

 

  • URLSession은 URLSessionConfiguration을 이용하여 생성을 하게 된다.
  • URLSession 여러개의 URLSessionTask를 만들수 있다. 이 URLSessionTask로 실제 통신을 하게 된다.
  • URLSession Delegate을 통해서 네트워크 중간과정을 확인할 수 있다. 필수는 아님.

 

 

URLSessionConfiguration을 만들 때는 3가지 타입분류로 나뉜다. 

  • Default : 기본 통신
  • Ephemeral : 쿠키나 캐시를 저장하지 않게 할 때 ( private모드랑 비슷 )
  • Background : 앱이 백그라운드에 있을 때, 컨텐츠 다운로드 등등 할 때

 

 

URLSessionTask도 3가지 작업으로 나뉨

  • URLSessionDataTask : 간단한 데이터를 받아올때 ( 백그라운드에서 진행은 안됨)
  • URLSessionUploadTask : 파일을 업로드할 때 씀.
  • URLSessionDownloadTask : 다운도르 할 때 씀.

 

 

 

 

  • URLComponuents를 이용하여 직접 넣어주기
  • URLQueryItem : 각각의 컴포넌트 접근 or 한국어,띄어쓰기 같은 글이 있을 경우 못알아들을 수 있음 자동인코딩해줌.

 

  • URLSession 이용해보기 =>  URLSessionConfiguration, URLSession  - dataTask 이용

 

=> 위의 받아진 내용포스트맨으로 확인하기

 

 

 

단점: 이런식의 코드는 가독성은 물론이며, 조금의 설정만 바꾸면 많은 것이 변경하여야함 => 이러한 불편한 것들을 개선시키는 라이브러리인 Alamofire를 사용하면 편하다. 

 

 

 

 

결론 : Alamofire를 쓰자

 

 

 

 

 

전체 코드

import UIKit

let config = URLSessionConfiguration.default
let session = URLSession(configuration: config)
var urlComponents = URLComponents(string: "https://itunes.apple.com/search?")!
let mediaQuery = URLQueryItem(name: "media", value: "music")
let entityQuery = URLQueryItem(name: "entity", value: "song")
let termQuery = URLQueryItem(name: "term", value: "지드래곤")
urlComponents.queryItems?.append(mediaQuery)
urlComponents.queryItems?.append(entityQuery)
urlComponents.queryItems?.append(termQuery)
let requestURL = urlComponents.url!

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"
    }
}

let dataTask = session.dataTask(with: requestURL) { (data, response, error) in
    guard error == nil else { return }
    
    guard let statusCode = (response as? HTTPURLResponse)?.statusCode else { return }
    let successRange = 200..<300
    
    guard successRange.contains(statusCode) else {
        // handle response error
        return
    }
    
    guard let resultData = data else { return }
    let resultString = String(data: resultData, encoding: .utf8)

    do {
        let decoder = JSONDecoder()
        let response = try decoder.decode(Response.self, from: resultData)
        let tracks = response.tracks
        
        print("--> tracks: \(tracks.count)  -\(String(describing: tracks.first?.title)), \(tracks.last?.thumbnailPath ?? "")")
        
        
        
    } catch let error {
        print("---> error: \(error.localizedDescription)")
    }
//    print("---> result : \(resultString)")
}

dataTask.resume()
728x90
반응형