개발과삶2010/06/20 09:50
올해 초에 리뷰에 참여 했었던 책입니다. 입문서는 아니고, 입문서를 본 이후에 다른 개발자들은 어떤 식으로 개발하는가 궁금할 때 보기 딱 좋은 책이며 저의 추천서적 입니다. APress에서 나온 책을 지앤선에서 한국어로 번역 출판한 책이구요.

7명의 저자들이 각기 다른 방식으로 개발을 하면서 얻게된 지식이나 생각들을 잘 정리하여 장황하게 코드가 나열된 개발서적 보다는 더 가치가 있어 보입니다. 두께도 전철안에서 볼 수 있을 정도로 작고 비교적 얇아서 좋았습니다.

번역은 류정원님이 하셨는데, 개발 경험을 적절히 노트하여 독자들이 이해하기 쉽도록 하였습니다. 참고로, 한국 최초 우주인 후보 10인에 선발되었던 재미있는 이력도 있으신 분입니다.

1. 초 간단 버전 프렌직 Frenzic 퍼즐 게임 제작
2. 마이크 애쉬의 피어투피어 네트워킹 파고 들기
3. 한번에 여러 가지 일들 해치우기: 스레드를 이용한 성능 향상
4. 신기한 손가락의 마술: 멀티터치 인터페이스의 설계와 구현
5. cocos2d 아이폰 프레임웍을 이용한 물리 모델, 스프라이트 Sprites, 그리고 애니메이션
6. 판도라 라디오와 함께하는 오디오 스트리밍의 세계
7. 코어 로케이션, XML, SQLite 와 함께 루티시 따라잡기
저작자 표시 비영리 변경 금지
Posted by 종이비행기
책을읽자2010/01/17 11:03
KIDG를 통해서 iPhone Cool Projects 번역서의 리뷰를 지원하게 되었습니다. 지난 14일에 번역자님과 출판 관계자분들 및 함께 리뷰를 하실 분들과 모임을 갖게 되었고, 여러 즐거운 이야기도 많이 나누었습니다.

번역하신 분은 류정원님이고 이전에 임베디드 개발서의 고전 '입문자를 위한 임베디드 시스템'을 번역하셨습니다. 실무를 직접 하시는 분이고 Apple II 시절부터 경험이 있으셔서인지 베타버전인데도 불구하고 번역은 상당히 깔끔하고 부드럽게 읽을 수 있도록 되어 있었습니다.

책 내용도 입문서라고 생각하고 받았는데, 7인의 공동 저자라 서로 특색이 있기는 하지만 대체로 단순한 입문서와 같이 레퍼런스대로 따라하는 것이 아닌 오랜동안 개발로 몸에 배어 있는 깊은 지식을 바탕으로 전반적인 지식과 함께 예제를 설명하고 있었습니다. 번역하신 분의 위트가 녹아 있는 역주도 재미있습니다.

누구보다 번역서를 미리 받아서 본다는 즐거움에 지원하였지만, 그동안 제가 필요로 했었던 전문가들의 개발 방식을 엿볼 수 있어서 더욱 좋았습니다. ~Projects 시리즈가 좀 더 있는데, 다른 시리즈도 번역이 되었으면 하는 마음입니다.

리뷰가 빨리 끝나서 빨리 서점에서 책을 볼 수 있기를 기대해 봅니다.

저작자 표시 비영리 변경 금지
Posted by 종이비행기
개발과삶2009/11/29 17:48
iPhone이 11월 28일 KT를 통해서 전격 출시가 되었습니다.

이미 예약자만 6만명이 넘는다는 이야기를 들었습니다.
아직은 대기 수요자라고 볼 수 있겠습니다만,
대기 수요자로 상황이 종료되리라 생각하지는 않습니다.

최근 신문 기사에 연일 보도되는 아이폰과 옴니아의 비교 기사를 보시면,
하드웨어 스팩과 A/S 정책 및 요금제에 대해서만 이야기가 나오고 있습니다.
국내 스마트폰이 iPhone과 경쟁이 안될 수밖에 없는 원인조차 파악을 못하고 있습니다.
단순히 스팩 비교에만 열을 올리고 있는 게 우리 현실이죠.

UX 철학이 녹아든 UI와 이에 최적의 기능을 제공하는 OS,
수많은 애플리케이션을 제공하는 앱스토어,
이를 지원할 수 있는 하드웨어.

이렇듯 iPhone OS라는 훌륭한 SW의 지원이 없었던 들
iPhone이 출시될 때마다 전세계적으로 들썩들썩하지는 않았을 것입니다.
우리도 예외는 아닐듯 보입니다.
기존에 iPod Touch를 사용하면서 iPhone OS에 익숙한 유저들이
기존에 스마트폰을 버리고 iPhone으로 오지 않는다는 보장이 없겠지요.

iPhone을 쓰는 이유는 하드웨어의 디자인도 디자인이겠지만,
더 큰 이유는 단순하고 편리한 소프트웨어 때문이 아닐까 합니다.

하드웨어의 디자인, 스팩이 성공의 키는 아닙니다.
애플의 iPod과 한국의 MP3 플레이어의 세계적 점유율이 큰 차이가 난 이유도
바로 훌륭한 하드웨어와 함께 훌륭한 소프트웨어(iTunes) 및 서비스(iTunes store)가
있어서가 아니겠습니까?

여담이지만, 현재 iPod Touch를 갖고 있습니다.
아직은 예약 시즌이라 참고 있지만,
대리점에서 판매가 되면 아마도 구입하게 될 듯 합니다.
아마 저와 같은 분들이 꽤 되시리라 봅니다.
10여년간 SKT 고객이었지만 말이죠.
저작자 표시 비영리 변경 금지
Posted by 종이비행기
개발과삶2009/06/06 11:51
이찬진님이 계신 드림위즈에서 만든 사이트 입니다.
국내 iPhone App을 개발하고 이를 appStore에 올리신 회사, 단체, 개인의 명단을 확인할 수 있습니다.
YJ Works로 App을 등록했었는데, 개발 Studio 항목에 올라왔네요.
무료 어플을 개발하는 개인 개발자일 뿐인데^^;
http://appstore.connect.kr/


참고로, 이찬진님 개인블로그 입니다. iPhone/iPod에 대한 열정이 너무 멋진 블로그죠.
http://blog.dreamwiz.com/chanjin/


저작자 표시 비영리 변경 금지
Posted by 종이비행기
큐브리드2009/06/02 00:23
개발하면서 함수, 데이터타입 확인이 필요해서 메뉴얼 저작권 문제도 해결되고 해서 iPod에서 실행하는 App을 하나 만들어 봤습니다.
아직은 런칭 대기 상태인데 아마도 다음주면 승인이 날 듯 합니다.
항상 느끼는 것이지만, 대상 국가에 한국은 없다는 거...
언제 Apple이 한국을 우대해줄까요?



저작자 표시 비영리 변경 금지
Posted by 종이비행기
개발과삶2009/05/15 00:19
단순히 POST만 가능했던 기존 버전에서 이번에는 완벽한 Sync 기능을 추가중에 있습니다.
또한, 혼란스러웠던 우선순위 아이콘을 정리하였고,
구글 캘린더와 Sync를 버튼을 누르지 않고 데이터를 변경하면 자동으로 Sync를 하도록
기능을 고도화(?)하고 있습니다.

조금만 기다려주세요~

저작자 표시 비영리 변경 금지
Posted by 종이비행기
개발과삶2009/01/21 22:48
Database 접속
FMDatabase* db = [FMDatabase databaseWithPath:@"/company.db"];
if (![db open]) {
    NSLog(@"데이터베이스에 접속할 수 없습니다.");
    return false;
}
물론 company.db 파일이 있어야 합니다. 또한, 위의 코드만으로는 Application영역에 있는 db파일이 Document영역으로 자동 복사 되는 것도 아닙니다. 자세한 사항은 SQLiteBook 예제를 참고하세요. 추후 관련 자료는 정리해 보겠습니다.


데이터 베이스 접속이 되었다면 이제는 CRUD를 기준으로 예제와 함께 진행해보겠습니다.

Create
NSString *sql = @"INSERT INTO emp (empno, name, grade, salary, hiredate) VALUES (?, ?, ?, ?, ?)";

[db executeUpdate: sql,
     [NSNumber numberWithInt: 10240],
     @"홍길동",
     [NSNumber numberWithInt: 10],
     [NSNumber numberWithFloat:3250.03f],
     [NSDate date]
];
보시는 것과 같이 ?와 1:1 대응되도록 파라미터를 추가하게 됩니다. 단, 모든 파라미터는 객체형이어야 합니다.

또한, [db lastInsertRowId] 로 auto increment 값을 얻을 수 있습니다.

Read
NSString *sql = @"SELECT * FROM emp WHERE empno > ?";

FMResultSet *rs = [db executeQuery: sql, [NSNumber numberWithInt: 0]];

while ([rs next]) {
    NSLog(@"사번:%d, 사원명:%@, 직급코드:%d, 연봉:%f, 입사일:%@",
        [rs intForColumn:@"empno"],
        [rs stringForColumn:@"name"],
        [rs intForColumn:@"grade"],
        [rs doubleForColumn:@"salary"],
        [rs dateForColumn:@"hiredate"]
    );
}

[rs close];
전체 사원 목록을 가져오는 예제 입니다. empno > 0이라고 한 이유는 파라미터로 어떻게 넘기는 지 보여드리기 위한 것일 뿐 특별한 의미는 없습니다.
executeQuery의 결과로 FMResultSet을 가져오고 FMResultSet의 next 메소드를 계속 호출하면서 row를 한개씩 fetch하고 있습니다. 물론, 마지막에는 close 했습니다(중요하죠. 지원을 반납한다는 것은 말이죠).
SQLite의 API는 컬럼 순번으로만 데이터를 가져올 수 있었습니다. 그러나, FMDB는 @"empno"와 같이 컬럼명을 직접 지정해줄 수 있게 되어 있습니다. 그 편리성은 아마도 아실듯... JDBC 프로그래밍을 해보셨다면 문법이 많이 익숙하실 것입니다.

Update
NSString *sql = @"UPDATE emp SET grade=? WHERE empno=?";

[db executeUpdate: sql,
     [NSNumber numberWithInt: 20],
     [NSNumber numberWithInt: 10240]
];
INSERT를 보셨으니 새로울 것이 없죠? 비슷합니다.

Delete
NSString *sql = @"DELETE FROM emp WHERE empno=?";

[db executeUpdate: sql,
     [NSNumber numberWithInt: 10240]
];
구색을 맞추기 위해 DELETE도 넣어봤습니다.

Apple 개발자 사이트에서 샘플로 제공하는 SQLiteBook을 보시고 이 코드를 보시면 와~ 하실 겁니다(적어도 저는 와~했었습니다^^). Copy & Paste와 많은 수정을 거쳐야 하나의 SQL을 처리하는 루틴이 만들어졌었는데, 이제는 1분 이내에 데이터 패치를 하는 코드 작성이 가능해졌습니다.

소스코드가 공개되어 있으니 소스코드도 한 번 보시길 바랍니다. 약간의 오버헤드가 있을 듯 하나 무시하셔도 될 정도가 아닐까 생각합니다. 제가 소개한 내용은 기본적인 사용 방법일 뿐이고, 트랜잭션 처리나 에러처리 기능이 있으니 관심깊게 살펴보시면 좋을 듯 합니다.



저작자 표시 비영리 변경 금지
Posted by 종이비행기
개발과삶2009/01/14 01:36
간만에 iPhone용 My Task 버전을 업데이트 했습니다.
버그 수정과 언어 추가 정도의 마이너 업데이트 입니다.

- 날짜, 시간 선택기에서 15초 단위로 출력되지 않던 출력 버그 수정
- 일본어 언어 추가

일본어 언어 추가는 요즘 DSLR 세계에 갑자기 풍덩 뛰어든 앤디K님이 수고해주셨습니다.


아, 깜빡할 뻔 했습니다.
My Task 리뷰를 써주신 블로거가 있어서 소개합니다.
andiPod.com에서 확인하실 수 있습니다.
이참에 아직 완성도 낮은 어플을 리뷰해 주셔서 고맙습니다~라고 인사말 적습니다.
~ 어깨가 무거워지는 ~
저작자 표시 비영리 변경 금지
Posted by 종이비행기
개발과삶2009/01/12 00:08

iPhone에는 SQLite3 데이터베이스 엔진이 내장되어 있습니다. 빠르고 단순한 데이터베이스라 모바일장치인 iPhone에 가장 적합한 데이터베이스가 아닌가 생각합니다. 물론, Google의 Android도 SQLite3를 내장하고 있는 것으로 알고 있습니다.

그러나, iPhone은 SQLite3 접속을 위한 API가 SQLite3에서 제공하는 기본 인터페이스만 공개했기 때문에 DB관련 프로그래밍이 무척 불편했던 것이 사실 입니다. 그동안 Java의 JDBC에 익숙해져 있었던 저로서는 더더욱 그러했었습니다.

그러다가 FMDB라는 래퍼 라이브러리를 찾게 되었고 실제 적용해보니 개발 속도 향상이 되어 이렇게 소개하게 되었습니다.

먼저 소스는 구글코드의 SVN 소스트리에서 다음과 같이 구하실 수 있습니다.
svn co http://flycode.googlecode.com/svn/trunk/fmdb fmdb

받으신 후 프로젝트에 Add 시키고,
#import "FMDatabase.h"
#import "FMResultSet.h"
위와 같이 헤더만 추가해주시면 사용이 가능합니다.

상세 강좌는 다음에~ 소스 받으시면 샘플 소스가 있으니 그걸 보셔도 됩니다.

저작자 표시 비영리 변경 금지
Posted by 종이비행기
개발과삶2009/01/04 23:46
Apple에서 SqlLite 예제로 공개한 iPhone용 소스를 보면 Model 클래스에서 Data Access까지 처리하도록 되어 있습니다. 각각 장단점이 있어서 어느 쪽이 더 낫다는 판단을 내리기는 힘들지만, 최근 JAVA 웹개발 MVC 패턴 중에서 POJO와 DAO를 분리하여 아키텍처 관점에서 단순화하는 형태가 주목받고 있습니다.

각각 자기 맡은 바만 충실히 하고 각 연결고리를 최대한 느슨하게 한다는 것이 주 목적이라 생각합니다. POJO로 모델을 구현함에 있어서 데이터 처리는 DAO가 맡고 그 DAO도 경우에 따라서는 다른 DAO로 교체할 수 있도록 하여 결합도를 떨어뜨리는 효과를 내게 됩니다.

아직 테스트 단계이지만, iPhone 개발에서도 Apple에서 제공한 예제에 따르지 않고 Pure Object와 DAO를 분리하여 처리하는 방법도 타당성이 있지 않을까 생각해봅니다. 메모리 관리 측면에서도 올바른 방법이라 생각합니다.

해당 업무 영역별 데이터를 처리하는 DAO 클래스를 둡니다.
예를 들어, 주소록을 관리한다고 했을 때 주소 등록, 변경, 삭제, 목록, 상세와 같이 CRUD의 외부 인터페이스를 먼저 구현합니다.
즉, insertAddr, updateAddr, deleteAddr, listAddr, viewAddr 등의 외부 인터페이스를 구현합니다.
파라미터로 데이터 전달을 위한 객체를 하나 생성합니다. 즉, Addr이라는 클래스를 만들겠습니다.
Addr 클래스는 name, address, email, phone, mobile이라는 일반 속성을 갖고 데이터 관리를 위한 키 속성인 uid를 갖는 것으로 하겠습니다. 이 클래스는 위의 필드를 외부에서 사용할 수 있도록 하기 위해 getter, setter를 구현해야 합니다.

Addr 클래스는 결국 insertAddr, updateAddr에는 파라미터로 사용이 되고,
listAddr, viewAddr에는 반환 객체 또는 Array에 포함된 객체가 됩니다.
물론 deleteAddr에는 키속성만 있으면 되므로 Addr 클래스는 사용되지 않을 것입니다.

결국, Addr은 View Layer 또는 DAO Layer에서 사용하기 위한 임시 보관함 정도에 지나지 않습니다.
비교적 단순하고 가볍게 구현해야하며 가급적 비즈니스 로직은 배제하는 것이 좋겠습니다.

저작자 표시 비영리 변경 금지
Posted by 종이비행기