이번에는 Core Data를 이용해 간단한 할일(Todo) 어플리케이션을 만들어 보겠습니다. Core Data는 객체의 연결, 저장, 불러오기등의 복잡한 데이터 관련 작업을 쉽게 관리할 수 있도록 해줍니다. 많은 부분이 자동화 되어 있어 개발자가 해야할 작업은 매우 적습니다. 실제 이번 예제에서도 모델링 툴과 인터페이스 빌더를 이용하여 객체를 생성하고 연결하는 작업만 하고 소스코드에서는 작업을 하지 않을 것입니다.

이 예제는 ADC에서 제공하는 Building a Sample Core Data Application 동영상 강좌를 참고하였습니다. 동영상으로 되어 있기 때문에 이 포스팅 보다 따라 해보기가 매우 쉬우실 것입니다. Core Data에 관한 상세한 내용은 Core Data Programming Guide 문서를 참조하시기 바랍니다.

1. 프로젝트 생성
New Project에서 Core Data Document-based Application을 선택합니다. Core Data Document-based Application은 Document와 연결된 datamodel을 생성해주고, 파일 Open/Save와 MDI를 지원합니다.

Project Name을  'MyToDoList'로 입력하고 [Finish] 버튼을 클릭합니다.

사용자 삽입 이미지
이제 Xcode에서 좌측과 같이  Models 밑에MyDocument.xcdatamodel이 생성되어 있음을 확인할 수 있습니다.


2. 데이터 모델링 툴
작업을 위해 MyDocument.xdatamodel을 더블클릭하면, 아래와 같은 데이터 모델링 툴이 오픈됩니다.
사용자 삽입 이미지

일반적인 모델링 툴과 사용방법이 유사합니다. 상단 좌측에서 객체를 생성하고 우측의 창에서 객체들의 각각의 속성을 관리합니다. 우측에 현재 'No Selection'로 표시된 영역에서 선택된 값들의 세부 속성을 설정합니다. 하단에는 생성된 객체들이 그래픽한 다이어그램으로 표시되어 쉽게 속성과 연결을 확인할 수 있습니다.

3. 오브젝트 생성
Todo 어플리케이션은 작업들의 목록과 각 작업들 아래 세부 작업들을 관리할 수 있도록 만들려고 합니다. 이를 위해 작업(Work)와 세부작업(Todo)의 두개의 객체(NSManagedObject)를 생성하겠습니다. 좌측 상단의 Entity필드가 있는 목록 하단에 위치한 +버튼을 두번 클릭하여 2개의 객체를 생성 합니다.

사용자 삽입 이미지
좌측과 같이 Entity를 Work와 Todo로 변경합니다.


4. 항목 설정
사용자 삽입 이미지
이제 각각의 객체에 항목을 추가하겠습니다. Work 객체를 선택한 상태에서 우측에 있는 Property 목록 하단의 + 버튼을 클릭합니다. 나오는 메뉴중에서 좌측과 같이 Add Attribute를 클릭합니다.

생성된 항목의 속성 창에서 Name을 'title'로 Default Value를 '새작업'으로 입력합니다.
사용자 삽입 이미지

이제 Todo를 선택하고 위와 같은 방법으로 세개의 항목을 추가하고 아래와 같이 속성을 설정합니다.
사용자 삽입 이미지

5. 연결(RelationShip) 설정

사용자 삽입 이미지
Work가 선택된 상태에서 좌측과 같이 + 버튼의 Add RelationShip을 클릭하여 새로운 연결을 생성합니다.



아래와 같이 속성에서 이름을 todo(소문자로 시작해야 합니다.)로 설정하고 Destination에서 연결될 객체를 Todo를 선택합니다.
사용자 삽입 이미지

이제 Todo를 선택하고 위와 같은 방법으로 RelationShip을 추가합니다. Destination은 Work 객체로 Inverse를 todo로 선택하여 상호 참조할 수 있도록 해줍니다.
사용자 삽입 이미지

이제 다시 Work 객체의 todo에서 아래와 같이 설정합니다. 하나의 Work에 여러개의 Todo가 연결될 수 있도록 To-Many Relationship에 체크합니다.
사용자 삽입 이미지


6. 확인
사용자 삽입 이미지
하단을 보시면 좌측과 같이 지금까지 작업한 내용을 쉽게 확인할 수 있습니다.

Work와 Todo는 연결되어 있고 Todo쪽의 화살표가 이중으로 표시되어 있습니다. 이는 Work와 Todo가 1:N으로 연결(To-Many Relationship)되어 있슴을 나타냅니다. 하나의 Work에 대하여 여러개의 Todo가 올수 있습니다.

7. ArrayController 생성

이제부터 인터페이스 빌더에서 작업을 작업을 해보겠습니다. MyDocument.nib를 더블클릭하여 인터페이스 빌더를 오픈합니다.

사용자 삽입 이미지
좌측과 같이 팔레트 윈도우에서 >> 버튼을 클릭하고 나오는 메뉴에서 Controllers를 클릭합니다.

좌측 하단의 NSArrayController를 드래그하여 인스턴스 창에 가져다 놓습니다. 한번 더 반복합니다.


사용자 삽입 이미지
가져온 컨트롤러의 이름을 위와 같이 WorkController와 TodoController로 변경합니다.

1) WorkController 설정
사용자 삽입 이미지
WorkController 속성중 Attribute에서 좌측과 같이 Mode를 Entity로 체크하고 이름을 Work로 입력합니다.
Automatically prepares content에 체크합니다.



사용자 삽입 이미지
Binding 항목 하단에 있는 Parameters의 ManagedObjectContext를 좌측과 같이 설정합니다.





2) TodoController 설정
사용자 삽입 이미지
TodoController도 EntityName만 Todo로 입력하고 위와 동일하게 설정합니다.

그외에 Todo가 Work에 종속성을 가지도록 한가지 작업을 더 합니다. Binding 항목의 Controller Content 밑의 ContentSet의 항목을 좌측과 같이 설정합니다.




8. 사용자 인터페이스
윈도우에 NSTableView 2개와 NSTextField, NSDataPicker, NSSearchField, NSButton들을 아래와 같이 배치합니다.

각각의 테이블뷰 Inspector의 Attribute에서 Columns를 1과 3으로 설정하고 각 컬럼을 더블클릭하여 '작업', '완료', '할일', '예정일'로 이름을 변경합니다.
사용자 삽입 이미지

9. Work, Todo 테이블컬럼 설정
1) Work - 작업 컬럼(NSTableColumn)
작업 컬럼을 더블클릭하여 아래와 같이 설정합니다.
사용자 삽입 이미지

2) Todo - 완료 컬럼(NSTableColumn)
Todo 컬럼들은 직접입력을 막기 위해 모두 Attribute에서 Editable의 체크를 해제합니다.  Binding에서 각각의 컬럼들을 아래와 같이 설정합니다.
사용자 삽입 이미지

3) Todo - 할일 컬럼(NSTableColumn)
사용자 삽입 이미지

4) Todo - 예정일 컬럼(NSTableColumn)
사용자 삽입 이미지

5) 작업:(NSTextField)
사용자 삽입 이미지

10. 기타 컨트롤 설정
1) 완료 예정일 :(NSDatePicker)
사용자 삽입 이미지

2) 완료:(NSButton)
사용자 삽입 이미지

3) 검색(NSSearchField)
Binding에서 Search/predicate에서 아래와 같이 설정합니다. Predicate Format:에서  key가 'memo'로 변경되었습니다.
사용자 삽입 이미지

4) 동작 버튼
이제 각각의 버튼을 컨트롤키와 함께 드래그해서 Controller에 연결해서 아래와 같이 설정합니다. 좌측의 두 버튼은 WorkController에 우측의 두 버튼은 TodoController에 연결하고, '+' 버튼은 add:에 '-' 버튼은 remove:에 연결합니다.
사용자 삽입 이미지

11. 완료
이제 모든 작업이 완료되었습니다. 빌드를하고 테스트를 해봅니다. 좌측에서 작업을 먼저 입력하시고 작업별로 할일을 등록하시면 됩니다.

사용자 삽입 이미지

사용자 삽입 이미지

마우스 클릭과 속성 설정만으로 등록, 변경, 검색, 저장, 불러오기등이 동작하는 간단한 ToDo 어플리케이션을 만들어 보았습니다. 프로젝트 파일은 아래의 아이콘을 클릭하여 다운로드 받으실 수 있습니다.

'Xcode 2 > Cocoa 따라해보기' 카테고리의 다른 글

간단한 웹브라우저 만들기  (0) 2008.04.02
1.10 기본 콘트롤 사용법 (2)  (0) 2008.02.13
1.10 기본 콘트롤 사용법 (1)  (2) 2008.02.03
1.8 간단한 슈팅게임 (2)  (2) 2007.10.03
1.8 간단한 슈팅게임 (1)  (4) 2007.08.14
AND

개발 툴 2008. 2. 20. 16:10
사용자 삽입 이미지
리눅스 배포본과 마찬가지로 맥 OS X에는 기본적으로 파이썬이 설치되어 있습니다. 터미널에서 > python[enter]을 입력하면 현재 설치된 파이썬의 버젼을 확인할 수 있습니다. OS X 10.4 (타이거)의 경우에는 2.3대 버젼이 설치되어 있습니다.

현재 파이썬의 경우는 2.5.1 버젼이 나와 있으며 파이썬 사이트에서 다운로드 받을 수 있습니다. GUI 환경에서 클릭만으로 설치할 수 있는 OS X 버젼이 따로 있으니 버젼업을 원하시는 분들은 다운로드 받으셔서 설치하시면 됩니다.

사용자 삽입 이미지
설치는 MacPython.mpkg를 더블클릭하면 간단히 설치됩니다. 설치가 완료되면 응용 프로그램 폴더의 MacPython2.5 폴더에 파이썬의 GUI 툴들이 설치됩니다.

좌측은 파이썬 통합개발환경인 IDLE를 실행한 모습입니다.



기존 버젼은  /System/Library/Frameworks/에 위치하지만 맥파이썬으로 설치하면 /Library/Frameworks/에 설치됩니다. 파이썬 실행 파일들은  /usr/bin/에 위치하며 2.3 버젼의 실행파일에 심볼릭 링크되어 있습니다. 아래와 같이 링크를 변경하면 쉘에서도 2.5 버젼을 사용하실 수 있습니다.

> cd /usr/bin/

> sudo ln -s -f /Library/Frameworks/Python.framework/Versions/2.5/bin/python ./python

> sudo ln -s -f /Library/Frameworks/Python.framework/Versions/2.5/bin/pydoc ./

> sudo ln -s -f /Library/Frameworks/Python.framework/Versions/2.5/bin/pythonw ./

이외에 Objective-C와 혼용 해서 사용할 수있게 해주는 PyObjC가 있습니다. OS X 버젼으로 다운로드 받고 설치하면 Xcode에 PyObjC 프로젝트에 관련된 템플릿을 등록시켜 줍니다. OS X 10.5 (레오퍼드)에는 기본으로 설치되어 있다고 하는데 확인하지는 못했습니다.

저는 파이썬을 능숙하게 사용하지 못합니다. 하지만 간단한 용도로 log등의 대용량 텍스트 파일 처리나 DB에서 데이터를 가져와서 재가공해서 넣는 작업, 복잡한 수치 계산, 쉘스크립트 대용으로 매우 유용하게 사용하고 있습니다.

파이썬은 다른 언어와 비교해 시작하기가 매우 쉽고, 용도에 따라 다양한 모듈을 가지고 있으며 강력합니다. OS X, 리눅스는 물론이고 윈도우즈에서도 편리하게 사용할 수 있습니다. IT관련 업무를 하는 분들이 아니더라도 컴퓨터를 이용해 효율적인 작업을 하고 싶은 분들은 잠깐 시간을 투자하여 배워 보시는 것도 괜찮을 것 같습니다.
AND

이전 포스트에 이어서 프로그램을 완성해 보겠습니다. 이전의 소스에서 아래의 청색으로 된 부분을 추가합니다.

1. AppController.h 수정

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {
    NSMutableString *curString;
    NSString* dataArray[3][2];
   
    IBOutlet NSTextField* displayString;
    IBOutlet NSTableView* wordList;
    IBOutlet NSMatrix* subjectMatrix;
    IBOutlet NSComboBox* adverbSelecter;
    IBOutlet NSColorWell* colorWell;
    IBOutlet NSSlider* alignSlider;
    IBOutlet NSButton* notChecker;
    IBOutlet NSProgressIndicator* progressBar;   
}

- (int)numberOfRowsInTableView:(NSTableView *)tableView;
- (id)tableView:(NSTableView *)tableView
    objectValueForTableColumn:(NSTableColumn *)tableColumn
            row:(int)row;

- (IBAction)setDisplayText:(id)sender;
- (IBAction)adverbSelecterChanged:(id)sender;
- (IBAction)alignSliderChanged:(id)sender;
- (IBAction)notCheckerChanged:(id)sender;
- (IBAction)subjectMatrixChanged:(id)sender;
- (IBAction)colorWellChanged:(id)sender;
- (IBAction)wordListChanged:(id)sender;
@end


2. 인터페이스 빌더에서 수정

변경한 소스를 저장한 후에 변경된 사항을 인터페이스 빌더에 적용하기 위해서 다시 AppController.h 파일아이콘을 드래그 하여 인터페이스 빌더의 MainMenu.nib에 놓습니다.

사용자 삽입 이미지
좌측과 같이 윈도우의 TableView중에 목적어 컬럼을 선택합니다. 속성창을 열어 Identifier 항목을 1로 설정합니다.

이와 동일하게 동사 컬럼의 Identifier는 2로 설정합니다.




사용자 삽입 이미지
AppController에서 새로 추가한 메소드인 wordListChanged르 TableView에 연결합니다.

TableView를 선택하고 Control키를 클릭한 채 마우스로 드래그 하여 AppController 인스턴스에 가져다 놓습니다. 좌측의 속성 화면에서 wordListChanged를 선택하고 연결합니다.

(연결이 어려우신 분들은 이전 포스트를 참조하세요.)


3. AppController.m 수정

#import "AppController.h"

@implementation AppController

- (id)init
{
    self = [super init];
   
    curString = [[NSMutableString alloc] init];

    /* 목적어 데이터 설정 */

    dataArray[0][0] = [[NSString alloc] initWithUTF8String:"철수를"];
    dataArray[1][0] = [[NSString alloc] initWithUTF8String:"영희를"];
    dataArray[2][0] = [[NSString alloc] initWithUTF8String:"바둑이를"];
   
    /* 동사 데이터 설정 */
    dataArray[0][1] = [[NSString alloc] initWithUTF8String:"사랑했다"];

    dataArray[1][1] = [[NSString alloc] initWithUTF8String:"싫어했다"];
    dataArray[2][1] = [[NSString alloc] initWithUTF8String:"때렸다"];
   
    return self;
}

- (void)awakeFromNib
{
}

- (void)dealloc
{
    int i, j;
   
    /* 할당된 오브젝트 해제 */
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 2; j++)
        {
            [dataArray[i][j] dealloc];
        }
    }
   
    [curString dealloc];
    [super dealloc];
}

- (IBAction)setDisplayText:(id)sender
{
    int pos = [wordList selectedRow]; // 테이블뷰에서 현재 선택된 열
    if(pos == -1) // 없으면 실행하지 않는다
        return;
   
    /** 조건에 따른 문자열 설정 */
    if([[subjectMatrix selectedCell] tag] == 0)
        [curString setString:[NSString stringWithUTF8String:"나는 "]];
    else
        [curString setString:[NSString stringWithUTF8String:"너는 "]];
   
    [curString appendString:dataArray[pos][0]];
    [curString appendString:@" "];
    [curString appendString: [adverbSelecter stringValue]];
       
    if([notChecker state] == NSOnState)
        [curString appendString:[NSString stringWithUTF8String:" 안 "]];
   
    [curString appendString:dataArray[pos][1]];
   
    /* 색상 설정 */
    [displayString setTextColor:[colorWell color]];
   
    /* 정렬 설정 */
    int align = [alignSlider intValue];

    if(align == 0)
        [displayString setAlignment:NSLeftTextAlignment];
    else if(align == 50)
        [displayString setAlignment:NSCenterTextAlignment];
    else
        [displayString setAlignment:NSRightTextAlignment];
   
    /* 텍스트 출력 */
    [displayString setStringValue:curString];
   
    /* 진행 상태바 에니메이션 중지 */
    [progressBar stopAnimation:self];

}

- (IBAction)adverbSelecterChanged:(id)sender
{
    /* 변경시 진행 상태바 에니메이션 시작 */
    [progressBar startAnimation:self];
}

- (IBAction)alignSliderChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (IBAction)notCheckerChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (IBAction)subjectMatrixChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (IBAction)colorWellChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (IBAction)wordListChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (int)numberOfRowsInTableView:(NSTableView *)tableView
{
    /* 테이블 열 갯수 3 반환 */
    return 3;

}

- (id)tableView:(NSTableView *)tableView
    objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
    int pos;

    /** 현재 설정되어야 할 TableView의 컬럼을 반환한다. */
    if([[tableColumn identifier] characterAtIndex:0] == '1')
        pos = 0;
    else
        pos = 1;
   
    return dataArray[row][pos];
}

@end


사용자 삽입 이미지
이제 빌드를 하고 실행 하시면 좌측과 같이 어플리케이션이 실행됩니다. 각각의 옵션을 선택하고 [적용] 버튼을 클릭하면 선택된 옵션에 맞추어 상단에 텍스트가 출력됩니다.

옵션에 변동이 일어나면 하단의 바가 에니메이션되며 [적용] 버튼을 클릭하여 적용이 완료되면 진행 상태바의 에니메이션이 중지 됩니다.

전체 프로젝트 소스파일은 아래를 클릭해서 다운로드 받이스면 됩니다.







AND