SlideShare a Scribd company logo
Realm (렘) 
Android & iOS 를 위한 데이터베이스
• Tim Anglade 
• 개발자, Realm의 프로덕트 담당 임원 
• 기존직장: Cloudant (CouchDB, acquired by 
IBM), MongoDB Inc, Apigee, NASDAQ Stock 
Exchange 
• 개발 언어: Ruby, JavaScript, Java, Objective-C, 
Swift, Prolog, Pascal, C#
이분들이 DEVIEW를 성공으로 이끈 주역들 입니다. 
이분들께 커다란 박수를 드리고 싶습니다. 송창현, 옥상훈, 
조한용, 박은정, 김동호 and everybody else! 
다음에 이분들을 보시면 감사표시를 해주세요 ^^
개요 
1. Realm(렘) 소개 
2. 배운 것들 
2.1 내부 디자인 
2.2 API 디자인 
3. Q&A
1. Realm(렘) 소개
Realm(렘) /rɛlm/ 
noun (plural: realms) 
1. An abstract sphere of influence, real or 
imagined. 
2. The domain of a certain abstraction. 
3. (formal or law) A territory or state, as ruled by 
a specific power, and particularly those 
territories ruled by a king. 
한국어 : 영역
• 새로운 데이터베이스, 모바일에서의 SQLite 역할을 대 
신할 
• 모바일을 위한 디자인 
• 스마트폰, 태블릿 & 웨어러블에서 직접 동작함 
• 객체/모델-지향, 하지만 ORM은 아닙니다 
• ACID 완벽지원 
• 간단한 쓰레드 모델 지원 
• C++ 코어 기반의 크로스 플랫폼
• 2014 7월에 발표, 2011년 부터 지적인 개발, 2012 
부터 실제 제품에 사용됨 
• 수만명의 개발자들이 앱개발에 사용중 
• 수백만의 사용자들이 실제 사용중 
• iOS 버전은 지금 당장 사용가능, Android 버전은 곧 
사용가능
• > 8주만에 2만 명의 개발자가 사용 
• Parse.com 보다 빠른 성장 
(8개월 동안 1만 명의 개발자가 사용) 
• 9주동안 계속 Github 의 '탑 트렌드 프로젝트' 
• “아름답고, 작은 메모리를 차지하며 다양한 플랫폼을 
지원하는 모바일 앱을 위한 데이터베이스가 드디어 탄 
생 했습니다. 또한 디자인도 매우 아름답습니다.” 
—David Helgason, CEO, Unity
많은 앱에서 이미 사용중 입니다 
• Breeze (TechCrunch Disrupt 파이널, 20억원 정도 
의 투자를 받음) 
• Cloth (뉴욕타임즈에 많이 소개된) 
• Zynga (매일 수백만명의 사용자가 사용하는 게임에서 
사용중) 
• + ~1,000 개의 앱이 이미 앱스토어에 올라오있거나 
개발 완료단계 
• 다음은 누구 일까요? 한국에 있는 우리의 제일 큰 팬은 
누구?
수많은 사람들이 제게 
Android 용 Realm 
이 언제 출시되는지 물었습니다. 
곧 발표할 예정입니다!
얼마나 곧 이냐구요?
얼마나? 
오늘!
DEVIEW 를 위해 준비된! 
Android용 Realm 
은 지금 사용가능 합니다 
realm.io/kr 
Android용 Realm에 대한 모임이 있습니다(한국어 진 
행).10월 6일 월요일 / 역삼동 알럿스퀘어 B2: 
onoffmix.com/event/33885
모델(Models) 
// Just extend your standard POJO from RealmObject: 
public class Dog extends RealmObject { 
private String name; 
private int age; 
@ignored private int dontPersistMe; 
// + Standard setters and getters here 
}
쓰기 
Realm realm = Realm.getInstance(this.getContext()); 
// Transactions give you easy thread-safety 
realm.beginTransaction(); 
Dog dog = realm.createObject(Dog.class); 
dog.setName("Rex"); 
dog.setAge(3); 
realm.commitTransaction();
쿼리 
// Queries uses Builder pattern to 
// build up the query conditions 
RealmResults<Dog> query = realm.where(Dog.class) 
.greaterThan("age", 8) 
.findAll(); 
// Queries are chainable 
RealmResults<Dog> allRex = query.where() 
.contains("name", "rex") 
.findAll();
관계 
public class Person extends RealmObject { 
private String name; 
private RealmList<Dog> dogs; 
} 
realm.beginWrite(); 
Dog mydog = realm.createObject(Dog.class); 
Person person = realm.createObject(Person.class); 
person.setName("Tim"); 
person.getDogs().add(mydog); 
realm.commitWrite();
쓰레드 안전하게 관리하기 
new Thread(new Runnable() { 
public void run() { 
Realm realm = Realm.getInstance(this.getContext()); 
RealmResults<Dog> dogs = realm.where(Dog.class) 
.contains("name", "rex") 
.findAll(); 
// You can write to any Realm from any thread too 
// with full ACID guarantees 
} 
}).start();
암호화 
Encryption 
byte[] key = new byte[32]; 
new SecureRandom().nextBytes(key); 
Realm realm = Realm.create(this, key); 
// Normal usage! 
RealmResults<Dog> query = realm.where(Dog.class) 
.greaterThan("age", 8) 
.findAll();
디자인 목표 
1. 모던하고 
2. 간단하며 
• 배우기 쉽고 (< 1 hour) 
• 관리하고/디버그하기 쉽고 
• 여러 쓰레드에서 사용하기 쉽게 
3. 속도가 빠르게
디자인 목표 
1. 모던하고 
2. 간단하며 
• 배우기 쉽고 (< 1 hour) 
• 관리하고/디버그하기 쉽고 
• 여러 쓰레드에서 사용하기 쉽게 
3. 속도가 빠르게
2. 배운 것들
2.1 데이터베이스 내부 디자인에 
대해서 배운것
역사적 배경 
• 대부분의 데이터 구조(배열, 해시, 등등)는 80년대에 만 
들어졌습니다 
• 그당시에는, CPU와 메모리의 속도가 거의 비슷했습니 
다 
• 이제는 상황이 달라졌습니다… 프로세서가 1000배 이 
상 빠릅니다 
• 매일 사용하는 프로그램의 성능에 많은 영향을 끼쳤습 
니다 
• 데이터베이스에 끼친 영향은 더욱 큽니다
가변 배열
일반적인 레이아웃 
struct mytype { 
bool value1; 
int64_t value2; 
int value3; 
}; 
mytype myarray[2];
패딩!
행 기반의 데이터베이스 
• 비슷한 레이아웃을 사용하는 경향이 있다 
• 때로는 가변 인코딩을 사용하고, 이는 오버헤드를 발생 
시킨다 
• 행을 불러오는데 최적화 되어있지만, 그게 병목은 아니 
다 
• 행을 불러오는 것은 프로세서 캐시를 더럽힌다 
(~64-128 바이트)
컬럼 지향! 
• 데이터를 컬럼 기준으로 자른다 - 한 컬럼당 하나의 배 
열 
• 패딩의 필요성이 없어진다 
• 한 컬럼에서 이터레이션 할 때, 캐시를 건드리지 않는다
추가적인 최적화 
• 하나의 boolean 값은 보통 1 byte 전체를 차지한다 
(8 bits) - 87%가 낭비됨! 
• 그 대신에 Realm은 로 접근할 수 있도록 바이트 
당 8개의 boolean을 저장하고 간단한 bit 쉬프트를 
한다 
• integer를 위해서는, 우리는 배열을 인서트 될 수 있는 
가장 큰 숫자의 길이에 맞추는데 길이는 0, 1, 2, 4, 8, 
16, 32 와 64 bit를 사용한다. 이로인해 64-bit 블럭 
에 최소한의 오버헤드로 들어가도록 한다.
Realm의 가변 배열의 효과 
1. 데이터가 훨씬 작다 (sqlite 사이즈의 50% 이하) 
2. 검색이 훨씬 빠르다 (캐시 최적화 덕분에) 
3. 컬럼 이터레이션이 훨씬 빠르다 (쿼리에 매우 유리한 
조건이다) 
4. 벡터 연산이 훨씬 빠르다
Realm 은 가변 배열의 그래프이다 
• 가변배열은 b-tree에 연결되어있다 
• 전체 구조는 매우 규칙적이다: 가변배열은 저~ 하부구 
조에 있다 
• 메모리에 매핑하기가 쉽다
Copy-on-Write 
• Realm은 쓰기할 때 읽기를 block 하지 않기 위해서 
COW(Copy-on-Write)를 사용한다 
• 디스크에 시리얼화(serialize) 하기 위해서, 새로운 탑 
노드에서부터 트리를 읽는다
Multiversion concurrency control (MVCC) 
• 이 방식을 사용해서 여러 버전의 그래프를 유지할 수 있 
습니다 
• 쉬운 MVCC (git과 같은) 
• 각 버전은 완전한 일관성을 가집니다 (ACID 개념)
비압축 b-tree 
• 압축이 필요 없습니다! 우리는 
제일 오래된 버전을 표시하고 유 
지하는 하는 방식으로 기존 버전 
의 공간을 재사용 합니다
복사없는 쿼리처리 
• Realm 쿼리는 복사되는 것이아니, 매핑 됩니다 
• SQL 쿼리에 비교하자면: 투영된 것을 보게되는 것이 
아니라, 실제 데이터를 보게 됩니다 
• 컨텍스트 (다른 컬럼의)는 언제나 사용 가능합니다 
• 쿼리 결과의 값을 쉽게 수정할 수 있습니다
지그재그 쿼리
일반적인 검색 알고리즘 
size_t find(size_t start, size_t end) { 
size_t i = start; 
while(i < end && first[i] > 5 && first[i] < 10 && second[i] == 200 && third[i] != 0) 
i++; 
if(i < end) 
return i; 
else 
return -1; 
}
지그재그 쿼리 
size_t find(size_t start, size_t end) { 
size_t i = start; 
while (i < end) { 
size_t orig_start = i; 
while(i < end && !(first[i] < 10)) i++; 
while(i < end && !(first[i] > 5)) i++; 
while(i < end && !(second[i] == 200) i++; 
while(i < end && !(third[i] != 0) i++; 
if( i < end && i == orig_start) 
return(i); 
} 
return -1; 
}
지그재그 쿼리 
• 우리는 각 조건문을 루프안에서도 테스트 하였습니다 
• 컬럼-지향의 장점을 사용합니다, 캐싱! 
• 최적의 패스를 찾을 수 있다는 것을 보장하지는 않지만, 
대부분의 경우에 최적에 가까운 경로를 사용합니다
링크 
Dog mydog = realm.createObject(Dog.class); 
Person person = realm.createObject(Person.class); 
person.getDogs().add(mydog); 
일반적으로: 
1. 그래프 (탐색하기 좋지만, 일반적인 검색 등에서 좋지 
않습니다) 
2. 문서 (비정규화된 복사 — 유지하기 힘듭니다)
• Realm 은 세번째 방법을 사용합니다: 포인터! 
• foreign 테이블 안의 오프셋을 가리킵니다 
• pointer 가 0 이라면 “링크 없음”을 뜻 합니다 
• 유일한 이슈는 객체가 지워졌을 때 레퍼런스를 유지하 
는 일입니다 
• 만약 객체가 foreign 테이블의 top 근처에서 삭제된 
다면, 모든 포인터를 업데이트 해야 합니다! :(
삭제 처리하기 
• 링크가 삭제되었을 때, 마지막 레코드를 삭제된 레코드 
자리로 이동합니다 
• 이 방식을 사용하면, 하나의 링크만 업데이트가 필요합 
니다
2.2 API 디자인에 대해서 배운것
Google의 Joshua Bloch가 쓴 “How to Build a 
Good API and Why it Matters” 를 꼭 읽어볼 것을 추 
천합니다. j.mp/good-api-design 
• “발표하기 전에 여러 앱들을 만들어보기” 
• “모든 사람을 만족시킬 수는 없다” 
• “API는 1가지 일을 해야 하고 그걸 잘해야 한다” 
• “API는 가능하면 작아야 한다” 
• “이름을 보고 어떤 역할을 하는지 알 수 있어야 한다” 
• “통일성이 있어야한다” 
이제부터는 우리가 배운 것들을 말씀드리겠습니다…
최고의 API는 사람들이 이미 알고있는 것들이다 
당신의 제품을 사용하기에 얼마나 걸리나요? 1주일? 3일? 
0 시간은 어떤가요? 
표준 문법과 언어나 프레임웍의 클래스를 따른다면, 모든 
사람이 매우 바로 쓸 수 있는 API를 만드는 것이 가능합니 
다. 
예시: Realm 은 Realm 하나만 이해하면 됩니다. 다른 클 
래스들은 직관적인 (RealmObject, RealmList)거나 
필수가 아닌 것들 입니다.
심플함 ≠ 심플한 API 
심플한 API와 심플한 프로덕트 사이에는 커다란 차이가 
있습니다!! 
[…]
realm.beginTransaction() 
dog.setName("Rex"); 
dog.setAge(3); 
// dog.save() 
realm.commitTransaction() 
↑ vs ↓ 
// realm.beginTransaction() 
dog.setName("Rex"); 
dog.setAge(3); 
dog.save() 
// realm.commitTransaction() 
상단에 있는 답변 (명시적인 트랜젝션)이 ACID를 보장하 
고, 충돌을 방지하기 위한 유일한 방법이고, 사용자가 멀티 
쓰레드를 사용하는데에 큰 도움을 준다
한번 벗어나면, 계속 그 길을 유지해야 
한번 사용하는 언어의 스탠다드에서 벗어났으면(좋은 이 
유로), 다음에도 그 것을 유지해서 API의 일관성을 유지하 
는 것이 좋다. 
Example: 
- Realm 
- RealmObject (can’t use just Object) 
- RealmList (can’t use List or ArrayList) 
- RealmResults (not Results or 
RealmResultsList) 
- RealmMigration (not Migration)
사용자들은 이해하지 못하더라도 그것을 쓸 수 있어야 한 
다 
복잡한 개념을 단순화해서 사용자가 내부를 이해하지 않고 
도 사용할 수 있도록 하는 것은 제품을 만드는 사람의 책임 
이다. 
예시: 마이그레이션 여러개의 데이터베이스의 상태를 데 
이터의 차이점을 관리하면서 맵핑하고, 스키마와 디스크 
저장방식을 관리 하는 것은 대부분의 사람들이 이해하기 
힘든 것들이다. 우리는 보통 사용자들이 그런것들을 신경 
쓸 필요 없도록 많은 노력을 기울였다. […]
[…] 우리는 암묵적인 속성 추가를 허용합니다 (예를 들어 
“name”이라는 속성을 모든 Dogs에 추가하기), 하지만 
속성 삭제는 명시적으로 해야 합니다. 
왜냐구요? 
왜냐면 속성을 명시적으로 삭제하지 않으면, 그 컬럼이 추 
가되고 삭제된 다음에 다시 추가되었는지, 아니면 처음으 
로 추가된 것인지 알 수 없기 때문입니다. 이는 데이터의 
일관성 이슈를 방지하기 위해서 필요합니다.
1.0 는 새로운 0.1 입니다. 
• 모바일 개발 사이클은 전통적인 서버사이드 개발/데스 
크탑용 소프트웨어 개발보다 짧습니다. 
• 요즘은 개발할 때 아무 많은 라이브러리를 사용합니다. 
• 모바일 앱을 컨테이너화 하는 것은 의존성을 줄이는데 
많은 도움을 줍니다. 
• 덜 검증된 라이브러리를 쓰더라도 많은 장점을 가져올 
수 있습니다. 
• SDK 개발자가 API를 자주 수정하고/변화하고/개선하 
는 것이 또한 많은 장점을 가져다 줍니다.
지속적으로 관리하기 
특별히 신경쓰지 않으면 복잡도가 점점 증가해서 API는 
계속 쓰기 나빠질 것입니다! 
새로운 기능을 추가하고, 버그를 고치, 하면서 계속 나빠질 
것입니다. 
API는 디자인이 아닙니다 — API는 구현하는 것이고, API 
는 제품이고, API는 QA 입니다. 
API는 생명체 입니다 :)
감사합니다! 
• http://realm.io/kr 
• tim@realm.io 또는 kr@realm.io 
• Vote for Realm BoF at 18:00 today :) 
• Android용 Realm에 대한 한국어 모임이 있습니다. 
10월 6일 월요일 / 역삼동 알럿스퀘어 B2: 
onoffmix.com/event/33885 
질문 있으세요?

More Related Content

What's hot

Introduce Docker
Introduce DockerIntroduce Docker
Introduce Docker
Yongbok Kim
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
기동 이
 
Node.js 기본과정
Node.js 기본과정Node.js 기본과정
Node.js 기본과정
Seokyou (Kevin) Hong
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구
ByungJoon Lee
 
Realm 코딩카페 - 이종찬
Realm   코딩카페 - 이종찬Realm   코딩카페 - 이종찬
Realm 코딩카페 - 이종찬
Lee-Jong-Chan
 
[1A7]Ansible의이해와활용
[1A7]Ansible의이해와활용[1A7]Ansible의이해와활용
[1A7]Ansible의이해와활용
NAVER D2
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
lactrious
 
Devfair kubernetes 101
Devfair kubernetes 101Devfair kubernetes 101
Devfair kubernetes 101
Daegwon Kim
 
What is chef - korean
What is chef - koreanWhat is chef - korean
What is chef - korean
SangUk Park
 
Leadweb Nodejs
Leadweb NodejsLeadweb Nodejs
Leadweb Nodejs
근호 최
 
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOSConfd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
충섭 김
 
Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기
raccoony
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
연웅 조
 
AWS + Docker in Vingle
AWS + Docker in VingleAWS + Docker in Vingle
AWS + Docker in Vingle
Derrick Hwechul Cho
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
Sumin Byeon
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
NAVER D2
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편
Sam Kim
 
Node.js 심화과정
Node.js 심화과정Node.js 심화과정
Node.js 심화과정
Seokyou (Kevin) Hong
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
SeungYong Oh
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기
Yungon Park
 

What's hot (20)

Introduce Docker
Introduce DockerIntroduce Docker
Introduce Docker
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
Node.js 기본과정
Node.js 기본과정Node.js 기본과정
Node.js 기본과정
 
Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구Node.js를 사용한 Big Data 사례연구
Node.js를 사용한 Big Data 사례연구
 
Realm 코딩카페 - 이종찬
Realm   코딩카페 - 이종찬Realm   코딩카페 - 이종찬
Realm 코딩카페 - 이종찬
 
[1A7]Ansible의이해와활용
[1A7]Ansible의이해와활용[1A7]Ansible의이해와활용
[1A7]Ansible의이해와활용
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
Devfair kubernetes 101
Devfair kubernetes 101Devfair kubernetes 101
Devfair kubernetes 101
 
What is chef - korean
What is chef - koreanWhat is chef - korean
What is chef - korean
 
Leadweb Nodejs
Leadweb NodejsLeadweb Nodejs
Leadweb Nodejs
 
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOSConfd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
Confd, systemd, fleet을 이용한 어플리케이션 배포 in CoreOS
 
Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기Docker (Compose) 활용 - 개발 환경 구성하기
Docker (Compose) 활용 - 개발 환경 구성하기
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
AWS + Docker in Vingle
AWS + Docker in VingleAWS + Docker in Vingle
AWS + Docker in Vingle
 
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편
 
Node.js 심화과정
Node.js 심화과정Node.js 심화과정
Node.js 심화과정
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
 
ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기ECS+Locust로 부하 테스트 진행하기
ECS+Locust로 부하 테스트 진행하기
 

Viewers also liked

Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스
Leonardo YongUk Kim
 
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
NAVER D2
 
[1B5]github first-principles
[1B5]github first-principles[1B5]github first-principles
[1B5]github first-principles
NAVER D2
 
[1A1]행복한프로그래머를위한철학
[1A1]행복한프로그래머를위한철학[1A1]행복한프로그래머를위한철학
[1A1]행복한프로그래머를위한철학
NAVER D2
 
[1B2]자신있는개발자에서훌륭한개발자로
[1B2]자신있는개발자에서훌륭한개발자로[1B2]자신있는개발자에서훌륭한개발자로
[1B2]자신있는개발자에서훌륭한개발자로
NAVER D2
 
02 realm 모델 &amp; 관계
02   realm 모델 &amp; 관계02   realm 모델 &amp; 관계
02 realm 모델 &amp; 관계
Lee-Jong-Chan
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
Eunjoo Im
 
Pycon APAC 2016 후기
Pycon APAC 2016 후기Pycon APAC 2016 후기
Pycon APAC 2016 후기
SeongHyun Ahn
 
프알못의 Realm 사용기
프알못의 Realm 사용기프알못의 Realm 사용기
프알못의 Realm 사용기
Mijeong Jeon
 
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
강 민우
 
Opensource realm soscon
Opensource realm sosconOpensource realm soscon
Opensource realm soscon
Minwoo Park
 
암호화 기초
암호화 기초암호화 기초
암호화 기초
학섭 오
 
04 realm 더 자세히
04   realm 더 자세히04   realm 더 자세히
04 realm 더 자세히
Lee-Jong-Chan
 

Viewers also liked (13)

Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스
 
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
[1B3]모바일 앱 크래시 네이버에서는 어떻게 수집하고 보여줄까요
 
[1B5]github first-principles
[1B5]github first-principles[1B5]github first-principles
[1B5]github first-principles
 
[1A1]행복한프로그래머를위한철학
[1A1]행복한프로그래머를위한철학[1A1]행복한프로그래머를위한철학
[1A1]행복한프로그래머를위한철학
 
[1B2]자신있는개발자에서훌륭한개발자로
[1B2]자신있는개발자에서훌륭한개발자로[1B2]자신있는개발자에서훌륭한개발자로
[1B2]자신있는개발자에서훌륭한개발자로
 
02 realm 모델 &amp; 관계
02   realm 모델 &amp; 관계02   realm 모델 &amp; 관계
02 realm 모델 &amp; 관계
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
 
Pycon APAC 2016 후기
Pycon APAC 2016 후기Pycon APAC 2016 후기
Pycon APAC 2016 후기
 
프알못의 Realm 사용기
프알못의 Realm 사용기프알못의 Realm 사용기
프알못의 Realm 사용기
 
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
[IGC2015] 엔씨소프트 김주용-내가 사랑한 MMO들
 
Opensource realm soscon
Opensource realm sosconOpensource realm soscon
Opensource realm soscon
 
암호화 기초
암호화 기초암호화 기초
암호화 기초
 
04 realm 더 자세히
04   realm 더 자세히04   realm 더 자세히
04 realm 더 자세히
 

Similar to [1B6]Realm a database for android & ios

홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON
Younghan Kim
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성
NAVER D2
 
레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드Sukjoon Kim
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
Inho Kwon
 
100% Serverless big data scale production Deep Learning System
100% Serverless big data scale production Deep Learning System100% Serverless big data scale production Deep Learning System
100% Serverless big data scale production Deep Learning System
hoondong kim
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
YoungSu Son
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
수보 김
 
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
Byeongsu Kang
 
반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게
Sungju Jin
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
Terry Cho
 
4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴
Terry Cho
 
왜 레진코믹스는 구글앱엔진을 선택했나
왜 레진코믹스는 구글앱엔진을 선택했나왜 레진코믹스는 구글앱엔진을 선택했나
왜 레진코믹스는 구글앱엔진을 선택했나
소리 강
 
Big query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetupBig query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetup
Jude Kim
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
Jeongsang Baek
 
파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝
SK(주) C&C - 강병호
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기
Sunghyouk Bae
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
중선 곽
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
NAVER Engineering
 
안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록
YoungSu Son
 

Similar to [1B6]Realm a database for android & ios (20)

홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON좌충우돌 ORM 개발기 2012 DAUM DEVON
좌충우돌 ORM 개발기 2012 DAUM DEVON
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성
 
레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드레일스를 이용한 애자일 웹 개발 가이드
레일스를 이용한 애자일 웹 개발 가이드
 
Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기Node.js에서 공공API를 활용해서 개발하기
Node.js에서 공공API를 활용해서 개발하기
 
100% Serverless big data scale production Deep Learning System
100% Serverless big data scale production Deep Learning System100% Serverless big data scale production Deep Learning System
100% Serverless big data scale production Deep Learning System
 
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기) FullStack 개발자 만들기 과정 소개  (Android + MEAN Stack + Redis 다루기)
FullStack 개발자 만들기 과정 소개 (Android + MEAN Stack + Redis 다루기)
 
서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)서버학개론(백엔드 서버 개발자를 위한)
서버학개론(백엔드 서버 개발자를 위한)
 
멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면멸종하는 공룡이 되지 않으려면
멸종하는 공룡이 되지 않으려면
 
반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게반복적인 코드 작업 자동화, Codebone으로 손쉽게
반복적인 코드 작업 자동화, Codebone으로 손쉽게
 
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
소프트웨어 개발 트랜드 및 MSA (마이크로 서비스 아키텍쳐)의 이해
 
4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴4. 대용량 아키텍쳐 설계 패턴
4. 대용량 아키텍쳐 설계 패턴
 
왜 레진코믹스는 구글앱엔진을 선택했나
왜 레진코믹스는 구글앱엔진을 선택했나왜 레진코믹스는 구글앱엔진을 선택했나
왜 레진코믹스는 구글앱엔진을 선택했나
 
Big query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetupBig query at GDG Korea Cloud meetup
Big query at GDG Korea Cloud meetup
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
 
파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝파이썬으로 익히는 딥러닝
파이썬으로 익히는 딥러닝
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기
 
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
프로그래밍 패러다임의 진화 및 Spring의 금융권 적용
 
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
[16]Obfuscation 101 : 난독화, 프로가드, R8, 트랜스포머 API
 
안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록안드로이드 오픈소스 어플리케이션 블록
안드로이드 오픈소스 어플리케이션 블록
 

More from NAVER D2

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
NAVER D2
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
NAVER D2
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
NAVER D2
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
NAVER D2
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
NAVER D2
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
NAVER D2
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
NAVER D2
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
NAVER D2
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
NAVER D2
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
NAVER D2
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
NAVER D2
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
NAVER D2
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
NAVER D2
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
NAVER D2
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
NAVER D2
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
NAVER D2
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
NAVER D2
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
NAVER D2
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
NAVER D2
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
NAVER D2
 

More from NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

[1B6]Realm a database for android & ios

  • 1. Realm (렘) Android & iOS 를 위한 데이터베이스
  • 2. • Tim Anglade • 개발자, Realm의 프로덕트 담당 임원 • 기존직장: Cloudant (CouchDB, acquired by IBM), MongoDB Inc, Apigee, NASDAQ Stock Exchange • 개발 언어: Ruby, JavaScript, Java, Objective-C, Swift, Prolog, Pascal, C#
  • 3.
  • 4.
  • 5. 이분들이 DEVIEW를 성공으로 이끈 주역들 입니다. 이분들께 커다란 박수를 드리고 싶습니다. 송창현, 옥상훈, 조한용, 박은정, 김동호 and everybody else! 다음에 이분들을 보시면 감사표시를 해주세요 ^^
  • 6. 개요 1. Realm(렘) 소개 2. 배운 것들 2.1 내부 디자인 2.2 API 디자인 3. Q&A
  • 8. Realm(렘) /rɛlm/ noun (plural: realms) 1. An abstract sphere of influence, real or imagined. 2. The domain of a certain abstraction. 3. (formal or law) A territory or state, as ruled by a specific power, and particularly those territories ruled by a king. 한국어 : 영역
  • 9. • 새로운 데이터베이스, 모바일에서의 SQLite 역할을 대 신할 • 모바일을 위한 디자인 • 스마트폰, 태블릿 & 웨어러블에서 직접 동작함 • 객체/모델-지향, 하지만 ORM은 아닙니다 • ACID 완벽지원 • 간단한 쓰레드 모델 지원 • C++ 코어 기반의 크로스 플랫폼
  • 10. • 2014 7월에 발표, 2011년 부터 지적인 개발, 2012 부터 실제 제품에 사용됨 • 수만명의 개발자들이 앱개발에 사용중 • 수백만의 사용자들이 실제 사용중 • iOS 버전은 지금 당장 사용가능, Android 버전은 곧 사용가능
  • 11. • > 8주만에 2만 명의 개발자가 사용 • Parse.com 보다 빠른 성장 (8개월 동안 1만 명의 개발자가 사용) • 9주동안 계속 Github 의 '탑 트렌드 프로젝트' • “아름답고, 작은 메모리를 차지하며 다양한 플랫폼을 지원하는 모바일 앱을 위한 데이터베이스가 드디어 탄 생 했습니다. 또한 디자인도 매우 아름답습니다.” —David Helgason, CEO, Unity
  • 12. 많은 앱에서 이미 사용중 입니다 • Breeze (TechCrunch Disrupt 파이널, 20억원 정도 의 투자를 받음) • Cloth (뉴욕타임즈에 많이 소개된) • Zynga (매일 수백만명의 사용자가 사용하는 게임에서 사용중) • + ~1,000 개의 앱이 이미 앱스토어에 올라오있거나 개발 완료단계 • 다음은 누구 일까요? 한국에 있는 우리의 제일 큰 팬은 누구?
  • 13.
  • 14. 수많은 사람들이 제게 Android 용 Realm 이 언제 출시되는지 물었습니다. 곧 발표할 예정입니다!
  • 17. DEVIEW 를 위해 준비된! Android용 Realm 은 지금 사용가능 합니다 realm.io/kr Android용 Realm에 대한 모임이 있습니다(한국어 진 행).10월 6일 월요일 / 역삼동 알럿스퀘어 B2: onoffmix.com/event/33885
  • 18. 모델(Models) // Just extend your standard POJO from RealmObject: public class Dog extends RealmObject { private String name; private int age; @ignored private int dontPersistMe; // + Standard setters and getters here }
  • 19. 쓰기 Realm realm = Realm.getInstance(this.getContext()); // Transactions give you easy thread-safety realm.beginTransaction(); Dog dog = realm.createObject(Dog.class); dog.setName("Rex"); dog.setAge(3); realm.commitTransaction();
  • 20. 쿼리 // Queries uses Builder pattern to // build up the query conditions RealmResults<Dog> query = realm.where(Dog.class) .greaterThan("age", 8) .findAll(); // Queries are chainable RealmResults<Dog> allRex = query.where() .contains("name", "rex") .findAll();
  • 21. 관계 public class Person extends RealmObject { private String name; private RealmList<Dog> dogs; } realm.beginWrite(); Dog mydog = realm.createObject(Dog.class); Person person = realm.createObject(Person.class); person.setName("Tim"); person.getDogs().add(mydog); realm.commitWrite();
  • 22. 쓰레드 안전하게 관리하기 new Thread(new Runnable() { public void run() { Realm realm = Realm.getInstance(this.getContext()); RealmResults<Dog> dogs = realm.where(Dog.class) .contains("name", "rex") .findAll(); // You can write to any Realm from any thread too // with full ACID guarantees } }).start();
  • 23. 암호화 Encryption byte[] key = new byte[32]; new SecureRandom().nextBytes(key); Realm realm = Realm.create(this, key); // Normal usage! RealmResults<Dog> query = realm.where(Dog.class) .greaterThan("age", 8) .findAll();
  • 24. 디자인 목표 1. 모던하고 2. 간단하며 • 배우기 쉽고 (< 1 hour) • 관리하고/디버그하기 쉽고 • 여러 쓰레드에서 사용하기 쉽게 3. 속도가 빠르게
  • 25. 디자인 목표 1. 모던하고 2. 간단하며 • 배우기 쉽고 (< 1 hour) • 관리하고/디버그하기 쉽고 • 여러 쓰레드에서 사용하기 쉽게 3. 속도가 빠르게
  • 26.
  • 27.
  • 28.
  • 30. 2.1 데이터베이스 내부 디자인에 대해서 배운것
  • 31.
  • 32. 역사적 배경 • 대부분의 데이터 구조(배열, 해시, 등등)는 80년대에 만 들어졌습니다 • 그당시에는, CPU와 메모리의 속도가 거의 비슷했습니 다 • 이제는 상황이 달라졌습니다… 프로세서가 1000배 이 상 빠릅니다 • 매일 사용하는 프로그램의 성능에 많은 영향을 끼쳤습 니다 • 데이터베이스에 끼친 영향은 더욱 큽니다
  • 34. 일반적인 레이아웃 struct mytype { bool value1; int64_t value2; int value3; }; mytype myarray[2];
  • 36. 행 기반의 데이터베이스 • 비슷한 레이아웃을 사용하는 경향이 있다 • 때로는 가변 인코딩을 사용하고, 이는 오버헤드를 발생 시킨다 • 행을 불러오는데 최적화 되어있지만, 그게 병목은 아니 다 • 행을 불러오는 것은 프로세서 캐시를 더럽힌다 (~64-128 바이트)
  • 37. 컬럼 지향! • 데이터를 컬럼 기준으로 자른다 - 한 컬럼당 하나의 배 열 • 패딩의 필요성이 없어진다 • 한 컬럼에서 이터레이션 할 때, 캐시를 건드리지 않는다
  • 38. 추가적인 최적화 • 하나의 boolean 값은 보통 1 byte 전체를 차지한다 (8 bits) - 87%가 낭비됨! • 그 대신에 Realm은 로 접근할 수 있도록 바이트 당 8개의 boolean을 저장하고 간단한 bit 쉬프트를 한다 • integer를 위해서는, 우리는 배열을 인서트 될 수 있는 가장 큰 숫자의 길이에 맞추는데 길이는 0, 1, 2, 4, 8, 16, 32 와 64 bit를 사용한다. 이로인해 64-bit 블럭 에 최소한의 오버헤드로 들어가도록 한다.
  • 39. Realm의 가변 배열의 효과 1. 데이터가 훨씬 작다 (sqlite 사이즈의 50% 이하) 2. 검색이 훨씬 빠르다 (캐시 최적화 덕분에) 3. 컬럼 이터레이션이 훨씬 빠르다 (쿼리에 매우 유리한 조건이다) 4. 벡터 연산이 훨씬 빠르다
  • 40. Realm 은 가변 배열의 그래프이다 • 가변배열은 b-tree에 연결되어있다 • 전체 구조는 매우 규칙적이다: 가변배열은 저~ 하부구 조에 있다 • 메모리에 매핑하기가 쉽다
  • 41. Copy-on-Write • Realm은 쓰기할 때 읽기를 block 하지 않기 위해서 COW(Copy-on-Write)를 사용한다 • 디스크에 시리얼화(serialize) 하기 위해서, 새로운 탑 노드에서부터 트리를 읽는다
  • 42. Multiversion concurrency control (MVCC) • 이 방식을 사용해서 여러 버전의 그래프를 유지할 수 있 습니다 • 쉬운 MVCC (git과 같은) • 각 버전은 완전한 일관성을 가집니다 (ACID 개념)
  • 43. 비압축 b-tree • 압축이 필요 없습니다! 우리는 제일 오래된 버전을 표시하고 유 지하는 하는 방식으로 기존 버전 의 공간을 재사용 합니다
  • 44. 복사없는 쿼리처리 • Realm 쿼리는 복사되는 것이아니, 매핑 됩니다 • SQL 쿼리에 비교하자면: 투영된 것을 보게되는 것이 아니라, 실제 데이터를 보게 됩니다 • 컨텍스트 (다른 컬럼의)는 언제나 사용 가능합니다 • 쿼리 결과의 값을 쉽게 수정할 수 있습니다
  • 46. 일반적인 검색 알고리즘 size_t find(size_t start, size_t end) { size_t i = start; while(i < end && first[i] > 5 && first[i] < 10 && second[i] == 200 && third[i] != 0) i++; if(i < end) return i; else return -1; }
  • 47. 지그재그 쿼리 size_t find(size_t start, size_t end) { size_t i = start; while (i < end) { size_t orig_start = i; while(i < end && !(first[i] < 10)) i++; while(i < end && !(first[i] > 5)) i++; while(i < end && !(second[i] == 200) i++; while(i < end && !(third[i] != 0) i++; if( i < end && i == orig_start) return(i); } return -1; }
  • 48.
  • 49. 지그재그 쿼리 • 우리는 각 조건문을 루프안에서도 테스트 하였습니다 • 컬럼-지향의 장점을 사용합니다, 캐싱! • 최적의 패스를 찾을 수 있다는 것을 보장하지는 않지만, 대부분의 경우에 최적에 가까운 경로를 사용합니다
  • 50. 링크 Dog mydog = realm.createObject(Dog.class); Person person = realm.createObject(Person.class); person.getDogs().add(mydog); 일반적으로: 1. 그래프 (탐색하기 좋지만, 일반적인 검색 등에서 좋지 않습니다) 2. 문서 (비정규화된 복사 — 유지하기 힘듭니다)
  • 51. • Realm 은 세번째 방법을 사용합니다: 포인터! • foreign 테이블 안의 오프셋을 가리킵니다 • pointer 가 0 이라면 “링크 없음”을 뜻 합니다 • 유일한 이슈는 객체가 지워졌을 때 레퍼런스를 유지하 는 일입니다 • 만약 객체가 foreign 테이블의 top 근처에서 삭제된 다면, 모든 포인터를 업데이트 해야 합니다! :(
  • 52. 삭제 처리하기 • 링크가 삭제되었을 때, 마지막 레코드를 삭제된 레코드 자리로 이동합니다 • 이 방식을 사용하면, 하나의 링크만 업데이트가 필요합 니다
  • 53. 2.2 API 디자인에 대해서 배운것
  • 54. Google의 Joshua Bloch가 쓴 “How to Build a Good API and Why it Matters” 를 꼭 읽어볼 것을 추 천합니다. j.mp/good-api-design • “발표하기 전에 여러 앱들을 만들어보기” • “모든 사람을 만족시킬 수는 없다” • “API는 1가지 일을 해야 하고 그걸 잘해야 한다” • “API는 가능하면 작아야 한다” • “이름을 보고 어떤 역할을 하는지 알 수 있어야 한다” • “통일성이 있어야한다” 이제부터는 우리가 배운 것들을 말씀드리겠습니다…
  • 55. 최고의 API는 사람들이 이미 알고있는 것들이다 당신의 제품을 사용하기에 얼마나 걸리나요? 1주일? 3일? 0 시간은 어떤가요? 표준 문법과 언어나 프레임웍의 클래스를 따른다면, 모든 사람이 매우 바로 쓸 수 있는 API를 만드는 것이 가능합니 다. 예시: Realm 은 Realm 하나만 이해하면 됩니다. 다른 클 래스들은 직관적인 (RealmObject, RealmList)거나 필수가 아닌 것들 입니다.
  • 56. 심플함 ≠ 심플한 API 심플한 API와 심플한 프로덕트 사이에는 커다란 차이가 있습니다!! […]
  • 57. realm.beginTransaction() dog.setName("Rex"); dog.setAge(3); // dog.save() realm.commitTransaction() ↑ vs ↓ // realm.beginTransaction() dog.setName("Rex"); dog.setAge(3); dog.save() // realm.commitTransaction() 상단에 있는 답변 (명시적인 트랜젝션)이 ACID를 보장하 고, 충돌을 방지하기 위한 유일한 방법이고, 사용자가 멀티 쓰레드를 사용하는데에 큰 도움을 준다
  • 58. 한번 벗어나면, 계속 그 길을 유지해야 한번 사용하는 언어의 스탠다드에서 벗어났으면(좋은 이 유로), 다음에도 그 것을 유지해서 API의 일관성을 유지하 는 것이 좋다. Example: - Realm - RealmObject (can’t use just Object) - RealmList (can’t use List or ArrayList) - RealmResults (not Results or RealmResultsList) - RealmMigration (not Migration)
  • 59. 사용자들은 이해하지 못하더라도 그것을 쓸 수 있어야 한 다 복잡한 개념을 단순화해서 사용자가 내부를 이해하지 않고 도 사용할 수 있도록 하는 것은 제품을 만드는 사람의 책임 이다. 예시: 마이그레이션 여러개의 데이터베이스의 상태를 데 이터의 차이점을 관리하면서 맵핑하고, 스키마와 디스크 저장방식을 관리 하는 것은 대부분의 사람들이 이해하기 힘든 것들이다. 우리는 보통 사용자들이 그런것들을 신경 쓸 필요 없도록 많은 노력을 기울였다. […]
  • 60. […] 우리는 암묵적인 속성 추가를 허용합니다 (예를 들어 “name”이라는 속성을 모든 Dogs에 추가하기), 하지만 속성 삭제는 명시적으로 해야 합니다. 왜냐구요? 왜냐면 속성을 명시적으로 삭제하지 않으면, 그 컬럼이 추 가되고 삭제된 다음에 다시 추가되었는지, 아니면 처음으 로 추가된 것인지 알 수 없기 때문입니다. 이는 데이터의 일관성 이슈를 방지하기 위해서 필요합니다.
  • 61. 1.0 는 새로운 0.1 입니다. • 모바일 개발 사이클은 전통적인 서버사이드 개발/데스 크탑용 소프트웨어 개발보다 짧습니다. • 요즘은 개발할 때 아무 많은 라이브러리를 사용합니다. • 모바일 앱을 컨테이너화 하는 것은 의존성을 줄이는데 많은 도움을 줍니다. • 덜 검증된 라이브러리를 쓰더라도 많은 장점을 가져올 수 있습니다. • SDK 개발자가 API를 자주 수정하고/변화하고/개선하 는 것이 또한 많은 장점을 가져다 줍니다.
  • 62. 지속적으로 관리하기 특별히 신경쓰지 않으면 복잡도가 점점 증가해서 API는 계속 쓰기 나빠질 것입니다! 새로운 기능을 추가하고, 버그를 고치, 하면서 계속 나빠질 것입니다. API는 디자인이 아닙니다 — API는 구현하는 것이고, API 는 제품이고, API는 QA 입니다. API는 생명체 입니다 :)
  • 63. 감사합니다! • http://realm.io/kr • tim@realm.io 또는 kr@realm.io • Vote for Realm BoF at 18:00 today :) • Android용 Realm에 대한 한국어 모임이 있습니다. 10월 6일 월요일 / 역삼동 알럿스퀘어 B2: onoffmix.com/event/33885 질문 있으세요?