clamp
Clamp
clamp
글쓰기 관리
전체 방문자
오늘
어제
  • 분류 전체보기 (509)
    • IOS (85)
    • SwiftUI+TCA+Combine (9)
    • RxSwift + MVVM (56)
    • Clean Architecture (12)
    • SWIFT (56)
    • iOS - TDD (2)
    • 디자인패턴 (4)
    • CS (56)
      • 알고리즘 (29)
      • 운영체제 (15)
      • 자료구조 (2)
      • 네트워킹 (4)
      • 기타 (6)
    • 회고 (0)
    • Firebase (18)
    • SwiftUI (10)
    • iOS - UIKit (11)
    • iOS - 오픈소스 (6)
    • 코딩테스트 (166)
      • 프로그래머스 (164)
    • 정보처리기사 (14)
    • GitHub (2)
글쓰기 / 관리자

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅅ
  • Q
  • uikit
  • Swift

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
clamp

Clamp

IOS - URL Session을 이용한 HTTP통신
IOS

IOS - URL Session을 이용한 HTTP통신

2022. 2. 21. 16:40
URL Session을 이용한 HTTP통신

웹 통신과 Protocol

- 인터넷 상에서의 통신을 말한다.(소식을 전한다)

- 많은 정보들이 주고 받기에 인터넷에는 엄격한 규약이 존재한다. 이것을 Protocol 이라고 부른다.

ex)

메일을 주고받을때 - SMTP

파일을 주고받을때 - FTP

브라우저, 웹서버와 통신할 때 - HTTP

 

HTTP(Hyper Text Transfer Protocol)

- Hyper Text를 전송하기 위한 프로토콜

- HTML문서를 주고받을 때 사용

 

요청: request

응답: response

클라이언트에서 서버에 요청을 하면 그에 맞는 응답 결과를 돌려준다.

 

Http패킷  

헤더에는 보내는사람의 주소 받는사람의 주소, 생존시간

바디에는 우리가 전하고자하는 실제 내용이 담겨있다.

 

Http Method

- GET: 클라이언트가 서버에 리소스를 요청할 때 사용(정보를 받아올 때)

- POST: 클라이언트가 서버의 리소스를 새로 만들 때 사용(로그인, 게시글 업로드)

- PUT: 클라이언트가 서버의 리소스를 전체 수정 할 때 사용(회원정보를 전체 수정할 때)

- PATCH: 클라이언트가 서버의 리소스를 일부 수정 할 때 사용(회원정보를 일부 수정할 때)

- DELETE: 클라이언트가 서버의 리소스를 삭제 할 때 사용

- HEAD: 클라이언트가 서버의 정상 작동 여부를 확인 할 때 사용

- OPTIONS: 클라이언트가 서버에 해당 URL이 어떤 메소드를 지원하는지 확인 할 때 사용

- CONNECT: 클라이언트가 프록시를 통하여 서버와 SSL통신을 하고자 할 때 사용

- TRACE: 클라이언트와 서버간 통신 관리 및 디버깅을 할 때 사용

 

Http Status

서버는 클라이언트 요청에 응답하면서 요청이 성공적으로 완료되었는지 알려주는 상태코드를 함께 보낸다.

- 100번 대 Informational: 요청 정보를 처리중 (현재는 거의 사용되지 않는 코드)

- 200번 대 Success: 요청을 정상적으로 처리함

- 300번 대 Redirection: 요청을 완료하기 위해 추가 동작 필요

- 400번 대 Client Error: 서버가 요청을 이해하지 못함(클라이언트가 서버에 잘못된 요청을 했을 때)

- 500번 대 Server Error: 서버가 요청 처리 실패함.(대부분의 error코드는 500번대로 처리됨.)

 

URLSession

- 특정url을 이용하여 데이터를 다룬로드하고 업로드하기 위한 API

- Request와 Response를 기본 구조로 가지고 있다.

- Request는 서버에 요청을 보낼 때 어떤 http method를 사용 할 것인지, 캐싱정책을 어떻게 할 것인지등의 설정을 할 수 있다.

- Response는 URL요청에 응답을 나타내는 객체

 

URLSession은 URLSessionConfiguration을 통해 생성할 수 있다.

이렇게 생성된 URLSession을 통해 한개 이상의 URLSessionTask를 생성할 수 있으며 URLSessionTask를 통해 실제 서버와 통신할 수 있다.

 

URLSession API는 여러가지유형의 세션을 제공한다.

이 타입은 URLSession객체가 소유한 configuration프로퍼티 객체에 의해 결정됨.

URLSessionConfiguration을 사용하면 timeout값, 캐싱정책과 추가적인 Http헤더와같은 세션프로퍼티를 생성할 수 있다.

 

URLSession의 종류

1. 공유세션(Shared Session)

- URLSession.shared()

- 싱글톤으로 사용할 수 있고, 기본요청을 하기위한 세션

- 직접만든 세션만큼 맞춤설정을 할 순 없지만 쉽게만들어 사용할 수 있다.

 

2. 기본세션(Default Session)

- URLSession(configuration: .default)

- 공유세션과 유사하게 작동하지만 직접 원하는 설정을 할 수 있고, 캐시와 쿠키인증등을 디스크에 저장함.

- 순차적으로 데이터를 처리하기 위해 Delegate를 지정할 수 있다.

 

3. 임시세션(Ephemeral Session)

- URLSession(configuration: .ephemeral)

- 공유세션과 비슷하지만 캐시, 쿠키, 사용자인증정보를 디스크에 저장하지 않는다

- 메모리에 올려서 세션을 연결하고 세션 만료시 데이터가 사라진다.

 

4. 백그라운드세션(Background Session)

- URLSession(configuration: .background)

- 앱이 실행되지 않는동안 background에서 컨텐츠 업로드 및 다운로드를 실행할 수 있다.

 

 

URLSessionTask

 

URLSession구성이 완료되면 URLSessionTask를 이용해서 각 세션내의 작업들을 추가할 수 있다.

Task의 종류:

- URLSessionDataTask

데이터 객체를 사용하여 데이터를 요청하고 응답받음, 주로 짧고 빈번하게 요청되는데 사용

- URLSessionUploadTask

데이터 객체 또는 파일 형태의 데이터를 업로드 할 때 사용, 앱이 실행되지 않았을 때 Background업로드를 지원

- URLSessionDownloadTask

데이터를 다운로드 받아서 파일의 형태로 저장하는 작업을 수행, 앱이 실행되지 않았을때 Background다운로드를 지원

- URLSessionStreamTask

TCP/IP 연결을 생성할 때 사용되는 Task

- URLSessionWebSocketTask

 WebSocket Protocol 표준을 통해 통신하는 Task

 

URLSession Life Cycle

1. Session Configuration을 결정하고, Session을 생성

let session = URLSession(configuration: .default)

2. 통신할 URL과 Request 객체를 설정

//옵셔널로 리턴되기 때문에 guard문으로 바인딩
guard let url = URL(string: "https://api.openweathermap.org/data/2.5/weather?q=\(cityName)
				&appid=53108a9b43202998b9a6e7fde6134e11") else { return }

3. 사용할 Task를 결정하고 그에 맞는 Completion Handler나 Delegate 메소드들을 작성

dataTask가 api를 호출하고 서버에서 응답이 오면 Completion Handler(data, response, errror)  in 이하가 호출이 됨

//data: 서버에서 응답받은 데이터
//response: http헤더 및 상태코드같은 응답 메타데이터
//error: 요청을 실패하게되면 애러겍체가 전달, 만약 요청에 성공한다면 nil이 반환
session.dataTask(with: url){ data, response, error in
            guard let data = data, error == nil else { return }
            let decoder = JSONDecoder()
            let weatherInformation = try? decoder.decode(WetherInformation.self, from: data)
            debugPrint(weatherInformation)
        }.resume()//4. resume()로 dataTask 실행

4. 해당 Task를 실행

5. Task 완료 후 Completion Handler클로저가 호출이 됨.

 상단 코드의 in 이하 코드, .resume()이전 코드

 

 

저작자표시 비영리 동일조건 (새창열림)
    'IOS' 카테고리의 다른 글
    • IOS - COCOAPODS
    • Swift - Codable Protocol
    • IOS - Timer
    • IOS - ObserverPattern
    clamp
    clamp
    주니어 iOS개발자의 발악!!!!!!!

    티스토리툴바