Ch 07. 부르어리 소개 앱 만들기
기능 상세:
- API를 통해서 가져온 맥주 데이터를 레이아웃으로 전달
- 적절한 시점에 다시 데이터를 패칭
- 25개 단위로 페이지네이션을 통해 스크롤을 내리면 추가적으로 데이터를 불러올 수 있게 구성
- 각각의 맥주를 탭하면 디테일 뷰 설정
활용 기술:
- OSI Model
- Open Systems Interconnection: 개방형 시스템 상호연결
- 각 층계별로 메시지를 전달
- 네트워크의 기본이 되는 모델
- 여러 통신 장비 및 시스템 마다 호환성 문제가 없도록 만든 국제표준
- 7계층
- Physical Layer 물리계층
- 전압 레벨, 데이터 속도, 최대 전송 거리, 커넥터…(물리적 사양)
- 케이블, 모뎀, 리피터(물리 장치)
- Data Link Layer 데이터 링크 계층
- 데이터 오류 감지, 복구
- MAC 주소
- Network Layer 네트워크 계층
- 논리 주소 정의
- IP 주소
- Transport Layer 전송 계층
- 데이터 흐름 제어
- TCP, UDP
- Session Layer 세션 계층
- 통신 장치간의 상호작용 설정, 유지, 관리
- Presentation Layer 표현 계층
- 7레벨에 적용되는 데이터 형식, 코딩, 변환 기능
- 파일 확장자(암호화, 압축)
- Application Layer 응용 계층
- 앱 상의 네트워크
- HTTP
- Physical Layer 물리계층
- 캡슐화&디캡슐화: 최상단 계층에서 하위계층으로 전달될 때마다 각 계층이 인식할 수 있는 헤더를 탈부착
- URL
- Uniform Resource Locator: 네트워크 상에서 리소스들이 어디 있는지를 알려주기 위한 규약
- http://
- 프로토콜
- 예) ftp, mailto
- www.fastcampus.com
- 웹 서버명 -> DNS명 -> IP 주소
- layer 3: 네트워크 계층 (IP)
- :8080
- 포트명
- 기본값 생략
- layer 4: 전송 계층 (port)
- /ios-lecture.html
- 데이터 출처(리소스) 경로
- layer 7: 응용 계층
- HTTP
- Request(요청)
- 사용자가 서버에 무언가 요청할때
- Method
- Get 식별된 데이터 가져오기
- Post 새 데이터를 추가
- Put 식별된 기존의 데이터 수정(업데이트)
- Patch PUT과 동일하지만 데이터의 일부를 수정
- Delete 식별된 데이터 삭제
- Head GET과 동일하지만 메시지 헤더만 반환
- Connect 프락시 기능 요청
- Options 웹서버에서 지원하는 메소드 확인
- Trace 원격 서버 테스트용 메시지 확인
- GET vs POST
- GET: 파라미터가 URL상에 노출
- POST: 전달해야 되는 파라미터를 Body안에 포함 전달하는 값이 외부에 노출x(로그인시 사용), 대량의 메시지 전달 가능, 제어 불가능, 북마크, 공유x
- URL
- Header
- Body
- Response(응답)
- 서버가 요청에 따른 정보를 돌려줄 때
- Status Code
- 1xx: 정보 전달 - 리퀘스트 수신, 진행 중
- 2xx: 성공 - 리퀘스트 성공적으로 수신, 해석, 승인
- 3xx: 리다이렉션
- 4xx: 클라이언트 에러
- 5xx: 서버 에러
- Message
- Header
- Body
- Request(요청)
- URLSession
- 애플의 Foundation 프레임워크에서 제공
- iOS앱이 서버와 통신하기 위해서 애플이 제공하는 API
- iOS를 포함한 Apple의 OS 상에서 네트워크를 구축하기 위해 활용
- HTTP를 포함한 OSI 7계층의 포로토콜 지원, 네트워크 인증, 쿠키, 캐쉬 관리 같은 서버와의 데이터 교류 작업 전반을 지원
- 네트워크 데이터 전송과 관련된 Task그룹 조정
- URLSession 객체
- URL 로딩 시스템을 구현할 수 있게 하는 객체
- URL을 통해서 상호작용하고 표준 인터넷 프로토콜을 사용해서 서버와 통신하는 시스템
- 데이터 읽기는 비동기식으로 수행, 앱이 응답을 유지하고 수신데이터 또는 오류가 도착하는 즉시 처리
- URLSession.shared
- 세션에 대한 복잡한 요구사항이 없을 경우 일반적으로 사용
- URLSessionConfiguration
- 캐시 및 쿠키를 사용하는 방법, 또는 셀룰러 네트워크에서 연결을 허용할 지 여부와 같은 동작을 제어하는 객체 생성
- .default
- shared 세션과 유사, 추가적으로 설정이 더 가능(delegate)
- .ephemeral
- 캐시, 쿠키 또는 자격 증명을 디스크에 작성x
- .background
- 앱이 실행되지 않는 동안에도 백그라운드에서 컨텐츠를 업로드하거나 다운로드 수행
- URLSessionTask
- 세션 내에서 데이터를 서버에 업로드한 다음, 서버로부터 데이터를 검색하는 작업을 생성
- 하위 클래스
- URLSessionDataTask
- NS데이터 객체를 사용해서 데이터를 송수신
- URLSessionUploadTask
- 파일을 전송하고 앱이 실행되지 않는 동안 백그라운드 업로드 지원
- URLSessionDownloadTask
- 파일 형식 기반으로 데이터를 검색하고 앱이 실행되지 않는 동안에는 백그라운드 다운로드 및 업로드 지원
- URLSessionStreamTask
- URLSessionWebSocketTask
- URLSessionDataTask
- URL 로딩 시스템을 구현할 수 있게 하는 객체
- Postman
- HTTP Request와 Response, API임을 쉽게 확인할 수 있는 프로그램
- Open API에 Request를 전송 및 전달
- GCD
- Thread
- 프로그램, 특히 프로세스 내에서 실행되는 흐름의 단위
- 기본적으로 1프로그램 1Thread 포함, iOS에서는 모든 앱이 Main Thread 사용 가능
- UIKit의 클래스들은 오직 Main Thread에서만 실행가능
- 프로그램 환경에 따라서 둘 이상의 스레드를 동시에 실행(Multi Thread)
- 동시에 여러 작업이 필요한 경우
- 중요한 작업에 방해를 받지 않아야 하는 경우
- 상태를 계속 감시를 해야할 경우
- EX) 네트워크 통신에서 Request를 보내고 Response를 받을 때
데이터를 다운로드 하거나 업로드하는것 - 별도의 설정이 없으면 대부분의 작업은 Main thread에서 자동적으로 실행 -> Main Thread만 일하게 됨
- 방대한 작업량과 속도의 작업 순서들의 배치, 관리가 필요
Multi Thread에서 애플OS가 직관적이고 편리하게 사용할 수 있게 해주는 것 -> GCD
- Grand Central Dispatch
- 시스템에서 관리하는 Dispatch 대기열에 작업을 제출해서 멀티코어 하드웨어에서 동시에 코드를 실행
- Foundation, Cocoa API는 이러한 Multi Thread 기능을 사용하도록 설계
- 시스템과 앱이 더 빠르고 효율적이고 향상된 응답성을 제공하도록 지원
- 하나의 앱이 여러 개의 코어를 최대한 효과적으로 사용할 수 있도록 자동으로 시스템단에서 제어
- 시스템 수준에서 실행중인 모든 앱의 요구를 적절히 받아서 균형을 잡는 역할
- Dispatch Queue
- 앱의 Main Thread나 Background Thread에서 순차적으로 또는 동시에 실행되는 작업을 관리하는 객체
- First-In-First-Out
- Queue에 제출된 작업은 시스템에서 관리하는 Thread Pool에서 실행
- Queue를 활용해서 작업항목을 동기나 비동기로 설정
- Sync(동기)
- Dispatch Queue에 작업이 남아있을 경우에 해당 작업이 끝날 때까지 다음 작업을 진행x
- 작업의 순서를 보장하기 위해서 한번에 하나의 작업만 실행
- Async(비동기)
- Queue에 작업이 있든 없든 다음 작업을 비동기로 동시에 진행
- 동기, 비동기까지 설정한 Dispatch Queue에 작업을 추가 ->
GCD는 작업에 맞는 Thread를 시스템안에서 자동적으로 생성해서 실행 ->
작업이 끝나면 Thread 제거
- Thread
DispatchQueue.main.async
self.tableView.reloadData()
}
- 네트워크 작업을 실행시키는 부분과 반드시 메인 스레드에서 돌아야되는 UI 관련 액션은 분리가 필요
- URLSession(네트워크 통신 관련 코드)는 내부적으로 이미 백그라운드에서 비동기적으로 작동하게 설계됨
- Dispatch Queue로 별도로 설정하지 않아도 이미 메인 스레드가 아닌 별도의 스레드에서 작동
- UITableView를 업데이트하는 reload 코드는 Main Queue에서 돌아야 함
아무런 작업을 하지 않으면 기존처럼 백그라운드에서 같이 돌아 에러 발생 - Main Queue에서 돌아갈 수 있도록 조정하는 역할