Archive

Posts Tagged ‘아이폰’

OS X, HTTP로 XML 데이터 요청 예제

3월 2nd, 2010

오래 간만에 포스팅합니다. 요즘 트위터 때문에 블로그에 소홀해진 것도 있지만 아이폰과 안드로이드 애플케이션(이하, 앱) 개발에 여념이 없습니다. 스마트폰 대세라 흐름을 따라 가는 것도 있지만 주로 웹 서비스만 개발하다 보니 오래 간만에 접하는 애플리케이션 형태의 제품 개발 자체가 매우 흥미롭습니다.

그런데 요즘 왠만한 앱에는 HTTP를 통해서 XML 데이터를 가져와서 보여주는 기능이 들어가는 데 막상 개발 참고하려고 구글 검색해보면 마땅한 예제가 없어서 간단하게 예제를 작성해보았습니다.

요청하는 XML 문서(hello.xml)는 아래와 같이 작성했습니다.

<?xml version="1.0" encoding="UTF-8" ?>
 
<showrooms>
  <showroom><name>강남전시장</name><phone_number>02-111-1111</phone_number></showroom>
  <showroom><name>삼성전시장</name><phone_number>02-222-2222</phone_number></showroom>
  <showroom><name>한남전시장</name><phone_number>02-333-3333</phone_number></showroom>
</showrooms>

해당 XML 데이터를 HTTP를 통해서 가져와서 처리하는 예제는 아래와 같습니다. 간단하게 실행 되는 것을 확인하기 위해서 컨솔 창에서 돌아가도록 작성했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#import <Foundation/Foundation.h>
 
 
int main( int argc, char* argv[] )
{
  NSAutoreleasePool* pool = [ NSAutoreleasePool new ];
  NSURL* url = [ NSURL URLWithString: @"http://www,yourserver.com/hello.xml" ];
  NSError* error;
  NSXMLDocument* xmlDocument = [ [ NSXMLDocument alloc ] 
    initWithContentsOfURL: url
    options: ( NSXMLNodePreserveWhitespace | NSXMLNodePreserveCDATA )
    error: &error ];
 
  if ( nil != error )
  {
    NSLog( @"%@", [ error localizedDescription ] );
    [ pool drain ];
    return 0;
  }
 
  NSXMLNode* rootElement = [ xmlDocument rootElement ];
  NSArray* showrooms = [ rootElement children ];
 
  int i, count = [ showrooms count ];
  for ( i = 0; i < count; ++i ) 
  {
    NSXMLNode* showroomNode = [ showrooms objectAtIndex: i ];
    NSXMLNode* nameNode = [ showroomNode childAtIndex: 0 ];
 
    NSArray* nodes = [ showroomNode nodesForXPath: @"phone_number" error: nil ];
    NSXMLNode* phoneNumberNode = nil;
    if ( 1 == [ nodes count ] )
    {
      phoneNumberNode = [ nodes objectAtIndex: 0 ];
    }
 
    NSLog( @"%@ (%@)", [ nameNode stringValue ], [ phoneNumberNode stringValue ] );
  }
 
  [ xmlDocument release ];
  [ url release ];
 
  [ pool drain ];
  return 0;
}

예제에서 특별히 어려운 내용은 없습니다. NSXMLDocument 클래스가 HTTP를 지원하기 때문에 initWithContentsOfURL 메소드를 호출하기만 하면 됩니다. 그리고 아이폰 런타임 환경에서는 가비지 컬렉션이 지원되지 않기 때문에 NSAutoreleasePool 클래스를 이용해서 메모리 관리를 하였습니다.

예제에서 3가지 다른 방법으로 자식 노드에 접근하고 있습니다. 각각 children, objectAtIndex, nodesForXPath 메소드를 이용합니다. 가장 일반적인 방법은 nodesForXPath을 이용하는 방법입니다. 약간의 성능 문제가 있을 수도 있지만 대부분의 경우 처리하는 XML 데이터의 량이 많이 않기 때문에 신경 쓰지 않아도 될 듯 합니다. 반면 objectAtIndex 메소드를 사용하는 경우 성능은 향상될 수 있겠지만 XML 문법에 종속적이기 때문에 그리 권장할만한 방법은 아닙니다.

해당 파일을 컴파일하는 쉘 구문은 아래와 같습니다.

$ gcc -framework Foundation hello.m -o hello

실행 결과 화면은 아래와 같습니다.

$ ./hello
강남전시장 (02-111-1111)
삼성전시장 (02-222-2222)
한남전시장 (02-333-3333)

프로그래밍에 도움되길 바랍니다~

[ 수정 사항 ]
조사해 본 결과 NSXMLDocument 클래스는 iPhone SDK에 제외되어 있습니다. 따라서 위 예제는 OS X 애플리케이션에서만 동작합니다. 빠른 시일 내에 iPhone에서 돌아가는 예제를 작성해서 올리도록 하겠습니다. iPhone은 iPhone, HTTP로 XML 데이터 요청 및 처리 예제를 참고하세요~

Post to Twitter Post to Delicious

, , , ,

맥으로 고고~

10월 14th, 2009

출퇴근할 때 전철에서 음악을 즐겨 듣는데 지금 쓰는 mp3 플레이어도 나름 괜찮지만 요즘 들어 부쩍 아이팟 터치가 갖고 싶다는 생각이 많이 들었습니다. 게다가 곧 아이폰도 출시될 예정이라 자연스럽게 아이폰 애플리케이션에 많은 관심이 생겼습니다. 그러다가 아이팟을 사는 김에 아이폰 애플리케이션을 개발해서 돈도 벌면 좋겠다는 생각까지 하게 되었습니다ㅎ.

생각난 김에 웹을 뒤지기 시작했습니다. 그 과정에서 알게된 흥미로운 사실은 아이폰(아이팟 터치)에서 돌아가는 애플리케이션을 개발하기 위해서는 맥이 필요하다는 것입니다. 애플의 자신감일까요? 아님 비용 문제일까요? 물론 맥 없이도 가능한 것도 같지만 굳이 그 험난한 길을 가고 싶지 않습니다;;;

하는 수 없이 맥을 구입하려고 알아보니 가장 저렴한 시스템은 맥미니더군요. 비용 절감 차원에서 중고 제품을 알아봤는데 저랑 같은 생각을 한 사람들이 많은 가 봅니다. 맥미니 매물은 올라오자 말자 예약되어버리더군요. 참고로 파워맥에서는 아이폰 애플리케이션을 개발할 수 없는 걸로 알고 있습니다. 저도 몇번 알아보다가 지금은 포기하고 새제품을 구입할 예정입니다.

맥미니를 구입하는 동안 가만히 있을 수만은 없어 Objective-C 공부를 시작했습니다. Objective-C는 아이폰 애플리케이션을 개발할 때 사용하는 언어로 C 기반의 객체지향 언어입니다. 윈도우즈에서도 Objective-C를 이용할 수 있어 그 문법 정도는 익힐 수 있었습니다. Objective-C는 C 언어 위에 객체 지향 코드를 임베딩(embedding) 시켜 놓은 느낌이었습니다. 개념 상으로는 조금 다르지만 html 소스에 php나 루비 코드를 박아서 사용하는 것과 유사했습니다.

아무튼 오늘 맥미니를 주문할 예정입니다. 맥유저가된다고 생각하닌 왠지… 뭔가 있어보이네요ㅎ.

Post to Twitter Post to Delicious

, ,