-
[Apple Dev Reference] URL관련 클래스들에 대해 알아보자. NSURL으로 시작하는 클래스들!앱등이에게 살충제를 뿌린다./Apple Dev Reference 2015. 11. 30. 00:10Apple Developer 문서를 번역만 하였습니다.
About the URL Loading System
인터넷 프로토콜을 기반으로 URL을 사용하여 서버와의 통신을 제공하는 Foundation 프레임워크 클래스들에 대해 알아보겠습니다. 이 클래스들을 묶어 URL loading system이라고도 합니다.
URL loading system은 여러분의 앱이 URL이 가리키는 데이터, 콘텐츠에 접근하는 것을 도와주는 클래스와 프로토콜의 집합입니다. 이 기술의 중심에는 NSURL이라는 클래스가 있는데, 바로 요놈이 앱에서 URL을 조종하게 만듭니다.
Foundation 프레임워크는 여러 클래스들을 제공합니다. 이 클래스들을 통해 URL으로부터 컨텐츠를 로드하고, 서버로 데이터를 업로드하고, 쿠키 스토리지를 관리하고, Response Caching을 관리하고, 사용자 개인정보&인증도구(in 키체인)를 저장하는 스토리지를 관리하고 커스텀 프로토콜을 확장시킬수도 있습니다.
URL loading system은 아래와 같은 프로토콜을 통한 리소스 접근을 지원합니다.
- File Transfer Protocol (ftp://)
- Hypertext Transfer Protocol (http://)
- Hypertext Transfer Protocol with Encryption(https://)
- Local file URLs (file://)
- Data URLs(data://)
(사용자 시스템 설정에 따라 프록시 서버 또는 SOCKS gateway도 지원이 가능합니다.)
At a Glance
URL loading system은 URL을 다루는 클래스들이 여러가지 액션을 취할 수 있게 많은 도우미 클래스들을 제공합니다. 이 클래스들은 다섯 카테고리로 분류할 수 있습니다.
Protocol Support, Authentication and Credential(인증, 개인정보 관련), Cookie storage, Configuration management, Cache Management 입니다.
URL Loading
가장 자주 사용되는 클래스는 URL로부터 정보를 가져오는 클래스들입니다. 데이터를 가져오는 방법에는 앱이 요구하는 방식에 따라 다양합니다. 또한 여러분의 앱의 iOS버전 또는 OS X버전에 따라서, 그리고 데이터를 파일로 가져올 지 또는 메모리에 올릴 데이터블록으로 가져올지에 따라서도 다른 API를 사용해야 합니다.
- iOS7이상, OS X 10.9이상 : NSURLSession이 URL request를 수행하는데에 가장 많이 사용됩니다.
- 그 이전의 OS X 버전 : 파일을 다운로드하는 방법에 NSURLDownload가 사용됩니다.
- 그 이전의 iOS, OS X 버전 : URL데이터를 메모리에 올리는데에 NSURLConnection이 사용됩니다. 원한다면 이 데이터를 disk에 write할 수도 있습니다.
어떤 메소드를 사용할지는 전적으로 여러분의 앱이 원하는 방향에 달려있습니다. (데이터를 메모리로 가져올지, 디스크에 저장할 지)Fetching Content as Data(In Memory)
URL데이터를 가져오는 기본적 방법으로 두 가지가 있습니다.- 간단한 Request에는 NSURLSession API에 NSURL객체를 사용하여 NSData객체를 가져오거나 디스크에 파일을 저장하게 됩니다.
- 약간 복잡한 Request에는(예를 들면, 데이터를 업로드하는 Request) NSURLRequest객체 또는 NSMutableURLRequest객체를 사용하여 NSURLSession 또는 NSURLConnection API를 사용하게 됩니다.
어떤 방식을 선택하더라도 아래와 같은 두 가지 방식의 응답을 받게 될겁니다.- Complete handler Block을 제공합니다. URL loading 클래스는 서버에서 데이터를 모두 전송받으면 이 Block을 호출합니다.
- Custom Delegate를 제공합니다. URL loading 클래스는 데이터를 수신할때 주기적으로 여러분이 만든 delegate메소드를 호출합니다. 필요에 따라 앱에서는 수신한 데이터를 축적해야합니다.(많은 데이터는 조금씩 여러차례에 걸쳐서 오기도합니다.)
수신한 데이터 외에도 URL loading 클래스는 MIME type 또는 컨텐츠의 length와 같은 메타데이터도 제공합니다.Downloading Content as a File
URL을 통해 파일을 다운로드할 때 기본적 방법으로 두 가지가 있습니다.
- 간단한 Request에는 NSURLSession API에 NSURL객체를 사용하여 NSData객체를 가져오거나 디스크에 파일을 저장하게 됩니다.
- 약간 복잡한 Request에는(예를 들면, 데이터를 업로드하는 Request) NSURLRequest객체 또는 NSMutableURLRequest객체를 사용하여 NSURLSession 또는 NSURLDownload API를 사용하게 됩니다.
NSURLSession은 NSURLDownload에 비해 두 가지의 장점이 있습니다. 먼저 iOS에서 사용이 가능합니다. 그리고 앱이 중단되거나 종료되거나 Crash된 상황에서도 다운로드가 계속 진행됩니다.**NoteNSURLDownload 또는 NSURLSession으로 시작한 다운로드는 캐싱되지 않습니다. 만약 다운로드한 결과를 캐싱하고 싶다면 앱에서 반드시 NSURLConnection 또는 NSURLSession을 통하여 디스크에 직접 write해야 합니다.Helper Classes
URL loading 클래스는 두가지 Helper 클래스를 제공합니다. 하나는 Request를 위한 것(NSURLRequest)이고 다른 하나는 서버의 응답을 위한 것(NSURLResponse)입니다.
URL Requests
NSURLRequest객체는 URL, 프로토콜의 여러가지 스펙들을 프로토콜 자체와는 독립적으로 감싸고 있습니다. 뿐만 아니라 로컬에 캐시된 데이터를 사용할지에 대한 약속도 포함하고 있습니다. 그리고 NSURLConnection과 NSURLDownload와 함께 사용될 때 Connection timeout을 설정하는 인터페이스도 제공됩니다. (NSURLSession은 매 session에 기초하여 timeout이 설정됩니다.)
**Note
앱에서 NSMutableURLRequest를 사용하여 connection 또는 다운로드를 시작할 때 request의 Deep Copy가 만들어 집니다. request를 시작하면서 만들어진 변화들은 다운로드가 시작된 뒤에는 아무 영향을 미치지 못합니다.
몇몇 프로토콜은 프로토콜의 특정한 property들이 있습니다. 예를 들어 HTTP 프로토콜은 NSURLRequest에 몇가지 메소드를 추가할 수 있습니다. HTTP request의 body, header, method(GET/POST)를 리턴하는 메소드들이죠. 물론 NSMutableURLRequest에도 추가됩니다.
URL request를 다루는 자세한 방법은 아래에 쭉 나옵니다~!
Response Metadata
request에 대한 서버의 응답은 크게 두 가지 부분으로 볼 수 있습니다: 받아온 콘텐츠 및 데이터에 대한 정보를 담는 메타데이터. 대부분의 프로토콜에 공통적인 메타데이터는 NSURLResponse에 의해 감싸져 있으며 MIME type, 컨텐츠의 length, text encoding, response를 제공한 URL로 이루어져 있습니다. NSURLResponse의 서브클래스인 여러 프로토콜 클래스들은 더 많은 메타데이터를 제공할 수 있습니다. 예를 들어 NSHTTPURLResponse클래스는 header정보와 서버에서 내려준 status code도 저장할 수 있습니다.
**중요
오직 reponse에 대한 메타데이터만 NSURLResponse 객체에 저장됩니다. URL loading 클래스들은 completion handler 또는 delegate를 통해서 reponse에 담겨있는 데이터들을 전달하게 됩니다.
NSCachedURLResponse는 NSURLResponse객체, URL content data, 앱에서 제공된 추가적인 정보들을 감싸고 있습니다. Cache Management 에 자세히 나옵니다.
URL Reponse를 다루는 자세한 방법은 아래에 쭉 나옵니다~!
Redirection and Other Request Changes
HTTP와 같은 몇몇 프로토콜에는 서버에서 앱으로 특정 데이터가 다른 URL로 이동했다는 것을 전달하는 방법을 제공합니다. URL loading 클래스는 이런 일이 발생했을 때, Delegate를 호출할 수 있습니다. 앱에서 적절한 Delegate 메소드를 구현해 놓는다면 Redirect를 할지 말지, Response body를 리턴할지, 또는 그냥 error를 리턴할지를 판단할 수 있게 됩니다.
참고하기 : Handling Redirects and Other Request Changes
Authentication and Credentials
서버에서는 특정 콘텐츠들에 대한 접근을 엄격하게 제한합니다. 따라서 사용자들은 이 데이터에 접근을 하기 위해서 몇가지 요구사항(클라이언트 인증서, 이름, 비밀번호 등등..)을 통해 인증을 거치게 됩니다. 예를들어 웹 서버의 경우에는 제한된 데이터들이 한군데에 묶여서 존재하고 이 구역에서 권한에 필요한 정보를 요구합니다. Credential(특히는 인증서)은 서버를 신뢰할 수 있는지 앱에서 판단하는데에 사용되기도 합니다.
Cache Management
URL loading 시스템은 디스크와 메모리의 캐시를 통해 앱이 네크워크 연결에 대한 의존도를 줄이고 나아가 더 빠른 캐시 응답을 가능하게 합니다. 캐시는 각 앱마다 저장이 됩니다. 캐시는 NSURLRequest 객체를 생성할 때 정의된 캐시 Policy에 따라 NSURLConnection클래스에 의해 커리됩니다(queried).
NSURLCache클래스는 디스크상의 캐시의 위치와 사이즈를 정할 수 있는 방법들을 제공합니다. 캐시된 응답을 포함하는 NSCachedURLResponse객체 컬렉션을 다루는 방법들도 제공합니다.
NSCachedURLResponse객체는 NSURLResponse객체와 URL의 데이터와 컨텐츠를 감싸고 있습니다. NSCachedURLResponse는 어떠한 커스텀 데이터라도 캐시할 수 있게 앱에서 사용할 수 있는 사용자 정보 딕셔너리도 제공합니다.
모든 Protocol 구현에서 response 캐싱을 지원하지는 않습니다. 현재는 http와 https요청에서만 지원이 되고 있습니다.
NSURLConnection객체는 reponse가 캐시되었는지 여부와 reponse가 메모리에만 캐시되어 있는지 여부를 컨트롤할 수 있는 메소드를 지원합니다.
connection: willCacheResponse:
Cookie Storage
Stateless프로토콜인 http의 특성 때문에 클라이언트에서는 URL요청과 관련한 데이터들을 지속적으로 저장해두기 위해 쿠키를 자주 사용합니다. URL loading 시스템은 쿠키를 생성하고 다루는 interface와 쿠키를 URL request에 포함시키거나 웹서버의 응답을 해석할 때 쿠키를 수신하는 interface도 제공합니다.
OS X와 iOS는 NSHTTPCookieStorage 클래스를 제공하여 NSHTTPCookie클래스들의 컬렉션을 다룹니다. OS X에서는 쿠키 저장소가 모든 앱들에 공유됩니다. iOS에서는 각 앱별로만 공유됩니다.
참고하기 : Cookie Storage
Protocol Support
URL loading 시스템은 기본적으로 http, https, file, ftp와 data프로토콜을 지원합니다. 하지만 URL loading 시스템은 여러분의 앱에서 만든 여러분만의 프로토콜을 지원할 수 있게 합니다. 프로토콜의 스펙 property를 URL request와 URL reponse에 맞추어 사용할 수 있습니다.
참고하기 : Cookies and Custom Protocols
출처 : https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html
'앱등이에게 살충제를 뿌린다. > Apple Dev Reference' 카테고리의 다른 글
[Apple Dev Reference] iOS에서 텍스트 프로그래밍하기 (0) 2016.02.21 [Apple Dev Reference] KVO - Key-Value Observing Programming Guide (2) 2016.01.17 [Apple Dev Reference] 앱 라이프사이클 The App Life Cycle (3) 2016.01.10 [Apple Dev Reference] NSURL Class 초간단소개 by Apple Reference (0) 2015.12.04 [Apple Dev Reference] UIWebViewDelegate 프로토콜에 있는 메소드들 (0) 2015.12.02