woong's

Xcode Realm 사용하기 본문

Develop/IOS

Xcode Realm 사용하기

dlsdnd345 2016. 3. 15. 14:22
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

Xcode Realm 사용하기


안녕하세요. android 에 이어서 ios 도 Realm 사용법에 대해서 작성해보려 합니다.


소개


우선 많은 메이져 사에서 사용하고 있는것 같습니다. 메이져사 뿐만아니라 소개를 보면 저희가 알만한

스타트업에서도 많이 사용 하고 있습니다.

Gradle , Rxjava , 암호화 , 여러 플랫폼 지원 등 다방면으로 사용할수 있도록

언어도 여러 나라 지원하는 있습니다. 무엇보다 좋은것은 한글을 지원하고 있네요!

속도면에서도 기존의 sqlLite 보다 월등히 앞서는 것을 볼수 있습니다. 이런것을 보면 한번 시도,

적용해보는것도 좋을것 같다는 생각이 듭니다.









사전 준비 작업


ios 에서 램을 사용하기 위해서 간단한 사전 준비 작업이 필요 합니다. 우선 cocoaPods 를

사용해서 Realm 라이브러리를 import 해야 합니다. 이부분의 설명은 링크의 포스트로 대체 합니다.

cocoaPods를 통해서 Realm 을 import 했으면 프로젝트를 workspace로 실행해서 Realm plugin을

받기위한 선행작업이 필요 합니다.  [cocoaPods 사용하기]


Realm plugin 을 받기 위해서 Alcatraz 를 이용하여 Plugin 을 다운로드해야합니다.


터미널에 아래 명령어를 입력해서 다운로드를 진행 합니다.


1
curl -fsSL https://raw.githubusercontent.com/supermarin/Alcatraz/deploy/Scripts/install.sh | sh
cs


다운로드를 완료를 했으면 xcode 를 완전히 종료후에 다시 실행하면 팝업이 나타납니다.

팝업에서 load를 선택하면 Window < Package Manager 가 나타납니다.

Package Manager 를 선택후 Realm Plugin을 다운로드 합니다.





위와같이 준비를 완료 하면 이제 코드를 작성할 환경이 구축 되었습니다.


코드 작성


IOS 도 객체 VO 를 통해서 테이블이 생성되고 컬럼이 생성 됩니다.

플러그인 설정을 완료 하면 파일 생성에 Realm 파일이 존재 합니다. 생성합니다.




1
2
3
4
5
6
7
8
9
10
11
12
#import <Realm/Realm.h>
 
@interface User : RLMObject
 
@property NSString *name;
@property int age;
 
@end
 
// This protocol enables typed collections. i.e.:
// RLMArray<User>
RLM_ARRAY_TYPE(User)
cs


생성후에 위와 같이 .h 를 작성 하였습니다. 이렇게 작성하면 User 테이블에 name , age 컬럼이

생성됩니다. 여기서 primeryKey , ignore 등 옵션은 .m 파일에 구현하면 됩니다. 이런 부가적인

속성은 따로 문서를 보고 따라해보시면 금새 할수 있을것 같습니다.


위와 같이 작성후에 ViewController 화면으로 이동합니다.


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
46
#import "ViewController.h"
#import "User.h"
 
@interface ViewController ()
 
@end
 
@implementation ViewController
 
RLMRealm *realm;
 
- (void)viewDidLoad {
    [super viewDidLoad];
 
    //데이터 초기화
    [self initData];
}
 
 
/**
 * 데이터 초기화
 */
- (void) initData{
    
    realm = [RLMRealm defaultRealm];
    NSLog(@">>> %@" , realm.path);
    
    
    //유저 데이터 반환
    RLMResults<User *> *userList = [self getUserList];
    NSLog(@">>> user  : %ld " , userList.count); // : 0
 
}
 
 
/**
 * 유저 데이터 반환
 */
- (RLMResults<User *> *) getUserList{
    RLMResults<User *> *userList = [User allObjects];
    return userList;
}
 
 
@end
 
cs


이동하여 Realm 객체를 초기화 하고 모든 유저를 검색하는 코드를 작성하였습니다.

getUserList 함수가 핵심 코드입니다. 여기까지의 사이즈는 0 입니다.

RLMResults<Dog *> *r = [Dog objectsWhere:@"age > 8"];

위와 같은 문법을 통해서 조건 , 정렬 등 여러 질의를 할수 있습니다.

이포스트에서는 간단하게 모든 검색을 해보고 , 저장하고 , 삭제하는 코드를 작성해 보겠습니다.


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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#import "ViewController.h"
#import "User.h"
 
@interface ViewController ()
 
@end
 
@implementation ViewController
 
RLMRealm *realm;
 
- (void)viewDidLoad {
    [super viewDidLoad];
 
    //데이터 초기화
    [self initData];
}
 
 
/**
 * 데이터 초기화
 */
- (void) initData{
    
    realm = [RLMRealm defaultRealm];
    NSLog(@">>> %@" , realm.path);
    
    
    //유저 데이터 반환
    RLMResults<User *> *userList = [self getUserList];
    NSLog(@">>> user  : %ld " , userList.count); // : 0
 
    //유저 데이터 저장
    [self insertUserData];
    NSLog(@">>> user  : %ld " , userList.count); // : 1
 
}
 
 
/**
 * 유저 데이터 반환
 */
- (RLMResults<User *> *) getUserList{
    RLMResults<User *> *userList = [User allObjects];
    return userList;
}
 
 
/**
 * 유저 데이터 저장
 */
- (void) insertUserData {
    
    User *user = [[User alloc]init];
    user.name = @"woong";
    user.age = 27;
    
    [realm beginWriteTransaction];
    [realm addObject:user];
    [realm commitWriteTransaction];
}
 
 
@end
 
 
 
cs


저장하는 코드를 작성하였습니다. 핵심코드는 insertUserData 함수가 되겠습니다.

User 객체를 생성해서 데이터를 넣고 테이블에 저장을 하였습니다.

Realm 은 한테스크를 명시하기 위해서 트랜잭션 시작과 종료로 명시 하고 있습니다.

위와같이 코드를 작성 하면 테이블의 로우가 1 로 변경되는것을 확인 할수 있습니다.

하지만 여기서 이상한점이 있습니다. 데이터를 저장하고 검색을 하지 않았는데 사이즈의 갯수가 변경되었습니다.

Realm 의 장점으로 라이브로 데이터를 갱신해주는것이 있습니다. 그래서 따로 검색을 다시 하지 않아도 자동 갱신이 됩니다.


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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#import "ViewController.h"
#import "User.h"
 
@interface ViewController ()
 
@end
 
@implementation ViewController
 
RLMRealm *realm;
 
- (void)viewDidLoad {
    [super viewDidLoad];
 
    //데이터 초기화
    [self initData];
}
 
 
/**
 * 데이터 초기화
 */
- (void) initData{
    
    realm = [RLMRealm defaultRealm];
    NSLog(@">>> %@" , realm.path);
    
    
    //유저 데이터 반환
    RLMResults<User *> *userList = [self getUserList];
    NSLog(@">>> user  : %ld " , userList.count); // : 0
 
    //유저 데이터 저장
    [self insertUserData];
    NSLog(@">>> user  : %ld " , userList.count); // : 1
 
    //유저 삭제
    [self deleteUserData];
    NSLog(@">>> user  : %ld " , userList.count); // : 2
}
 
 
/**
 * 유저 데이터 반환
 */
- (RLMResults<User *> *) getUserList{
    RLMResults<User *> *userList = [User allObjects];
    return userList;
}
 
 
/**
 * 유저 데이터 저장
 */
- (void) insertUserData {
    
    User *user = [[User alloc]init];
    user.name = @"woong";
    user.age = 27;
    
    [realm beginWriteTransaction];
    [realm addObject:user];
    [realm commitWriteTransaction];
}
 
 
/**
 * 유저 데이터 삭제
 */
- (void) deleteUserData {
    
    [realm beginWriteTransaction];
    RLMResults<User *> *userList = [User allObjects];
    [realm deleteObject: [userList objectAtIndex:0]];
    [realm commitWriteTransaction];
}
 
 
 
cs


데이터를 삭제 하였습니다. 핵심코드는 deleteUserData 함수입니다.

테이블의 데이터를 불러와 0번째 인덱스의 유저 데이터를 삭제하라는 코드입니다.

이렇게 저장, 검색 , 삭제의 코드를 알아보았습니다.


결론


위와 같이 사용해본 결과 오타로 인한 쿼리 에러를 만나지 않아서 굉장히 좋았습니다.

또한 테이블 생성을 자동으로 해주고 매칭이 되기 때문에 간편하게 DB를 작성할 수있었습니다.

여기서는 사용해보지 않았지만 , 트랜잭션 관리 , 검색 등 편리하게 사용할수 있는부분이 있고

비동기 처리를 통해서 데이터가 많은 경우 버퍼를 주지 않도록 해주는 기능들도 있습니다.

앞으로의 프로젝트에 적용해보록 해보아야 겠습니다.


Comments