SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Downloaden Sie, um offline zu lesen
NHN	NEXT	Eunjoo	Im
iOS

Ream.io
database
NHN NEXT

iOS Advanced
NHN	NEXT	Eunjoo	Im
Realm이란?
▪ 빠르게 성장하는 모바일 데이터베이스 (오픈소스)

▪ http://realm.io/kr

▪ SQLite 와 CoreData를 대체할수 있는

크로스 플랫폼 데이터베이스
출처: Let’Swift 2016 Realm.io 세션
NHN	NEXT	Eunjoo	Im
Realm 역사
출처: https://realm.io/kr/
2014년 7월 15일 공개
2년이 지난 지금 Realm 사용 기업
NHN	NEXT	Eunjoo	Im
C++ 기반의

크로스

플랫폼
출처: Let’Swift 2016 Realm.io 세션
SQLite 기반이 아니라 고유 C++ 코어를 가짐
NHN	NEXT	Eunjoo	Im
Realm의

장점
출처: https://realm.io/kr/
▪ 빠른 속도

▪ 모바일을 위해서 만들어졌기 때문에,

데이타를 저장하고 불러오는 것이 빠르고 효율적

▪ 풍부한 기능

▪ 마이그레이션, 그래프 쿼리, 암호화와 쓰레드 등의 다
양한 기능을 지원

▪ 쉬운 사용

▪ Object를 상속하여 쉬운 사용
NHN	NEXT	Eunjoo	Im
빠른 속도(1)

: v.s. SQLite
출처: http://static.realm.io/downloads/java/android-benchmark.zip
NHN	NEXT	Eunjoo	Im
빠른 속도(2)

: Zero-copy
▪ 기존 ORM은 Copy가 필요

▪ Realm은 Copy가 불필요

▪ memory mapped file 사용

▪ In-memory 처럼 disk 사용

▪ 읽을 데이터의 offset 계산

▪ mapped file에서 읽어옴

▪ property에 access해서 원본값을 반환

▪ Results 자동 업데이트
출처: Let’Swift 2016 Realm.io 세션
NHN	NEXT	Eunjoo	Im
쉬운 사용(1)

: 간결한 코드
▪ RLMObject를 상속하여 모델 정의

▪ 속성은 property로 사용하여 정의

▪ 관계와 자료구조는 타겟 타입의 속성이나 RLMArray의 객체
리스트를 포함하여 간단하게 정의
출처: https://realm.io/kr/
NHN	NEXT	Eunjoo	Im
쉬운 사용(1)

: 간결한 코드
출처: http://stackoverflow.com/questions/20649350/updating-object-with-core-data-inserts-a-new-record
Entity * entityInstance = nil;

entityInstance = [self fetchEntityForID:entityInstanceID
inContext:context];

if (entityInstance == nil) {

entityInstance = [NSEntityDescription
insertNewObjectForEntityForName:@"Entity"
inManagedObjectContext:context];

}

- (Entity *)fetchEntityForID:(NSNumber *) articleID inContext:
(NSManagedObjectContext *) writeContext {

NSFetchRequest *fetchRequest = [NSFetchRequest
fetchRequestWithEntityName:@"Entity"];

NSPredicate * predicate = [NSPredicate
predicateWithFormat:@"articleID == %@",articleID];

[fetchRequest setPredicate:predicate];

NSArray *fetchedArray = [writeContext
executeFetchRequest:fetchRequest error:nil];

if ([fetchedArray count] > 0)

return [fetchedArray objectAtIndex:0];

return nil;

}
Core data로 insert or update
NHN	NEXT	Eunjoo	Im
쉬운 사용(1)

: 간결한 코드
Realm으로 insert or update
출처: https://realm.io/kr/
NHN	NEXT	Eunjoo	Im
쉬운 사용(2)

: 다양한 쿼리
▪ Chaining이 가능한 다양한 쿼리 지원 e.g. 필터링

▪ 하나 또는 여러 개의 속성으로 정렬 기준이나 순서 설정
출처: https://realm.io/kr/
NHN	NEXT	Eunjoo	Im
풍부한 기능
(1)

: 암호화
출처: https://realm.io/kr/
▪ 생성 시에 64 바이트 암호화 키를 제공하면
AES-256+SHA2 방식으로

디스크 내 데이터베이스 파일의 암호화를 지원
NHN	NEXT	Eunjoo	Im
풍부한 기능
(2)

: notification
출처: https://realm.io/kr/
▪ addNotificationBlock 메서드를 호출해서 RLMRealm,
RLMResults, RLMArray, RLMLinkingObjects가 업데이
트될 때마다 통지를 받도록 등록

▪ 단일 RLMObject의 변화를 감지하기 위해 Key-Value
Observation을 사용 가능

▪ Realm 객체는 쓰기 트랜잭션 커밋시마다 알림을 보내줌
NHN	NEXT	Eunjoo	Im
풍부한 기능
(3)

: browser
출처: https://realm.io/kr/
▪ 데이터베이스를 읽고 편집할 수 있는 브라우저 제공
NHN	NEXT	Eunjoo	Im
풍부한 기능(4)

: Xcode

플러그인
출처: https://realm.io/kr/
▪ 새 Realm 모델을 쉽게 만들 수 있는 플러그인 제공
NHN	NEXT	Eunjoo	Im
풍부한 기능(4)

: Realm

add-ons
출처: https://realm.io/kr/
▪ Realm 기반의 앱 개발에 도움이 되는 커뮤니티 애드온
NHN	NEXT	Eunjoo	Im
실습(1)

: Realm 설정
▪ CocoaPods 이용

▪ Podfile에 pod ‘Realm’을 앱 타겟에 추가하고 pod
‘Realm/Headers’를 테스트 타겟에 추가

▪ 커맨드라인을 통해 pod install을 실행

▪ Static Framework

▪ Realm의 최신 버전을 다운로드해서 압축 풀기

▪ ios/static/ 디렉토리에서 Realm.framework 을 선택하여
Xcode 프로젝트의 File Navigation에 넣기 (Copy items if
needed 체크)

▪ Xcode의 File Navigator에서 프로젝트 클릭 >

어플리케이션 대상 선택 > Build Phases > 

Link Binary with Libraries 의 + 클릭 > libc++.tbd 를 추가
NHN	NEXT	Eunjoo	Im
실습(2)

: 모델 설정
#import <Realm/Realm.h>

@interface EJRealmData : RLMObject

@property NSInteger id;

@property BOOL status;

@property int type;

@property int character;

@property NSString *title;

@property NSDate *date;

@property NSString *start;

@property NSString *end;

@property NSString *current;

@property NSString *unit;

@property NSString *startString;

@property NSString *endString;

@property NSString *now;

@property float percent;

@end

RLM_ARRAY_TYPE(EJRealmData)
#import "EJRealmData.h"

@implementation EJRealmData

+ (NSString *)primaryKey {

return @"id";

}

+ (NSArray *)requiredProperties {

return @[@"id", @"type", @"title"];

}

+ (NSArray *)ignoredProperties {

return @[@"startString", 

@"endString", @"now", @"percent"];
}

+ (NSArray *)indexedProperties {

return @[@"status"];

}

+ (NSDictionary *)defaultPropertyValues {
return @{@"status" : @YES};

}

@end
<EJRealmData.h> <EJRealmData.m>
기본키
저장하지 않는 속성
인덱스 속성
NHN	NEXT	Eunjoo	Im
실습(3)

: 데이터

만들기
EJRealmData *newData;

EJDataManager *dataManager = [EJDataManager sharedInstance];

newData = [[EJRealmData alloc] initWithValue:@{

@"id" : @([dataManager getIdManager]),

@“type" : @(0),

@"character" : @(timeCharacterNumber ),

@"title" : @"title",

@"date" : [NSDate date],

@"start" : [NSDate date],

@"end" : [NSDate date] 

}];
<EJDataManager.m>
순차적인 id 만들기
새 data 만들기
- (int)getIdManager {

NSLog(@"idManager: %d", idManager)
return idManager++;

}
int idManager;

+ (EJDataManager *)sharedInstance {

static dispatch_once_t pred;

static EJDataManager *shared = nil;

dispatch_once(&pred, ^{

shared = [[EJDataManager alloc] init];

realm = [RLMRealm defaultRealm];

idManager = [[[EJRealmData allObjects] maxOfProperty:@"id"]
intValue]++;

});



return shared;

}
NHN	NEXT	Eunjoo	Im
실습(4)

: 데이터

읽기/쓰기
- (void)addData:(EJRealmData *)data {

[realm beginWriteTransaction];

[realm addOrUpdateObject:data];

[realm commitWriteTransaction];

}

- (void)updateData:(int)id {

[realm beginWriteTransaction];

EJRealmData *targetData = [self getData:id];

targetData.status = NO;

[realm commitWriteTransaction];

}

- (NSMutableArray *)getAllData {

NSPredicate *pred = [NSPredicate predicateWithFormat:@"status =
%hhd", YES];

RLMResults *allData = [EJRealmData objectsWithPredicate:pred];



NSMutableArray *resultArray = [[NSMutableArray alloc] init];

for (EJRealmData *data in allData) {

[resultArray addObject:[self setProperties:data start:data.start
end:data.end type:data.type]];

}



return resultArray;

}
add or update
update data
get all data whose status is YES
NHN	NEXT	Eunjoo	Im
참고

자료
https://realm.io/kr/
realm.io/kr
http://www.letswift.kr/2016/
Let’Swift 2016 

: Realm 세션
NHN	NEXT	Eunjoo	Im
Thank	
You

Weitere ähnliche Inhalte

Was ist angesagt?

스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기Yongha Yoo
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Yong Joon Moon
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)Sung-hoon Ma
 
Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기YoonBong Steve Kim
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Circulus
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)Yongha Yoo
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Circulus
 
Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405Hyosang Hong
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식TonyCms
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린Park JoongSoo
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
Effective cpp
Effective cppEffective cpp
Effective cppTonyCms
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리ETRIBE_STG
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍흥배 최
 

Was ist angesagt? (20)

스위프트 성능 이해하기
스위프트 성능 이해하기스위프트 성능 이해하기
스위프트 성능 이해하기
 
Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706Jupyter notebok tensorboard 실행하기_20160706
Jupyter notebok tensorboard 실행하기_20160706
 
Javascript
JavascriptJavascript
Javascript
 
0.javascript기본(~3일차내)
0.javascript기본(~3일차내)0.javascript기본(~3일차내)
0.javascript기본(~3일차내)
 
Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기Do swift: Swift 무작정 해보기
Do swift: Swift 무작정 해보기
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
 
iOS 메모리관리
iOS 메모리관리iOS 메모리관리
iOS 메모리관리
 
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
스위프트, 코틀린과 모던언어의 특징 (Swift, Kotlin and Modern Languages)
 
6 swift 고급함수
6 swift 고급함수6 swift 고급함수
6 swift 고급함수
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
 
Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405Java 이해하기 쉬운 코드 20210405
Java 이해하기 쉬운 코드 20210405
 
Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식Cpp에서 활용해보는 Lambda식
Cpp에서 활용해보는 Lambda식
 
일단 시작하는 코틀린
일단 시작하는 코틀린일단 시작하는 코틀린
일단 시작하는 코틀린
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Effective cpp
Effective cppEffective cpp
Effective cpp
 
Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리Javascript 완벽 가이드 정리
Javascript 완벽 가이드 정리
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
함수적 사고 2장
함수적 사고 2장함수적 사고 2장
함수적 사고 2장
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 

Andere mochten auch

Realm 코딩카페 - 이종찬
Realm   코딩카페 - 이종찬Realm   코딩카페 - 이종찬
Realm 코딩카페 - 이종찬Lee-Jong-Chan
 
Cocoaheads Lille - September 2013
Cocoaheads Lille - September 2013Cocoaheads Lille - September 2013
Cocoaheads Lille - September 2013Clément Sauvage
 
Déjeuner Technologiques - Introduction to iOS Development & App Marketing
Déjeuner Technologiques - Introduction to iOS Development & App MarketingDéjeuner Technologiques - Introduction to iOS Development & App Marketing
Déjeuner Technologiques - Introduction to iOS Development & App MarketingClément Sauvage
 
Realm.io par Clement Sauvage
Realm.io par Clement SauvageRealm.io par Clement Sauvage
Realm.io par Clement SauvageCocoaHeads France
 
[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios[1B6]Realm a database for android & ios
[1B6]Realm a database for android & iosNAVER D2
 
프알못의 Realm 사용기
프알못의 Realm 사용기프알못의 Realm 사용기
프알못의 Realm 사용기Mijeong Jeon
 
Realm of the Mobile Database: an introduction to Realm
Realm of the Mobile Database: an introduction to RealmRealm of the Mobile Database: an introduction to Realm
Realm of the Mobile Database: an introduction to RealmMartin Grider
 
02 realm 모델 &amp; 관계
02   realm 모델 &amp; 관계02   realm 모델 &amp; 관계
02 realm 모델 &amp; 관계Lee-Jong-Chan
 

Andere mochten auch (10)

Realm 코딩카페 - 이종찬
Realm   코딩카페 - 이종찬Realm   코딩카페 - 이종찬
Realm 코딩카페 - 이종찬
 
Cocoaheads Lille - September 2013
Cocoaheads Lille - September 2013Cocoaheads Lille - September 2013
Cocoaheads Lille - September 2013
 
Déjeuner Technologiques - Introduction to iOS Development & App Marketing
Déjeuner Technologiques - Introduction to iOS Development & App MarketingDéjeuner Technologiques - Introduction to iOS Development & App Marketing
Déjeuner Technologiques - Introduction to iOS Development & App Marketing
 
Realm.io par Clement Sauvage
Realm.io par Clement SauvageRealm.io par Clement Sauvage
Realm.io par Clement Sauvage
 
[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios
 
프알못의 Realm 사용기
프알못의 Realm 사용기프알못의 Realm 사용기
프알못의 Realm 사용기
 
Realm of the Mobile Database: an introduction to Realm
Realm of the Mobile Database: an introduction to RealmRealm of the Mobile Database: an introduction to Realm
Realm of the Mobile Database: an introduction to Realm
 
Realm Presentation
Realm PresentationRealm Presentation
Realm Presentation
 
02 realm 모델 &amp; 관계
02   realm 모델 &amp; 관계02   realm 모델 &amp; 관계
02 realm 모델 &amp; 관계
 
Realm시작하기
Realm시작하기Realm시작하기
Realm시작하기
 

Ähnlich wie Realm.io for iOS

Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.SeungWoo Lee
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
Realm, Mobile Database
Realm, Mobile DatabaseRealm, Mobile Database
Realm, Mobile DatabaseBongwon Lee
 
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open APIDo IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open APIHyunghun Cho
 
Hight performance java script chapter1, 2
Hight performance java script chapter1, 2Hight performance java script chapter1, 2
Hight performance java script chapter1, 2YOUNGMIN JUN
 
C# Game Server
C# Game ServerC# Game Server
C# Game Serverlactrious
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreihpark92
 
2. klaytn developer meetup #2 univ chain
2. klaytn developer meetup #2 univ chain2. klaytn developer meetup #2 univ chain
2. klaytn developer meetup #2 univ chain전 민규
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용Jin wook
 
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)용호 최
 
모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호용호 최
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링xxbdxx
 

Ähnlich wie Realm.io for iOS (20)

OpenStack Swift Debugging
OpenStack Swift DebuggingOpenStack Swift Debugging
OpenStack Swift Debugging
 
Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.Node.js 팀 스터디 발표자료.
Node.js 팀 스터디 발표자료.
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Realm @Android
Realm @Android Realm @Android
Realm @Android
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Realm, Mobile Database
Realm, Mobile DatabaseRealm, Mobile Database
Realm, Mobile Database
 
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open APIDo IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
 
Node.js 첫걸음
Node.js 첫걸음Node.js 첫걸음
Node.js 첫걸음
 
Hight performance java script chapter1, 2
Hight performance java script chapter1, 2Hight performance java script chapter1, 2
Hight performance java script chapter1, 2
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
Blockchain 2nd ethereum_core
Blockchain 2nd ethereum_coreBlockchain 2nd ethereum_core
Blockchain 2nd ethereum_core
 
2. klaytn developer meetup #2 univ chain
2. klaytn developer meetup #2 univ chain2. klaytn developer meetup #2 univ chain
2. klaytn developer meetup #2 univ chain
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
Html5 performance
Html5 performanceHtml5 performance
Html5 performance
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
 
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
[AWSKRUG] 모바일게임 하이브 런칭기 (2018)
 
모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호모바일 게임 하이브 런칭기 - 최용호
모바일 게임 하이브 런칭기 - 최용호
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 

Realm.io for iOS

  • 2. NHN NEXT Eunjoo Im Realm이란? ▪ 빠르게 성장하는 모바일 데이터베이스 (오픈소스) ▪ http://realm.io/kr ▪ SQLite 와 CoreData를 대체할수 있는
 크로스 플랫폼 데이터베이스 출처: Let’Swift 2016 Realm.io 세션
  • 3. NHN NEXT Eunjoo Im Realm 역사 출처: https://realm.io/kr/ 2014년 7월 15일 공개 2년이 지난 지금 Realm 사용 기업
  • 4. NHN NEXT Eunjoo Im C++ 기반의 크로스 플랫폼 출처: Let’Swift 2016 Realm.io 세션 SQLite 기반이 아니라 고유 C++ 코어를 가짐
  • 5. NHN NEXT Eunjoo Im Realm의 장점 출처: https://realm.io/kr/ ▪ 빠른 속도 ▪ 모바일을 위해서 만들어졌기 때문에,
 데이타를 저장하고 불러오는 것이 빠르고 효율적 ▪ 풍부한 기능 ▪ 마이그레이션, 그래프 쿼리, 암호화와 쓰레드 등의 다 양한 기능을 지원 ▪ 쉬운 사용 ▪ Object를 상속하여 쉬운 사용
  • 6. NHN NEXT Eunjoo Im 빠른 속도(1) : v.s. SQLite 출처: http://static.realm.io/downloads/java/android-benchmark.zip
  • 7. NHN NEXT Eunjoo Im 빠른 속도(2) : Zero-copy ▪ 기존 ORM은 Copy가 필요 ▪ Realm은 Copy가 불필요 ▪ memory mapped file 사용 ▪ In-memory 처럼 disk 사용 ▪ 읽을 데이터의 offset 계산 ▪ mapped file에서 읽어옴 ▪ property에 access해서 원본값을 반환 ▪ Results 자동 업데이트 출처: Let’Swift 2016 Realm.io 세션
  • 8. NHN NEXT Eunjoo Im 쉬운 사용(1) : 간결한 코드 ▪ RLMObject를 상속하여 모델 정의 ▪ 속성은 property로 사용하여 정의 ▪ 관계와 자료구조는 타겟 타입의 속성이나 RLMArray의 객체 리스트를 포함하여 간단하게 정의 출처: https://realm.io/kr/
  • 9. NHN NEXT Eunjoo Im 쉬운 사용(1) : 간결한 코드 출처: http://stackoverflow.com/questions/20649350/updating-object-with-core-data-inserts-a-new-record Entity * entityInstance = nil; entityInstance = [self fetchEntityForID:entityInstanceID inContext:context]; if (entityInstance == nil) { entityInstance = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:context]; } - (Entity *)fetchEntityForID:(NSNumber *) articleID inContext: (NSManagedObjectContext *) writeContext { NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Entity"]; NSPredicate * predicate = [NSPredicate predicateWithFormat:@"articleID == %@",articleID]; [fetchRequest setPredicate:predicate]; NSArray *fetchedArray = [writeContext executeFetchRequest:fetchRequest error:nil]; if ([fetchedArray count] > 0) return [fetchedArray objectAtIndex:0]; return nil; } Core data로 insert or update
  • 10. NHN NEXT Eunjoo Im 쉬운 사용(1) : 간결한 코드 Realm으로 insert or update 출처: https://realm.io/kr/
  • 11. NHN NEXT Eunjoo Im 쉬운 사용(2) : 다양한 쿼리 ▪ Chaining이 가능한 다양한 쿼리 지원 e.g. 필터링 ▪ 하나 또는 여러 개의 속성으로 정렬 기준이나 순서 설정 출처: https://realm.io/kr/
  • 12. NHN NEXT Eunjoo Im 풍부한 기능 (1) : 암호화 출처: https://realm.io/kr/ ▪ 생성 시에 64 바이트 암호화 키를 제공하면 AES-256+SHA2 방식으로
 디스크 내 데이터베이스 파일의 암호화를 지원
  • 13. NHN NEXT Eunjoo Im 풍부한 기능 (2) : notification 출처: https://realm.io/kr/ ▪ addNotificationBlock 메서드를 호출해서 RLMRealm, RLMResults, RLMArray, RLMLinkingObjects가 업데이 트될 때마다 통지를 받도록 등록 ▪ 단일 RLMObject의 변화를 감지하기 위해 Key-Value Observation을 사용 가능 ▪ Realm 객체는 쓰기 트랜잭션 커밋시마다 알림을 보내줌
  • 14. NHN NEXT Eunjoo Im 풍부한 기능 (3) : browser 출처: https://realm.io/kr/ ▪ 데이터베이스를 읽고 편집할 수 있는 브라우저 제공
  • 15. NHN NEXT Eunjoo Im 풍부한 기능(4) : Xcode
 플러그인 출처: https://realm.io/kr/ ▪ 새 Realm 모델을 쉽게 만들 수 있는 플러그인 제공
  • 16. NHN NEXT Eunjoo Im 풍부한 기능(4) : Realm
 add-ons 출처: https://realm.io/kr/ ▪ Realm 기반의 앱 개발에 도움이 되는 커뮤니티 애드온
  • 17. NHN NEXT Eunjoo Im 실습(1) : Realm 설정 ▪ CocoaPods 이용 ▪ Podfile에 pod ‘Realm’을 앱 타겟에 추가하고 pod ‘Realm/Headers’를 테스트 타겟에 추가 ▪ 커맨드라인을 통해 pod install을 실행 ▪ Static Framework ▪ Realm의 최신 버전을 다운로드해서 압축 풀기 ▪ ios/static/ 디렉토리에서 Realm.framework 을 선택하여 Xcode 프로젝트의 File Navigation에 넣기 (Copy items if needed 체크) ▪ Xcode의 File Navigator에서 프로젝트 클릭 >
 어플리케이션 대상 선택 > Build Phases > 
 Link Binary with Libraries 의 + 클릭 > libc++.tbd 를 추가
  • 18. NHN NEXT Eunjoo Im 실습(2) : 모델 설정 #import <Realm/Realm.h> @interface EJRealmData : RLMObject @property NSInteger id; @property BOOL status; @property int type; @property int character; @property NSString *title; @property NSDate *date; @property NSString *start; @property NSString *end; @property NSString *current; @property NSString *unit; @property NSString *startString; @property NSString *endString; @property NSString *now; @property float percent; @end RLM_ARRAY_TYPE(EJRealmData) #import "EJRealmData.h" @implementation EJRealmData + (NSString *)primaryKey { return @"id"; } + (NSArray *)requiredProperties { return @[@"id", @"type", @"title"]; } + (NSArray *)ignoredProperties { return @[@"startString", @"endString", @"now", @"percent"]; } + (NSArray *)indexedProperties { return @[@"status"]; } + (NSDictionary *)defaultPropertyValues { return @{@"status" : @YES}; } @end <EJRealmData.h> <EJRealmData.m> 기본키 저장하지 않는 속성 인덱스 속성
  • 19. NHN NEXT Eunjoo Im 실습(3) : 데이터 만들기 EJRealmData *newData; EJDataManager *dataManager = [EJDataManager sharedInstance]; newData = [[EJRealmData alloc] initWithValue:@{ @"id" : @([dataManager getIdManager]), @“type" : @(0), @"character" : @(timeCharacterNumber ), @"title" : @"title", @"date" : [NSDate date], @"start" : [NSDate date], @"end" : [NSDate date] }]; <EJDataManager.m> 순차적인 id 만들기 새 data 만들기 - (int)getIdManager { NSLog(@"idManager: %d", idManager) return idManager++; } int idManager; + (EJDataManager *)sharedInstance { static dispatch_once_t pred; static EJDataManager *shared = nil; dispatch_once(&pred, ^{ shared = [[EJDataManager alloc] init]; realm = [RLMRealm defaultRealm]; idManager = [[[EJRealmData allObjects] maxOfProperty:@"id"] intValue]++; }); return shared; }
  • 20. NHN NEXT Eunjoo Im 실습(4) : 데이터 읽기/쓰기 - (void)addData:(EJRealmData *)data { [realm beginWriteTransaction]; [realm addOrUpdateObject:data]; [realm commitWriteTransaction]; } - (void)updateData:(int)id { [realm beginWriteTransaction]; EJRealmData *targetData = [self getData:id]; targetData.status = NO; [realm commitWriteTransaction]; } - (NSMutableArray *)getAllData { NSPredicate *pred = [NSPredicate predicateWithFormat:@"status = %hhd", YES]; RLMResults *allData = [EJRealmData objectsWithPredicate:pred]; NSMutableArray *resultArray = [[NSMutableArray alloc] init]; for (EJRealmData *data in allData) { [resultArray addObject:[self setProperties:data start:data.start end:data.end type:data.type]]; } return resultArray; } add or update update data get all data whose status is YES