제품체험단 및 삶이야기/책에 대한 생각

iOS 네트워크 프로그래밍, 애플세상을 꿈꾸는 이들

어린왕자같은 식객 2014. 1. 15. 08:00
728x90
반응형

오래간만에 개발관련 서적을 읽게 된 것 같다. 옛날에 모바일쪽에 처음 기획일을 할때는 독립적으로 동작하는 App의 수가 적지 않았으나 지금은 서버와 네트워킹을 하지 않는 App은 거의 찾아볼 수가 없다. 게임이던 유틸이던간에 서버와 항상 통신하면서 정보를 업데이트 한다. 단말기의 성능이 올라간 부분도 있겠지만 네트워크 비용이 현저히 낮아졌기 때문에 비즈니스 환경이 변한것이다.

 

잘 돌아가는 iOS App을 개발하기 위해서는 아키텍처 설계를 위해 실행 루프 (run loop)와 각각의 네트워킹 API를 연동해 반응성이 좋은 네트워킹 애플리케이션 프레임워크를 만드는 핵심 개념을 이해해야 한다.

 

네트워킹에 대해서 모르는 개발자라 하더라도 책을 차분히 보면서 배운다면 기본적인 소양을 갖출 수 있을것으로 보여진다. 애플리케이션이 엔드포인트를 직접 조회하는 형태는 아래와 같은 형태로 보여줄 수 있다.

 

아이폰 -> SOAP -> 레코드 회계 시스템

아이폰 -> SOAP -> 레코드 재고 시스템

아이폰 -> JDBC -> 위치 데이터베이스

아이폰 -> REST JSON -> 마케팅 콘텐츠 시스템

아이폰 -> REST XML -> 충성 고객 포인트 밴더

 

 

2장의 퍼사드 서비스 예제에서는 주식 정보 서비스와 날씨 서비스라는 두 가지 웹 서비스를 사용해 보여준다. 많은 경우가 데이터를 별도 소스에서 가져오고 각 데이터 집합을 공통 출력 형식으로 변환하여 보여준다.

 

버전 관리 서비스 예제

 

날씨 서비스 1.0 버전 weather_v1.php

{"city";"Richmond","state":"Virginia","currentTemperature":"63"}

 

날씨 서비스 2.0 버전 weather_v2.php

{"city":"Richmond","state":"Virginia","currentTemperature":63,"currentConitions":"Mostly Cloudy"}

 

 

iOS 네트워킹은 대부분 HTTP 통신 방식에 의해 이뤄진다. HTTP API가 가장 자세히 문서화되어 있기 때문에 그것을 사용하여 개발하는 것이 가장 무난하다.

 

URL의 구조

http://user:password@hostname:port/absolute-path?query

프로토콜|인증정보|호스트이름|TCP포트|절대경로|쿼리문자열

동기요청이나 큐를 활용한 비동기 요청, HTTP 요청 방식을 활용하는 방법, HTTP 쿠키를 조작하는 방법, HTTP 고급 헤더를 활용하는 방법등을 잘 정리해 놓고 있다.

 

에러 처리의 기본 원칙

1. 인터페이스 계약에 에러 처리를 포함한다.

2. 에러 상태도 거짓말을 한다.

3. 페이로드의 유효성을 검증한다.

4. 정상적인 비즈니스 조건과 에러를 분리한다.

5. HTTP 상태를 항상 검사한다.

6. NSError를 항상 검사한다.

7. 에러를 일관성 있게 처리하는 방식을 개발한다.

8. 타임아웃을 항상 설정한다.

 

iOS에서 HTTP 요청의 기본 타임아웃 시간은 4분이지만 긴 4분동안 기다리는 사용자는 드물다. 아래는 30초 타임아웃을 사용해 요청을 생성하는 예이다.

 

- (NSMutableURLRequest *) createRequestobject ; (NSURL *)url {

NSMutableURLrequest *request = [[[NSMutableURLRequest alloc]

initWithURL : url

cachePolicy:NSURLCacheStorageAllowed

TimeoutInterval:30

autorelease];

return request;

}

 

 

아래의 예제는 시스템이 서비스에서 사용할 수 있는 포트를 지정하는 방법과 연결 시도를 리스닝하는 소켓 콜백을 등록하는 방법을 보여준다.

 

CFSocketContext socketCtxt = {0, (__brideg void*)self, NULL, NULL, Null};

ipv4socket = CFSocketCreate(kCFAllocatorDefault,

PF_INET,

SOCK_STREAM,

IPPROTO_TCP,

kCFSocketAcceptCallBack,

(CFSocketCallBack)&BonjourServerAcceptCallBack,

&socketCtext);

 

ipv6socket = CFSocketCreate(kCFAllocatorDefault,

PF_INET6,

SOCK_STREAM,

IPPROTO_TCP,

kCFSocketAcceptCallBack,

(CFSocketCallBack)&BonjourServerAcceptCallBack,

&socketCtext);

 

if (ipv4socket == NULL || ipv6socket == NULL) {

if (ipv4socket) CFRelease(ipv4socket) ;

if (ipv6socket) CFRelease(ipv6socket);

ipv4socket = NULL;

ipv6socket = NULL;

return;

}

.

.

.

.

CFRunLoopAddSource(cfrl, src6, kCFRunLoopCommonModes);

CFRelease(src6);

 

 

 

책은 그다지 두껍지는 않지만 개발을 위해 필요한 내용들은 빼곡히 담겨져 있다.

메시지 무결성을 위한 해싱과 암호화, 네트워크 작업의 최적화, 소켓서버 설정, Push 알람설정등 첫째, 둘째, 셋째마당을 지나쳐 가면서 샘플코드로 연습하다보면 개발에 익숙해지는 자신을 발견할 수 있을 듯 하다.

 

책의 마지막에 봉쥬르는 애드혹 네트워킹을 통해 같은 네트워크에 있는 기기 사이에서 데이터를 공유할 수 있게 해주는 예제를 구현해 놓았다. 네트워크에서 서비스를 성공적으로 발행하는 방법, 호스트를 검색하고 호스트와 피어를 연결하는 방법을 기술하였다. 봉쥬르 서비스를 발행할 수 있는 기기의 유형은 프린터, DVR, 홈 자동화 도구까지 다양하다고 저자는 말한다.

 

 

반응형