사용자 삽입 이미지
어제 구글의 Android SDK 공개 기사를 보고 설치해 볼려고 Android 사이트를 살펴 보았습니다. 하지만 인텔맥에서만 된다기에 좌절하고 퇴근후에 집의 인텔 맥미니에 설치를 해보았습니다.

좌측의 아이콘은 안드로이드 에뮬레이터 아이콘입니다. 귀엽습니다.

구글폰이나 Android 소식을 간간히 접하면서 맥의 위젯과 같이 막연히 Ajax를 사용하는 자바스크립트를 사용할 것 같다는 추측을 해보았습니다. 구글의 주력 서비스들이 웹 기반이고 구글의 오픈 API와 연동을 위해서도 웹 기반일거라 생각했습니다.

하지만 어제 다운로드 받아서 확인을 해보니 자바 스크립트가 아니고 자바였습니다. 구글의 능력으로 보았을 때는 충분히 새로운 개발환경(IDE)을 배포할 것 같았는데, 이클립스의 플로그인 형태로 배포 되었습니다.

완전히 새로운 개발환경보다는 이클립스라는 익숙한 개발 환경과 자바라는 대중적인 언어를 선택함으로 기존 개발자들이 쉽게 적응할 수 있을 것으로 보여 집니다.


1. Android SDK 및 이클립스 플러그인 설치
Apach Ant
JDK 5/6도 지원하지만 이클립스로 설치해 보았습니다. 구글도 이클립스를 적극적으로 지원하는 것 같습니다.

1) 이클립스 설치
이클립스가 설치되어 있지 않다면 먼저 이클립스를 다운 받습니다. 전 3.2 버젼이 깔려 있었습니다. 그런데 프로젝트를 만들 때 오류 메시지를 표시해 주지 않아서 헤매다가 3.3을 설치하니 정확히 동작했습니다.

2) Android SDK 설치
이제 Android SDK를 다운 받습니다. Android는 OS X 10.4.8 이상의 인텔맥에서만 설치가 가능합니다. 압축파일만 풀면 되니 쉽게 설치하실 수 있습니다. Android SDK의 압축을 풀면 "android_sdk_darwin_m3-rc20a"와 같은 복잡한 이름의 디렉토리가 생성되는데 접근이 용이하게 Android로 변경해 주고 원하는 위치로 이동 합니다. 저는 잠시만 사용해 보고 삭제할 것이기 때문에 데스크탑에다 디렉토리를 가져다 놓았습니다.

설치가 완료되면 실행파일을 위한 패스를 지정해 줍니다. .bash_profile에 패스를 지정해 주거나 각자의 환경에 맞게 터미널에서 아래와 같이 실행합니다.
> export PATH=/Users/zzerr/Desktop/android/tools


3) ADT 설치
이제 ADT(Android Development Tools)라는 이클립스 플러그인을 설치합니다. 안드로이드 사이트에는 선택사항이라고 되어 있지만, 이클릭스를 사용한다면 필수로 설치를 해야 될 것 같습니다.

a. 이클립스의 헬프 메뉴에서 Software Updates > Find And Install...을 선택합니다.
b. Search for new features to...을 선택하고 Next를 클릭합니다.
c. 우측의 버튼중에 첫번째 New Remote Site...를 클릭합니다.
d. 아래와 같이 Name에 Android Plugin을 입력하고 URL에 https://dl-ssl.google.com/android/eclipse/ 을 입력한 후에 OK를 클릭하고 완료되면 Finish 버튼을 클릭합니다.
사용자 삽입 이미지











e. 다음 단계에서 아래와 같이 Android Plugin을 체크하고 Next 버튼을 클릭합니다.
사용자 삽입 이미지




















f. 라이센스에 동의에 체크하고 Next 버튼을 클릭한 후에 Finish버튼을 클릭합니다.
g. Install All 버튼을 클릭하면 설치 후에 이클립스가 재실행 됩니다.

이클립스의 Preferences... 메뉴를 클릭하고 Android를 선택합니다. 아래와 같이 SDK Location에 이전 단계에서 설치한 Android SDK의 디렉토리를 설정합니다.
사용자 삽입 이미지

"이제 사용할 준비가 완료되었습니다."


2. 샘플 프로젝트 작성

1) 프로젝트 생성
이클립스에서 File > New > Project... 를 클릭하고, Android Project를 선택한 후에 Next 버튼을 클릭합니다.

Project name과 Package Name, Activity name, Application Name을 각각 입력하고 완료 버튼을 클릭합니다. 저는 아래와 같이 입력하였습니다. Application name에 testAndriod로 잘 못 입력하여 나중에 에뮬레이터 화면에서도 Andriod로 나옵니다.
사용자 삽입 이미지

2)  코드 작성
완료되면 아래와 같은 안드로이드 이클립스 개발환경이 나옵니다.
사용자 삽입 이미지

여기선 전 샘플코드를 둘러 보다가 그래픽 샘플코드에서 점을 랜덤하게 출력하는 소스를 복사해서 아래와 같이 만들어 보았습니다.

package com.cocoa;

import android.app.Activity;
import android.os.Bundle;
import android.content.Context;
import android.graphics.*;
import android.view.View;

import java.util.Random;
public class hello extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(new SampleView(this));
    }
   
    private static class SampleView extends View {
        private Paint   mPaint = new Paint();
        private float[] mPts = new float[1000];

        public SampleView(Context context) {
            super(context);
           
            Random rand = new Random();
            final int N = mPts.length >> 1;
            for (int i = 0; i < N; i++) {
                mPts[(i << 1) + 0] = rand.nextFloat() * 320;    // X
                mPts[(i << 1) + 1] = rand.nextFloat() * 240;    // Y
            }
        }
   
        @Override protected void onDraw(Canvas canvas) {
            Paint paint = mPaint;

            canvas.drawColor(Color.WHITE);

            paint.setColor(Color.BLACK);
            paint.setAntiAlias(false);
            paint.setStrokeWidth(10);
       
            canvas.drawPoints(mPts, paint);
        }
    }
}


사용자 삽입 이미지
이제 실행해 보면 좌측과 같은 다이알로그 박스가 나오는데 Android Application을 선택하시고  OK버튼을 클릭합니다
 







아래는 에뮬레이터에서 실행된 모습입니다. 이미지 사이즈를 줄였지만 상당히 큽니다. 맥미니에 연결된 24인치 모니터에 아래와 같은 것이 뜨니 처음에는 핸드폰 에뮬레이터가 아니라 무슨 타자기 에뮬레이터가 뜨는 줄 알았습니다.
사용자 삽입 이미지

기존 자바 개발자나 C#으로 윈도우 모바일 개발 경험이 있는 개발자들은 별다른 노력 없이 쉽게 구글폰 어플리케이션을 제작할 수 있을 것 같습니다. 구글에서 많은 상금이 걸린  Developer Challange도 개최하니 우리나라 개발자들이 많은 상금을 가져 올 수 있었으면 좋겠습니다.


3. 사족 - MS Windows Mobile

이런류의 기기들을 좋아해서 오래전 WinCE 1.0이 탑재된 LG PDA를 구입을 시작으로 현재는 윈도우즈 모바일 5.0의 삼성 블랙잭을 사용하고 있습니다. PC와 인터넷에서의 경쟁이 이제 윈도우즈 모바일을 탑재한 스마트폰, 애플의 아이폰, 구글의 구글폰으로 모바일에서 까지 달아 오르는 것 같습니다.

OS/개발환경/브라우져도 그렇고 경쟁자가 없으면 나태해지는 MS도 이제 바짝 달려야 할 것 같습니다. 다른 건 몰라도 디자인적인 측면에서  신경을 좀 써주었으면 합니다.

아래의 이미지가 제 블랙잭의 스크린샷입니다. 초기화면은 어디선가 다운로드 받은 맥 테마를 변경하여 사용하고 있습니다. 여느 아빠들과 마찬가지로 핸드폰 초기화면은 제 아들 녀석이 자리잡고 있습니다.

우측은 윈도우즈 모바일의 탐색기 이미지입니다. 흑백에서 칼라로 바뀐 것을 제외하고는 10년 전에 본 모습 그대로 입니다. 한때 디자이너가 없다던 소문이 돌던 구글 디자인 컨셉 같습니다.
사용자 삽입 이미지 사용자 삽입 이미지

모바일 기기의 특성상 가능하면 메모리와 저장 공간을 줄여야 하는 것은 알지만 보기에도 좋았으면 좋겠습니다. 제 취향이 이상한 건지도 모르겠습니다. 간혹 급하게 메모할 일이 생길 때면 기본 메모장을 이용하는데 윈 3.1 시절의 향수를 느끼게 해줍니다. 언제 시간날 때 기능은 없고 보기에는 좋은 메모장이나 하나 만들어 볼려고 합니다.
AND

코아에서 MySQL C Library를 이용하는 예입니다. wrapper 클래스를 작성하여 MySQL
서버에 접속해서 데이터를 가져오는 간단한 샘플 코드를 작성해 보겠습니다.

OS X에서 MySQL 설치 및 설정은 이전 포스트를 참고해 하세요.


1. MySQL에서 작업

1) MySQL 서버 확인
테스트를 위하여 테이블을 생성하고 데이터를 넣어 보겠습니다. 우선 시스템 환경설정의 MySQL 항목에서 아래와 같이 서버가 기동중인지 확인 합니다. 서버가 실행되지 않고 있으면 Start 버튼을 클릭하여 아래와 같이 실행 상태로 만듭니다.
사용자 삽입 이미지

2) 테이블 생성 및 데이터 입력
그 다음 아래와 같이 터미널에서  MySQL에 로그인 후에 member 테이블을 생성하고 데이터를 넣습니다. 저는 이전에 test/1111로 계정을 만들고 cocoadev란 데이터베이스를 만들어 두었기에 아래와 같이 접속하였습니다.
사용자 삽입 이미지

id, name 두개의 필드를 가진 member란 테이블을 생성하고, 테스트를 위해 1, cocoa 값으로 데이터를 입력합니다.

2. 소스코드 작성
Xcode를 실행하고 프로젝트를 생성합니다. 저는 최대한 간단하게 만들기 위해 프로젝트 타입을 Command Line Utility의 Foundation Tool로 선택하고 프로젝트를 생성하였습니다.

Wrapper 클래스 작성을 위하여 새 파일에서 Objective C class 타입으로 MySqlDB 클랙스를 생성합니다. 이제 MySqlDB.h 파일과 MySqlDB.m 파일을 작성합니다.

테스트를 위하여 연결 및 쿼리등 필요한 메소드만 작성해 보겠습니다. mysql.h 파일을 참고 하시면 MySQL 라이브러리에서 제공하는 많은 함수들을 확인하실 수 있습니다.

1) MySqlDB.h 편집
#import <Cocoa/Cocoa.h>
#import "mysql.h"

@interface MySqlDB : NSObject {

    bool isConnected;
    int rowCount;
   
    MYSQL mySQL;
    MYSQL *pMySQL;
   
    MYSQL_RES* pRes;
    MYSQL_ROW Rows;
}

-(id) initWithServer: (const char*) host
             loginID: (const char*) userid
         loginPasswd: (const char*) passwd
               setDB: (const char*) database;

-(bool) connect : (const char*) host
         loginID: (const char*) userid
     loginPasswd: (const char*) passwd
           setDB: (const char*) database;

-(bool) query :(const char*) str;
-(bool) getRows;
-(bool) getStringData: (int)idx toBuffer: (char *) buff;

-(bool) isConnected;
-(int) rowCount;

@end

2) MySqlDB.m 파일 편집
#import "MySqlDB.h"


@implementation MySqlDB

-(id) initWithServer: (const char*) host
             loginID: (const char*) userid
         loginPasswd: (const char*) passwd
               setDB: (const char*) database
{   
    self = [super init];
   
    [self connect: host
          loginID: userid
      loginPasswd: passwd
            setDB: database];
               
    return self;
}

- (void)dealloc
{
    if(pMySQL)
        mysql_close(pMySQL);
   
    [super dealloc];
}

-(bool) connect : (const char*) host
         loginID: (const char*) userid
     loginPasswd: (const char*) passwd
           setDB: (const char*) database
{
    isConnected = FALSE;
   
    pMySQL = mysql_init(&mySQL);
    if(pMySQL == NULL)
    {
        return FALSE;
    }
   
    pMySQL = mysql_real_connect(&mySQL, host, userid, passwd, database, 0, 0, 0);
    if(pMySQL == NULL)
    {
        return FALSE;
    }
   
    isConnected = TRUE;
   
    return TRUE;
}

-(bool) query: (const char*) str
{
    if(!pMySQL)
        return FALSE;
   
    int ret = mysql_query(pMySQL, str);
    if(ret != 0)
    {
        return FALSE;
    }
   
    pRes = mysql_store_result(pMySQL);
    rowCount = mysql_num_rows(pRes);
   
    NSLog(@"rows:%d", rowCount);
    return TRUE;
}

-(bool) getStringData: (int)idx toBuffer: (char *) buff;
{
    if(Rows[idx] == NULL)
        return FALSE;
   
    strcpy(buff, Rows[idx]);
    return TRUE;
}

-(bool) getRows
{
    Rows = mysql_fetch_row(pRes);
   
    if(Rows == NULL)
        return FALSE;

    return TRUE;
}

-(bool) isConnected
{
    return isConnected;
}

-(int) rowCount
{
    return rowCount;
}

@end

3) MyTest.m 편집
이제 테스트를 위하여 위에 작성된 클래스를 사용하여 MySQL서버에 접속하여 데이터를 가져오도록  MyTest.m 파일에 소스를 추가해 보겠습니다. 연결시 로그인 정보와 데이터 베이스, 쿼리 내용은 자신의 환경에 맞게 변경해 줍니다.

#import <Foundation/Foundation.h>
#import "MySqlDB.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    MySqlDB* myDB = [[MySqlDB alloc] initWithServer:"localhost"
                                            loginID:"test"
                                        loginPasswd:"1111"
                                              setDB:"cocoadev"];
   
    if([myDB isConnected] == true)
    {
        if([myDB query :"SELECT * FROM member"])
        {
            char buff1[128];
            char buff2[128];
           
            [myDB getRows];
            [myDB getStringData: 0 toBuffer: buff1];
            [myDB getStringData: 1 toBuffer: buff2];
           
            NSLog(@"DATA: id=%s, name=%s", buff1, buff2);
        }
        else
            NSLog(@"Fail to query");
    }
    else
        NSLog(@"Fail to connect.");
   
    [myDB release]
    [pool release];
    return 0;
}


3. 빌드옵션 설정 및 라이브러리 등록

MySQL 라이브러리를 사용하기 위해서는 링크시에 라이브러리를 추가하도록 등록하고, 헤더파일을 인크루드하기 위해 위치를 지정해 주어야 합니다.

GCC 옵션에서 -I(인클루드 패스 지정), -L(라이브러리 패스 지정), -l(라이브러리 추가) 옵션을 생각하시면 됩니다.

1) include 패스 설정
빌드시 헤더파일을 찾을 수 있도록 링크를 설정합니다. 프로젝트 정보창을 오픈합니다. Build 항목에서 "User Header Search Path"에 mysql의 include 패스를 입력합니다. 대부분 /usr/local/mysql에 설치되는데 다른 곳에 설치하신 분들은 그 곳의 패스를 입력합니다.
사용자 삽입 이미지

2. libmysqlclient.a 라이브러리 링크
사용자 삽입 이미지
파인더에서 해당 디렉토리에 접근하기 힘들기 때문에 터미널에서
 > open /usr/local/mysql/lib 로 파인더를 오픈합니다.

libmysqlclient.a 파일을 드래그 하여 좌측과 같이 Xcode의 Frameworks 그룹으로 가지고 옵니다.




이제 모든 준비가 완료되었습니다. 빌드 후 실행하여 아래와 같은 결과를 확인합니다.
사용자 삽입 이미지

코코아에서 MySQL 라이브러리를 사용하여 MySQL에 연결하는 방법을 간단히 알아 보았습니다. PostgreSQL이나 다른  C 라이브러리들도 위와 같은 방법으로 코코아에서 사용하실 수 있습니다.

티스토리 블로그 알리미를 작성한 적이 있는데, 설치형 블로그들은 위와 같이 DB에 직접 쿼리하는 방법으로 더욱 쉽고, 다용하고, 정확한 정보를 가져오는 툴을 작성할 수 있을 것 같습니다.

'Xcode 2 > Tip' 카테고리의 다른 글

Xcode에서 파이어폭스 플러그인 컴파일 하기  (0) 2007.12.04
pipe를 이용한 간단한 프로세스간의 통신  (6) 2007.11.28
Xcode에 Subversion 적용하기  (6) 2007.11.10
Xcode 단축키  (2) 2007.10.26
#pragma mark  (2) 2007.08.04
AND

프로젝트 진행 시에 다수 작업, 디버깅, 백업의 의미로 버젼관리는 매우 중요합니다. Xcode에서는  CVS, Subversion, Perforce, 3종류의 SCM(Software Configuration Management) 시스템을 지원합니다.

CVS
오픈소스로 유닉스/리눅스 계열에서 가장 오랫동안 많이 사용하는 버젼관리 시스템입니다. OS X에는 기본으로 설치가 되어있어 바로 사용이 가능합니다.

Subversion
CVS를 대체하기 위해서 나온 버젼관리 시스템으로, CVS에 비해 많은 장점을 가지고 있습니다. 여기서는 Subversion을 이용해 보겠습니다.

Perforce
Perforce Software에서 제공하는 상용 버젼관리 툴입니다.

SVS와 Subversion에 관한 자세한 사항은 아래의 KLDP Wiki를 확인하시고, 여기서는 Xcode에서 Subversion을 사용하는 방법에 대해서 간단히 알아 보겠습니다.


1. Subversion 다운로드/설치

사용자 삽입 이미지
이곳
을 클릭하시고 맥 OS X용 Subversion 설치파일(dmg)을 다운로드 받습니다.

현재 버젼은 1.4.4로 설치 프로그램을 실행하시면 간단히 설치하실 수 있습니다.

(소스코드설치를 원하시면 Subversion 사이트에서 다운로드 받으실 수 있습니다.)

설치가 완료되면 /usr/local/bin/에 실행파일들이 위치합니다. .bash_profile의 PATH에 /usr/local/bin을 추가하시면 터미널에서 사용이 편리합니다.


2. 프로젝트에 Subversion 적용

저는 Test란 프로젝트에 적용해 보겠습니다. 프로젝트명, 위치등은 각자 환경에 맞게 변경하여 작업하시면 됩니다. 우선 아래와 같이 저장소 디렉토리 svn_test를 생성합니다.

>/usr/local/bin/svnadmin create ~/svn_test


프로젝트를 가져오기 위하여 아래와 같이 tmp라는 임시폴더와 그 아래 trunk, branches, tags 디렉토리를 각각 생성합니다. 그 후에 cp 명령으로 적용시킬 프로젝트를 임시 디렉토리로 복사합니다.  [프로젝트 디렉토리]는 가져 올 프로젝트가 위치한 경로 입니다.

> mkdir tmp
> mkdir tmp/Test
> cd tmp/Test
> mkdir trunk
> mkdir branches
> mkdir tags
> cp -r [프로젝트 디렉토리] ~/tmp/Test/trunk


이제 svn_test 저장소로 프로젝트를 저장합니다. [계정아이디]는 현재 계정 아이디를 입력하시면 됩니다. 아래의 이미지를 클릭하시면 확대하여 확인하실 수 있습니다.

>/usr/local/bin/svn import ~/tmp/Test file:///Users/[계정아이디]/svn_test --message 'Start...'

사용자 삽입 이미지


그 후에 작업할 디렉토리로 프로젝트를 가지고 옵니다. [프로젝트 디렉토리]는 Test 프로젝트를 저장소로 부터 가져 올 디렉토리이며 전 ~/Projects란 디렉토리로 설정하였습니다. 위와 같이 아래의 이미지를 클릭하여 보시면 이해가 빠르실 겁니다.

> cd [프로젝트 디렉토리]
> /usr/local/bin/svn checkout file:///Users/[계정아이디]/svn_test Test

사용자 삽입 이미지

임시 폴더를 아래와 같이 삭제하고,  확인을 위하여 Xcode를 실행합니다.

> cd ~/tmp/
> rm -fR Test/


3. Xcode 설정 및 확인

사용자 삽입 이미지

이제 Xcode의 Open메뉴에서 터미널에서 설정하였던 디렉토리의 trunk/[프로젝트명]에서 프로젝트 파일을 가지고 옵니다. 저는 Projects/Test/trunk/Test로 되어 있습니다.

프로젝트 정보창을 열어 Genral  메뉴 하단의 SCM 설정을 아래와 같이 Subversion으로 선택하고 Enable SCM을 체크합니다.
사용자 삽입 이미지

이제 소스코드를 수정하여 봅니다. 확인을 위하여 아래와 같이 기존 소스에 "NSLog..." 라인을 추가하였습니다.
사용자 삽입 이미지

이제 Xcode의 SCM 메뉴에서 Compare With Revision... 을 실행합니다. 비교할 버젼을 선택한 후 [Compare] 버튼을 클릭하시면 이전 버젼과 현재 파일의 차이점을 아래와 같이 확인하실 수 있습니다.
사용자 삽입 이미지

이제 SCM 메뉴의 Commit Changes... 을 클릭하여 현재 상태를 새로 저장합니다. 변경에 대한 간단한 메시지를 작성한 후 [commit] 버튼을 클릭합니다. Get SCM Info를 클릭하시면 아래와 같이 Test.m 파일에 관한 버젼 히스토리를 확인할 수 있습니다.
사용자 삽입 이미지

'Xcode 2 > Tip' 카테고리의 다른 글

Xcode에서 파이어폭스 플러그인 컴파일 하기  (0) 2007.12.04
pipe를 이용한 간단한 프로세스간의 통신  (6) 2007.11.28
Cocoa에서 MySQL 라이브러리 사용하기  (6) 2007.11.13
Xcode 단축키  (2) 2007.10.26
#pragma mark  (2) 2007.08.04
AND