버그 잡이

iOS - 네트워크 통신 (URLSession) 본문

IOS

iOS - 네트워크 통신 (URLSession)

버그잡이 2020. 8. 12. 22:20

URLSession

 

URLSession은 HTTP/HTTPS를 통해 콘텐츠(데이터)를 주고받는 API를 제공하는 클래스입니다.

이 객체를 통해서 네트워크 통신을 할 수 있습니다.

보통 alamofire , moya와 같은 네트워크 라이브러리를 통해서 네트워크 통신을 수행 하지만 이들 또한 URLSession을 기반으로 하고 있기 때문에 이에 대해서 이해할 필요가 있습니다.

 

URLSession은 URLSessionConfiguration을 통해 다음 세가지 유형의 URL을 생성할 수 있습니다.

  1. 기본 세션 (Default Session) : 기본적으로 사용하는 방법으로 디스크에 저장하는 방식입니다.

  2. 임시 세션 (Ephemeral Session) : 기본 세션과 유사하지만, 디스크에 데이터를 저장하지 않고, 메모리에 올려 세션과 연결합니다. 따라서 애플리케이션이 세션을 만료시키면 세션과 관련한 데이터가 사라집니다.

  3. 백그라운드 세션 (Background Session) : 별도의 프로세스를 사용하여 백그라운드에서 작업한다는 점을 제외하면 기본 세션과 유사합니다.

let defaultSession = URLSession(configuration: .default)
let ephemeralSession = URLSession(configuration: .ephemeral)
let backgroundSession = URLSession(configuration: .background)

 

URLSession.shared

  • URLSession에서 기본 제공하는 singleton객체로 별도의 URLSession 생성 없이 URLSession을 사용할 수 있습니다.
  • Configuration을 활용하는 것보다 상대적으로 가볍게 작업 처리가 가능하다.(속도가 좀 더 빠르다고 합니다.)
  • 단, delagate와 configuration을 사용할 수 없다는 단점이 있다.

 

 

 

 

 

URLSessionTask

 

URLSessionTask는 작업 객체(task object)를 나타내는 추상 클래스 입니다. URLSession은 데이터를 가져오거나 파일을 업로드, 다운로드 하는 작업을 수행하는 테스크를 생성합니다.

즉, URLSession객체를 생성하고, 이에 하고자 하는 task를 붙여서 원하는 네트워크 통신 작업을 수행하는 것 입니다.

데이터 작업(Data Task), 업로드 작업(Upload Task), 다운로드 작업(Download Task)을 지원합니다.

 

  1. URLSessionDataTask
    • 서버에서 데이터를 받아오는 task를 수행합니다.
  2. URLsessionUploadTask
    • 웹서버로 파일을 전송할때 이 task를 수행합니다.
  3. URLSessionDownloadTask
    • 서버로부터 데이터를 다운로드 받아서 파일의 형태로 저장하는 task를 수행합니다.
    •  

테스크는 일시정지(suspend), 재개(resume), 취소(cancel)할 수 있습니다.

  • task는 시작시 일시정지 상태이기 때문에 resume()를 task를 시작해줘야 합니다.(아래 예시 참고)

 

 

 

사용 예시

guard let url = URL(string: "https://...") else {return}

let session = URLSession(configuration: .default)
let dataTask = session.dataTask(with: url) { (data: Data?, response: URLResponse?, error: Error?) in
	
    guard let data = data else {return}

    do {
      //받은 json데이터 파싱
      let result : Movie = try JSONDecoder().decode(Movie.self, from: data)
    } catch(let e) {
    	print(e)
    }

}.resume()   //모든 task()는 일시정지 상태로 시작하기 때문에 resume()으로 task()를 시작해야합니다.

 

 

*참고

https://www.edwith.org/boostcourse-ios/lecture/16863/

반응형
Comments