Networking 동작에 대해서 배워보자

Chap 14-1. 네트워킹 오버뷰

상당히 많은 앱에서 이미 중요한 기능이다.

넷플릭스, 애플뮤직, 페이스북 등

세 개의 앱 모두 네트워킹이 중요한 기능이다.

 

넷플릭스부터 보면,

  1. 컨텐츠 리스트를 받아올때,
  2. 사용자 회원정보를 서버로부터 받아올 때,
  3. 컨텐츠를 시작할 때, (동영상스트리밍)

 

애플뮤직

1. 컨텐츠 리스트를 받아올 때,

2. 사용자 정보를 받아올 때,

3. 사용자가 클릭한 음악을 재생요청할 때, (음악 스트리밍)

 

페이스북

1. 뉴스피드에 컨텐츠를 받아올 때

2. 사용자 정보를 받아올 때,

3. 새로운 노티 정보 

 

Networking 이 안된다면???

대부분 기능을 못 할 것이다.

 

iOS에서는 어떻게 Networking 기능을 하게 되는 걸까?

iOS에서는 URLSession 을 통해서 구현한다.

 

컴퓨터 입장에서는 네트워크는 매우 느린 작업이다. 메모리접근, 디스크파일 읽기 등에 비해서는 상당히 느린 작업이라고 할 수 있다.

Networking is Slow.....

 

사용자 입장에서는 네트워크 유무와 상관없이 앱의 반응성이 상당히 중요하다.

앱이 네트워킹하는 동안에 로딩중만 계속 뜨면 화가 날 것이다.

 

사용자를 화나게 하는 원인은 뭘까? 동시성을 만족해주지 못해서이다.

동시성(Concurrency) : 동시에 여러 개의 일을 수행하는 능력.

 

App + Concurrency 를 만족해야하는 것이 중요하다. 

IOS에서는 GCD & Operations 을 통해서 동시성이 필요한 작업들을 관리해 줄 수 있다.

 

특히 GCD를 통해서 어떻게 하면 동시성을 안정적으로 만족시킬지 공부할 예정이다.

 

이번 Networking 챕터에서는 

  • Concurrency
  • GCD
  • HTTP
  • URLSession

을 배울 예정이다.

 

Chap 14-2. HTTP 개념

Networking : 서버와 앱 간에 데이터를 주고 받는 것

어떻게? HTTP 라는 방법으로  REST API 를 이용해서 JSON 타입의 데이터를 주고 받는다.

HTTP는 웹사이트 주소에서도 나타난다. 왜냐하면, 서버에서 데이터를 받을 때, HTTP 라는 방법을 쓰자고 약속했기 때문이다.

JSON은 전 세계적으로 쓰자고 약속한 것은 아니지만, 대부분의 기업에서 이 타입의 데이터를 쓴다.

 

HTTP (Hyper Text Transfer Protocol)

: 원래는 클라이언트  측의 HTML 등의 document 타입을 서버에게 전송하는데 사용했었는데, 인터넷 사용이 폭발적으로 증가하면서, 다양한 데이터 타입을 HTTP를 통해서 보낼 수 있게 되었다.

 

어떻게 작동하지?

서버와 클라이언트는 메시지를 주고 받는 형식으로 의사소통을 한다.

-> 어떻게? 적절한 HTTP request Method 와 URL 을 사용해서 의사소통한다.

 

클라이언트가 서버에게 request 메시지를 보낸다. 예: 인기가요 100 보여줘

서버는 JSON 형태의 데이터를 사용해서, 요청에 대한 응답으로 response 메시지를 보낸다.

 

어떻게 Request를 보내지? 

HTTP Request Method 4가지.

1. POST : create

2. GET : read

3. UPDATE : Update

4. DELETE : Delete

 

우리는 사실 일상적으로 Get 을 이용해서 HTTP request method 를 보낸다. 

예) 우리는 구글링을 하기 위해서 주소창에다가 URL을 입력하고 엔터를 친다. -> 서버에 request를 하는 방식

 

URL(Uniform Resource Locator) : 리소스의 주소를 나타내는 것

우리는 URL을 통해서 서버에 요청을 하는 것이다. 

request를 좀 더 자세히 살펴보자.

 

Request를 할 때, Request header & body 를 통해서 우리가 필요한 정보들을 추가적으로 실어서 요청을 한다.

응답할 때도 Header 와 Body 로 나누어져서 내려오게 된다.

Header에는 아주 중요한, 상태코드가 같이 내려온다. 

예) HTTP/1.1 200 ok //서버 상태 괜찮다는 뜻

body 에는 content type 이 담겨 있다. 어떤 타입의 데이터가 전달될 것인가를 알려준다.

 

예전에는 망 환경 때문에 텍스트만 주기 급급했는데, 이젠 동영상을 보낼 때도 HTTP를 이용한다.

HLS ( HTTP Live Streaming) 을 이용해서 영상, 음원을 보낸다.

 

 

Chpa 14-3. HTTP 실습

 

구글에다가 POSTMAN 을 검색해서 다운받자. POSTMAN 을 이용해서 HTTP 방식으로 네트워킹 할 수 있다. 

POSTMAN

 

 

Chap 14-4. Concurrency (동시성)

쉬운 말로 하면, 한 번에 여러 개의 일을 하는 것을 의미한다.

App은 한 번에 여러 개의 일을 해야한다!

 

App은 무슨 일을 할까?

-사용자 인터랙션 처리

- 네트워킹

- 백그라운드에서 파일 다운로드

- 파일 저장하고 읽기

 

만약 네트워킹을 하느라 사용자 인터랙션 처리를 하지 않으면? 사용자가 빡침

그러므로, App은 항상 동시에 여러 개의 일을 하고 있는 것처럼 모습을 보여야 한다.

 

먼저 각각 일에 대해서 작업 번호를 지정해주자.

작업 1. 사용자 인터랙션 처리

작업 2. 네트워킹

작업 3. 백그라운드에서 파일 다운로드

작업 4. 파일 저장하고 읽기

 ++ 컴공에서는 이러한 작업을 스레드라고 한다.


스레드1

스레드2

스레드3

스레드 4 

모두 동시에 처리하는 모습을 보여주어야 한다.

스레드 간 작업을 엄청 빨리 전환시켜주어서, 동시에 여러 개를 수행하는 효과를 보고 있다.

 

ㅋㅋㅋ강사님이 설명해주신 예시. 굶어죽기 싫으면 동시성을 늘려야한다!!

 

앱으로 돌아와보면, 앱에서는 스레드를 동시에 처리해주어야 한다(사실 동시에 하는 것처럼 보여야 한다).

특히, 작업 1 과 같은 사용자 인터렉션 스레드에 대해서는, 메인 스레드에서 처리하도록 설계가 되어있다. 

메인 스레드는 사용자 인터렉션 스레드를 처리하는 동시에 UI 표시하는 작업을 하고 있다.

따라서 복잡한 계산이나 네트워킹처럼 느린  작업은 메인 스레드가 아닌 다른 스레드에서 처리해야 앱의 반응성을 빠르게 가질 수 있다.

그래서 우리는 의도적으로 UI 관련, 사용자 인터렉션 관련 일들은  메인 스레드에서 처리하고, 나머지 일은 다른 스레드에서 처리하도록 코드를 작성해주어야 한다.

 

 

Chap 14-5~6. GCD 개념, 실습

iOS 개발 시, 동시성을 제공해주기 위해 사용되는 API 에 GCD가 있다.

 

GCD(Grand Central Dispatch)

-해야할 일들(코드블럭)을 만들어서 GCD에 넘기면 시스템에서 알아서 스레드 할당해서 안전하게 수행시켜준다.

-스레드 위에 만들어진 녀석.(스레드랑 개념이 비슷하다)

-Task를 Queue를 이용해서 관리한다.

 

Queue ; 컴공에서 말하는 하나의 자료구조

-> First In First Out 만 알면 된다!!! 먼저 들어 온 게 먼저 나감

 

GCD 에서 사용하는 queue 는 Dispatch Queue 이다.

 

Dispatch Queue 의 타입

1.  Main Queue ; 메인 스레드에서 작동하는 큐

2. Global Queue; 시스템에 의해 관리되는 큐. 

QoS(Qulity of Service);작업우선순위

1. userInteractive; 메인 스레드에서 사용자 터치와 같이 제일 급한 거 처리할 때

2. userInitiated; 사용자의 결과를 기다리는 작업; 거의 바로 수행되어야 하는 작업

3. default; 1, 2 보다 덜 중요한 작업

4. utility; 수초에서 수 분 걸리는 작업

5. background; 보통 사용자에게 당장 인식될 필요 없는 작업

 

3.  Custom Queue

Dispatch Queue를 직접 만든다. 

 

 

두 개의 Queue 같이 쓰기

-작업간에 의존해야하는 상황일 때, 

-예) 큰 이미지 파일을 다운받고 나서 화면에 그 이미지를 보여주기 (결과에 따라 UI 보여줘야할 때)

 

 

이제 Queue 에 들어온 Task 를 어떻게 수행해야할 지 결정하는 방법을 배워보자.

GCD에서는 Task를 동기, 비동기식으로 수행할 수 있다.   

Sync: 앞의 작업이 다 끝나고 나서 작업을 시작하는 것

Async: 앞의 작업이 다 끝나지 않았음에도 다음 일을 시작하는 것.

 

1. Async

상황:

둘 다 global 큐,

위의 코드는 우선순위가 낮게 backgraound, 아래 코드는 우선순위 높도록 userInteractive

둘 다 Async로 작업 수행하도록 하였다.

Async 이기 때문에, 노란색 이모지가 다 나오지 않았는데도 보라색 이모지가 나온다.

우선순위 차이에 따라서 수행이 된다는 점도 확인이 가능하다.

 

2. Sync

우선순위가 낮음에도 불구하고, sync이기 때문에 앞의 작업이 다 끝나야 다음 작업이 시작됨을 알 수 있다.

 

--> sync작업은 뒤의 프로그램을 블록시킨다는 것을 알게 되었다.

--> 무거운 작업을 Sync로 잡아버리면, 뒤의 작업이 불가하기 때문에, 용량이 큰 파일 다운로드 등의 작업은 Async를 사용한다.

 

Chap 14-7. URLSession 개념

데이터 주고 받을 때 , HTTP 프로토콜을 사용한다.

URLSession 는 URLSessionConfiguration을 통해서 생성된다. 

생성된 URLSession은 여러 개의 URLSessionTask를 만들 수 있다. 또한, URLSession은 Delegate를 통해서 네트워킹 중간 과정을 확인 할 수 있다(필수아님)

 

URLSessionConfiguration Class 타입 세 가지

1. Default : 기본 통신할 때(대부분 이거 사용)

2. Ephemeral: 쿠키, 캐시를 저장하지 않을 때 (크롬이나 사파리에서의 프라이빗 모드)

3. Backgraound : 앱이 백그라운드있을 때

 

URLSessionTask 세 가지

1. URLSessionDataTask: 기본적으로 데이터 받는 작업, 

2. URLSessionUploadTask: 파일 업로드 할 때 

3. URLSessionDownloadTask: 파일 다운로드 받을 때

 

즉, iOS에서 Networking 할 때는 URLSession을 사용한다.

 

Chap 14-8~10. URLSession 실습

1. URL 생성방법

 

 

 

+ Recent posts