Ch 07. 부르어리 소개 앱 만들기

4 분 소요

스크린샷 2022-08-05 오후 10 10 42 스크린샷 2022-08-05 오후 10 11 07 스크린샷 2022-08-05 오후 10 11 46

기능 상세:
  • API를 통해서 가져온 맥주 데이터를 레이아웃으로 전달
  • 적절한 시점에 다시 데이터를 패칭
  • 25개 단위로 페이지네이션을 통해 스크롤을 내리면 추가적으로 데이터를 불러올 수 있게 구성
  • 각각의 맥주를 탭하면 디테일 뷰 설정
활용 기술:
  • OSI Model
    • Open Systems Interconnection: 개방형 시스템 상호연결
    • 각 층계별로 메시지를 전달
    • 네트워크의 기본이 되는 모델
    • 여러 통신 장비 및 시스템 마다 호환성 문제가 없도록 만든 국제표준
    • 7계층
      1. Physical Layer 물리계층
        • 전압 레벨, 데이터 속도, 최대 전송 거리, 커넥터…(물리적 사양)
        • 케이블, 모뎀, 리피터(물리 장치)
      2. Data Link Layer 데이터 링크 계층
        • 데이터 오류 감지, 복구
        • MAC 주소
      3. Network Layer 네트워크 계층
        • 논리 주소 정의
        • IP 주소
      4. Transport Layer 전송 계층
        • 데이터 흐름 제어
        • TCP, UDP
      5. Session Layer 세션 계층
        • 통신 장치간의 상호작용 설정, 유지, 관리
      6. Presentation Layer 표현 계층
        • 7레벨에 적용되는 데이터 형식, 코딩, 변환 기능
        • 파일 확장자(암호화, 압축)
      7. Application Layer 응용 계층
        • 앱 상의 네트워크
        • HTTP
    • 캡슐화&디캡슐화: 최상단 계층에서 하위계층으로 전달될 때마다 각 계층이 인식할 수 있는 헤더를 탈부착
  • 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
  • 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
  • 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 제거
DispatchQueue.main.async 
    self.tableView.reloadData()
}
  • 네트워크 작업을 실행시키는 부분과 반드시 메인 스레드에서 돌아야되는 UI 관련 액션은 분리가 필요
  • URLSession(네트워크 통신 관련 코드)는 내부적으로 이미 백그라운드에서 비동기적으로 작동하게 설계됨
  • Dispatch Queue로 별도로 설정하지 않아도 이미 메인 스레드가 아닌 별도의 스레드에서 작동
  • UITableView를 업데이트하는 reload 코드는 Main Queue에서 돌아야 함
    아무런 작업을 하지 않으면 기존처럼 백그라운드에서 같이 돌아 에러 발생
  • Main Queue에서 돌아갈 수 있도록 조정하는 역할