SlideShare a Scribd company logo
1 of 23
Download to read offline
0
Realm
Realm - 더 자세히
Made by 이종찬
1
01
RealmConfiguration
2
01 RealmConfiguration
Realm을 설정하기 위해 사용하는 RealmConfiguration 객체에 대해서 알아보자.
1. Realm 데이터베이스 파일의 위치, 이름, 스키마버전 등을
설정하기 위해 사용하는 객체
2. RealmConfiguration 객체에 realm 에 대한 설정을 먼저 한 후
Realm 객체를 생성한다.
3. RealmConfiguration 객체는 빌더 패턴에 의해 생성된다.
4. 여러 개의 RealmConfiguration 객체를 쓰는 것도 가능하다.
1 RealmConfiguration 생성하기
RealmConfiguration config = new RealmConfiguration.Builder(context).build();
// 최소한의 설정만 할 때 사용. 파일의 이름은 default.realm 으로 들어간다.
RealmConfiguration config = new RealmConfiguration.Builder(context)
.name("myrealm.realm")
.encryptionKey(getKey())
.schemaVersion(42)
.modules(new MySchemaModule())
.migration(new MyMigration())
.build();
// Realm 파일은 Context.getFilesDir()에 위치하면 이름은 "myrealm.realm"입니다.
3
빌더 패턴 (builder pattern)
1. 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서
서로 다른 표현 결과를 만들 수 있게 하는 패턴이다.
2. 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서
이를 지원해야할 때 사용한다.
3. 조건에 따라서 각각 다른 빌더 클래스를 이용, 다른 연산을 수행하고
객체를 생성하는 부분과 세부 알고리즘을 분리하는 패턴이다.
Realm에 적용된 이유를 알아보자. ( * 주의 : 단순 제 생각 입니다. * )
RealmConfiguration을 통해 Realm을 설정할 때 사용자 마다 다양한 설정값을
줄 수 있다. (이름만 주거나, 스키마버전만 주거나 등등)
이 때 각각에 대한 설정을 좀더 쉽게 구성하게 해주는 패턴이
빌더 패턴이기에 Realm에서는 RealmConfiguration의 생성을
Builder 패턴으로 했을거라고 판단된다.
4
Realm을 설정하기 위해 사용하는 RealmConfiguration 객체에 대해서 알아보자.
2 Realm 인스턴스 얻기
RealmConfiguration config = new RealmConfiguration.Builder(context).build();
// 최소한의 설정만 할 때 사용. 파일의 이름은 default.realm 으로 들어간다.
RealmConfiguration config = new RealmConfiguration.Builder(context)
.name("myrealm.realm")
.encryptionKey(getKey())
.schemaVersion(42)
.modules(new MySchemaModule())
.migration(new MyMigration())
.build();
// Realm 파일은 Context.getFilesDir()에 위치하면 이름은 "myrealm.realm"입니다.
Realm realm = Realm.getInstance(config); // 설정을 사용합니다.
1. 생성했던 RealmConfiguration 객체를 사용하여 Realm인스턴스를 얻는다.
2. Realm인스턴스는 싱글톤 패턴으로 생성된다. 그렇기 때문에
매 스레드마다 정적 생성자는 동일한 인스턴스를 반환한다.
01 RealmConfiguration
5
싱글톤 패턴 (singleton pattern)
1. 객체가 단 하나면 충분하다고 판단 될 때 사용하는 패턴이다.
2. 자바의 static 키워드를 사용하며 메모리 관리면에서 효율적인 패턴이다.
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() { } //private로 선언이 되어있기 때문에 사용할 수 없다.
public static Singleton getInstance(){
return singleton;
} //getInstance를 사용해서만 객체를 얻어올 수 있다.
}
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println( s1 == s2 ); //true가 반환된다.
3. 생성자는 private로 선언하여 사용 할 수 없도록 한다.
4. 객체의 생성은 한 번만 하고 같은 객체만을 반환하기 때문에
객체는 항상 하나만 생성되어 있다.
6
싱글톤 패턴 (singleton pattern)
Realm에 적용된 이유를 알아보자. ( * 주의 : 단순 제 생각 입니다. * )
Thread 1
A Realm 객체1
Thread 2
A Realm 객체2
쓰기 중
쓰기 불가능
1. 2개의 쓰레드에 동일한 realm A에 대한 객체가 2개가 각각 존재한다고 하자.
2. Thread1 에서 쓰기를 작업 중이면 Transaction에 의해 Thread2는
쓰기 작업을 할 수가 없다.
3. Thread1 의 쓰기 작업이 끝났을 때 Thread2가 쓰기 작업을 할 수 있다.
 Thread1과 Thread2는 같은 Realm을 사용하기 때문에 한 번에 하나씩만
쓰기 작업이 가능하다.
 객체를 두 개 가지고 있는 것은 메모리 낭비이다.
메인 메모리 디스크
A Realm
7
싱글톤 패턴 (singleton pattern)
Realm에 적용된 이유를 알아보자. ( * 주의 : 단순 제 생각 입니다. * )
Thread 1
Thread 2
쓰기 중
쓰기 불가능
1. 메인 메모리 상에 singleton 패턴을 이용하여 Realm을 객체화 시켜둔다.
2. 각 쓰레드에서는 A Realm에 대한 객체를 생성하지 않고 singleton에서
생성한 객체를 참조만 하고 있는다.
3. 쓰기는 Transaction에 의해 하나 씩만 가능하므로 문제가 생기지 않는다.
 메모리 관리면에서 훨씬 효율적이다.
메인 메모리
디스크
A Realm
A Realm 객체
(singleton)
8
Realm을 설정하기 위해 사용하는 RealmConfiguration 객체에 대해서 알아보자.
3 여러 개의 RealmConfiguration 쓰기
RealmConfiguration myConfig = new RealmConfiguration.Builder(context)
.name("myrealm.realm")
.schemaVersion(2)
.setModules(new MyCustomSchema())
.build();
RealmConfiguration otherConfig = new RealmConfiguration.Builder(context)
.name("otherrealm.realm")
.schemaVersion(5)
.setModules(new MyOtherSchema())
.build();
Realm myRealm = Realm.getInstance(myConfig);
Realm otherRealm = Realm.getInstance(otherConfig);
1. 여러 개의 Realm파일을 만들고 싶을 때는 여러 개의 Configuration을
사용하면 된다.
2. 이런 방법에서는 각 설정값을 Realm마다 독립적으로 제어할 수 있다.
01 RealmConfiguration
9
Realm을 설정하기 위해 사용하는 RealmConfiguration 객체에 대해서 알아보자.
4 DefaultConfiguration으로 저장
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
// Context.getFilesDir()에 "default.realm"란 이름으로 Realm 파일이 위치한다
RealmConfiguration config = new RealmConfiguration.Builder(this).build();
Realm.setDefaultConfiguration(config);
}
}
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Realm realm = Realm.getDefaultInstance();
// ... 무엇을 합니다 ... realm.close();
}
}
1. 커스텀 Application 클래스에 기본 설정을 넣으면
다른 클래스에서 사용이 가능하다.
01 RealmConfiguration
10
01
Realm
11
02 Realm
Android에서 Realm을 사용하는 법을 알아보자.
1. 저번에 했잖아…?
01 주차에서 알아본 Realm은 Realm 자체에 대해서 간단히
알아본 것이고 이번에는 Android에서 Realm 파일은
어떻게 생성하고 사용하는 방법을 자세히 알아볼 것이다.
2. 제일 먼저 했어야 하는 것이 아닌가…?
realm 문서상 순서가 밑에 있어서 이제 합니다………
12
02 Realm의 종류
Realm을 종류 중 가장 기본이 되는 Realm이다.
기본 Realm
RealmConfiguration myConfig = new RealmConfiguration.Builder(context)
.name("myrealm.realm")
.build();
Realm myRealm = Realm.getInstance(myConfig);
1. 디스크에 저장되는 가장 기본적인 데이터베이스
2. 앞에서 봤던 것 처럼 RealmConfiguration을 설정한 후 객체를 얻어온다.
3. 사용법은 그 동안 어느정도 봐왔다.
13
02 Realm의 종류
메인 메모리에 저장하는 Realm에 대해서 알아보자.
In-memory
Realm
RealmConfiguration myConfig = new RealmConfiguration.Builder(context)
.name("myrealm.realm")
.inMemory()
.build();
Realm myRealm = Realm.getInstance(myConfig);
1. 디스크에 저장하지 않는 인 메모리 Realm이 생성할 수 있다.
2. 메모리가 부족하면 디스크를 이용하기는 한다.
3. 모든 파일들은 메모리 상에서 생성되고 Realm이 닫히면 삭제된다.
4. 디스크에 있는 Realm고 같은 이름의 인 메모리 Realm은 허용되지 않는다.
5. 인 메모리 Realm 인스턴스는 어떤 레퍼런스도 가리키지 않을 때
Realm의 모든 데이터를 해제한다.
경우에 따라서는 Serialize나 Parcelable보다 빠른 속도를 낼 수 있을 것으로
생각 됩니다. ( 이것 외에는 쓰는 이유를 잘 모르겠습니다. )
14
02 Realm의 종류
Dynamic Realm에 대해서 알아보자.
Dynamic
Realm
RealmConfiguration realmConfig = new RealmConfiguration.Builder(context).build();
DynamicRealm realm = DynamicRealm.getInstance(realmConfig);
// DynamicRealm에서 모든 객체들은 DynamicRealmObjects입니다
DynamicRealmObject person = realm.createObject("Person");
// 모든 필드는 문자열로 접근가능합니다.
String name = person.getString("name");
int age = person.getInt("age");
// 하부의 스키마는 존재하기에 존재하지 않는 필드에 예외를 발생시킵니다
person.getString("I don't exist");
// 질의는 여전히 평범하게 동작합니다
RealmResults<DynamicRealmObject> persons = realm.where("Person")
.equalTo("name", "John").findAll();
1. Realm을 사용할 때 모델 클래스는 RealmObject의 서브클래스로 정의하여
사용한다. 이때 형 안정성에 많은 이점이 있지만 어떤 경우에는 컴파일
시점에서 사용이 가능하지 않을 수 있다. 이때 Dynamic Realm을 사용한다.
2. Dynamic Realm은 DynamicRealmObject라는 클래스로 사용하며 모든 필드에
대한 접근을 클래스 대신 문자열을 통해 접근한다.
3. Dynamic Realm은 스키마, 마이그레이션, 스키마 버전은 무시한다.
4. Dynamic Realm은 안정성과 성능을 포기하고 유연성을 선택하였다.
때문에 정말로 유연성이 필요할 때만 사용하는 것을 권장한다.
15
03
Realm의 사용
16
03 Realm의 사용
사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자.
Realm 객체 닫기
1. Realm은 네이티브 메모리 해제와 파일 서술자를 다루기 위해 Closeable을
구현한다. 때문에 Realm을 사용한 후 Realm 객체를 닫는 것은 중요하다.
2. Realm 인스턴스는 레퍼런스 카운팅이 된다. 즉 하나의 쓰레드에서
getInstance()를 두 번 호출하면 사용이 끝난 후 close()도 두 번 호출해야 한다.
Closeable – java interface
1. 자바에서 파일을 다룰 때 사용하는 것으로 판단된다. 파일을 사용하는 객체는
claseable이 구현되어 있어 사용을 다 한 후에는 close()를 호출해야 되는 것 같다.
2. Try – catch – finally 문에서 실행되며 자바 7이전 버전에서는 수동으로
close()를 호출해 줘야 했다.
3. 자바 7 버전 부터는 try-with-resources 문이 추가되어 자동으로 수동으로
close()를 호출하는 작업을 해줄 필요가 없어졌다.
17
03 Realm의 사용
사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자.
Realm 객체 닫기
1 UI 쓰레드에서 닫기
1. UI 쓰레드에서는 onDestory()에서 realm.close()를 호출하는 것이 간단하다.
2 Try-with-resource 사용하기
// minSdkVersion >= 19 이상이며 Java >= 7 인 앱에서만 가능하다.
try (Realm realm = Realm.getDefaultInstance()) {
// 수동으로 Realm 인스턴스를 닫을 필요가 없습니다
}
18
03 Realm의 사용
사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자.
Realm 객체 닫기
Looper 쓰레드에서 닫기
public class MyThread extends Thread {
private Realm realm;
@Override
public void run() {
Looper.prepare();
try {
realm = Realm.getDefaultInstance();
// ... Realm 인스턴스를 사용합니다 ...
Lopper.loop();
} finally {
if (realm != null)
realm.close();
}
}
}
3
19
03 Realm의 사용
사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자.
Realm 객체 닫기
4 AsyncTask에서 닫기
protected Void doInBackground(Void... params) {
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
// ... Realm 인스턴스를 사용합니다 ...
} finally {
if (realm != null)
realm.close();
}
return null;
}
20
03 Realm의 사용
사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자.
Realm 객체 닫기
5 짧게 사용하고 닫기(Thread나 Runnable)
// Realm 인스턴스와 비 Looper 스레드를 실행합니다.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Realm realm = null;
try {
realm = Realm.getDefaultInstance();
// ... Realm 인스턴스를 사용합니다 ...
} finally {
if (realm != null)
realm.close();
}
}
});
thread.start();
21
03 Realm의 사용
Realm 파일을 찾는 법을 알아보자.
Realm 파일 찾기
1 Realm 브라우저 사용
1. 현재 Realm 브라우저는 맥OS 에서만 지원되며 다른 운영체제에서는
지원되지 않고 있다.
2. Realm 브라우저를 사용하여 Realm 데이터베이스를 읽고 수정이 가능하다.
3. 하지만 현재 브라우저는 디바이스에 직접적인 접근을 하지 못한다.
4. 때문에 디바이스에서 데이터베이스를 복사를 하여 접근해야한다.
22
감사합니다.
정보 출처 : realm.io
ppt템플릿 : 홍양홍삼님 블로그

More Related Content

What's hot

Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ patternjinho park
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형Hyosang Hong
 
Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Yeon Soo Kim
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storageJinKyoungHeo
 
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalSecrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalHyuncheol Jeon
 
자바스터디 3 2
자바스터디 3 2자바스터디 3 2
자바스터디 3 2jangpd007
 
자바야 놀자 PPT
자바야 놀자 PPT자바야 놀자 PPT
자바야 놀자 PPTJinKyoungHeo
 
Scope and Closure of JavaScript
Scope and Closure of JavaScript Scope and Closure of JavaScript
Scope and Closure of JavaScript Dahye Kim
 
파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기Yong Joon Moon
 
Objective-C Runtime Programming Guide
Objective-C Runtime Programming GuideObjective-C Runtime Programming Guide
Objective-C Runtime Programming GuideSung-Kwan Kim
 
Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)승욱 정
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링xxbdxx
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http RequestNAVER D2
 
파이썬 프로퍼티 디스크립터 이해하기
파이썬 프로퍼티 디스크립터 이해하기파이썬 프로퍼티 디스크립터 이해하기
파이썬 프로퍼티 디스크립터 이해하기Yong Joon Moon
 
Malzilla tutorial1
Malzilla tutorial1Malzilla tutorial1
Malzilla tutorial1re4lfl0w
 

What's hot (20)

Api design for c++ pattern
Api design for c++ patternApi design for c++ pattern
Api design for c++ pattern
 
Java 변수자료형
Java 변수자료형Java 변수자료형
Java 변수자료형
 
Java(2/4)
Java(2/4)Java(2/4)
Java(2/4)
 
Java(1/4)
Java(1/4)Java(1/4)
Java(1/4)
 
Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수
 
5-4. html5 offline and storage
5-4. html5 offline and storage5-4. html5 offline and storage
5-4. html5 offline and storage
 
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are FundamentalSecrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
Secrets of the JavaScript Ninja - Chapter 3. Functions are Fundamental
 
자바스터디 3 2
자바스터디 3 2자바스터디 3 2
자바스터디 3 2
 
자바야 놀자 PPT
자바야 놀자 PPT자바야 놀자 PPT
자바야 놀자 PPT
 
4-2. ajax
4-2. ajax4-2. ajax
4-2. ajax
 
Scope and Closure of JavaScript
Scope and Closure of JavaScript Scope and Closure of JavaScript
Scope and Closure of JavaScript
 
파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기
 
Objective-C Runtime Programming Guide
Objective-C Runtime Programming GuideObjective-C Runtime Programming Guide
Objective-C Runtime Programming Guide
 
Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)
 
동기화, 스케줄링
동기화, 스케줄링동기화, 스케줄링
동기화, 스케줄링
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request
 
파이썬 프로퍼티 디스크립터 이해하기
파이썬 프로퍼티 디스크립터 이해하기파이썬 프로퍼티 디스크립터 이해하기
파이썬 프로퍼티 디스크립터 이해하기
 
Javascript
JavascriptJavascript
Javascript
 
Malzilla tutorial1
Malzilla tutorial1Malzilla tutorial1
Malzilla tutorial1
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 

Viewers also liked

Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Leonardo YongUk Kim
 
진행중인 프로젝트
진행중인 프로젝트진행중인 프로젝트
진행중인 프로젝트Lee-Jong-Chan
 
토이 프로젝트 메모장
토이 프로젝트   메모장토이 프로젝트   메모장
토이 프로젝트 메모장Lee-Jong-Chan
 
우선 순위 메모장
우선 순위 메모장우선 순위 메모장
우선 순위 메모장Lee-Jong-Chan
 
Touch event 다루기
Touch event 다루기Touch event 다루기
Touch event 다루기Lee-Jong-Chan
 
코딩 생산성 높이기
코딩 생산성 높이기코딩 생산성 높이기
코딩 생산성 높이기Lee-Jong-Chan
 
간단한 회원가입 형태 만들기
간단한 회원가입 형태 만들기간단한 회원가입 형태 만들기
간단한 회원가입 형태 만들기Lee-Jong-Chan
 
T아카데미 aws 수강 리뷰
T아카데미 aws 수강 리뷰T아카데미 aws 수강 리뷰
T아카데미 aws 수강 리뷰Lee-Jong-Chan
 
[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 사용 사례선협 이
 
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?Leonardo YongUk Kim
 
Sem 4 (artículo en inglés)
Sem 4 (artículo en inglés)Sem 4 (artículo en inglés)
Sem 4 (artículo en inglés)ManuelColchero
 

Viewers also liked (13)

Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스Realm: 초고속 데이터베이스
Realm: 초고속 데이터베이스
 
진행중인 프로젝트
진행중인 프로젝트진행중인 프로젝트
진행중인 프로젝트
 
Context
ContextContext
Context
 
토이 프로젝트 메모장
토이 프로젝트   메모장토이 프로젝트   메모장
토이 프로젝트 메모장
 
우선 순위 메모장
우선 순위 메모장우선 순위 메모장
우선 순위 메모장
 
Touch event 다루기
Touch event 다루기Touch event 다루기
Touch event 다루기
 
코딩 생산성 높이기
코딩 생산성 높이기코딩 생산성 높이기
코딩 생산성 높이기
 
간단한 회원가입 형태 만들기
간단한 회원가입 형태 만들기간단한 회원가입 형태 만들기
간단한 회원가입 형태 만들기
 
T아카데미 aws 수강 리뷰
T아카데미 aws 수강 리뷰T아카데미 aws 수강 리뷰
T아카데미 aws 수강 리뷰
 
[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 사용 사례
 
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
오픈 소스로 취업하기: 나는 어떻게 오픈 소스를 하다 렘 개발자가 되었나?
 
Sem 4 (artículo en inglés)
Sem 4 (artículo en inglés)Sem 4 (artículo en inglés)
Sem 4 (artículo en inglés)
 

Similar to 04 realm 더 자세히

Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 patternjinho park
 
[Gpg2권]1.1 c++ 게임의 최적화
[Gpg2권]1.1 c++ 게임의 최적화[Gpg2권]1.1 c++ 게임의 최적화
[Gpg2권]1.1 c++ 게임의 최적화KyeongWon Koo
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장HolyTak
 
C# Game Server
C# Game ServerC# Game Server
C# Game Serverlactrious
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)MIN SEOK KOO
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOSEunjoo Im
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Young-Beom Rhee
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device accessJinKyoungHeo
 
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsJavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsHyuncheol Jeon
 
아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring frameworkHaeil Yi
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)beom kyun choi
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준HoJun Sung
 
Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리연우 김
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
Hello Swift 4/5 : Closure and Enum
Hello Swift 4/5 : Closure and EnumHello Swift 4/5 : Closure and Enum
Hello Swift 4/5 : Closure and EnumCody Yun
 

Similar to 04 realm 더 자세히 (20)

Api design for c++ ch3 pattern
Api design for c++ ch3 patternApi design for c++ ch3 pattern
Api design for c++ ch3 pattern
 
[Gpg2권]1.1 c++ 게임의 최적화
[Gpg2권]1.1 c++ 게임의 최적화[Gpg2권]1.1 c++ 게임의 최적화
[Gpg2권]1.1 c++ 게임의 최적화
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장Windows via c/c++ 스터디9장
Windows via c/c++ 스터디9장
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
이것이 자바다 Chap.11 기본 API 클래스(java)(KOR)
 
Realm.io for iOS
Realm.io for iOSRealm.io for iOS
Realm.io for iOS
 
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
Javascript 실행 가능한 코드(Executable Code)와 실행 콘텍스트(Execution Context), Lexical En...
 
5-3. html5 device access
5-3. html5 device access5-3. html5 device access
5-3. html5 device access
 
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsJavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and Constructors
 
아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework아키텍트가 바라보는 Spring framework
아키텍트가 바라보는 Spring framework
 
Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)Ji 개발 리뷰 (신림프로그래머)
Ji 개발 리뷰 (신림프로그래머)
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 
Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준Head first디자인패턴 1~13_희민_호준
Head first디자인패턴 1~13_희민_호준
 
Java script
Java scriptJava script
Java script
 
Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리Effective c++ 챕터 2 정리
Effective c++ 챕터 2 정리
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Node.js 기본
Node.js 기본Node.js 기본
Node.js 기본
 
Hello Swift 4/5 : Closure and Enum
Hello Swift 4/5 : Closure and EnumHello Swift 4/5 : Closure and Enum
Hello Swift 4/5 : Closure and Enum
 

04 realm 더 자세히

  • 1. 0 Realm Realm - 더 자세히 Made by 이종찬
  • 3. 2 01 RealmConfiguration Realm을 설정하기 위해 사용하는 RealmConfiguration 객체에 대해서 알아보자. 1. Realm 데이터베이스 파일의 위치, 이름, 스키마버전 등을 설정하기 위해 사용하는 객체 2. RealmConfiguration 객체에 realm 에 대한 설정을 먼저 한 후 Realm 객체를 생성한다. 3. RealmConfiguration 객체는 빌더 패턴에 의해 생성된다. 4. 여러 개의 RealmConfiguration 객체를 쓰는 것도 가능하다. 1 RealmConfiguration 생성하기 RealmConfiguration config = new RealmConfiguration.Builder(context).build(); // 최소한의 설정만 할 때 사용. 파일의 이름은 default.realm 으로 들어간다. RealmConfiguration config = new RealmConfiguration.Builder(context) .name("myrealm.realm") .encryptionKey(getKey()) .schemaVersion(42) .modules(new MySchemaModule()) .migration(new MyMigration()) .build(); // Realm 파일은 Context.getFilesDir()에 위치하면 이름은 "myrealm.realm"입니다.
  • 4. 3 빌더 패턴 (builder pattern) 1. 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴이다. 2. 합성할 객체들의 표현이 서로 다르더라도 생성 절차에서 이를 지원해야할 때 사용한다. 3. 조건에 따라서 각각 다른 빌더 클래스를 이용, 다른 연산을 수행하고 객체를 생성하는 부분과 세부 알고리즘을 분리하는 패턴이다. Realm에 적용된 이유를 알아보자. ( * 주의 : 단순 제 생각 입니다. * ) RealmConfiguration을 통해 Realm을 설정할 때 사용자 마다 다양한 설정값을 줄 수 있다. (이름만 주거나, 스키마버전만 주거나 등등) 이 때 각각에 대한 설정을 좀더 쉽게 구성하게 해주는 패턴이 빌더 패턴이기에 Realm에서는 RealmConfiguration의 생성을 Builder 패턴으로 했을거라고 판단된다.
  • 5. 4 Realm을 설정하기 위해 사용하는 RealmConfiguration 객체에 대해서 알아보자. 2 Realm 인스턴스 얻기 RealmConfiguration config = new RealmConfiguration.Builder(context).build(); // 최소한의 설정만 할 때 사용. 파일의 이름은 default.realm 으로 들어간다. RealmConfiguration config = new RealmConfiguration.Builder(context) .name("myrealm.realm") .encryptionKey(getKey()) .schemaVersion(42) .modules(new MySchemaModule()) .migration(new MyMigration()) .build(); // Realm 파일은 Context.getFilesDir()에 위치하면 이름은 "myrealm.realm"입니다. Realm realm = Realm.getInstance(config); // 설정을 사용합니다. 1. 생성했던 RealmConfiguration 객체를 사용하여 Realm인스턴스를 얻는다. 2. Realm인스턴스는 싱글톤 패턴으로 생성된다. 그렇기 때문에 매 스레드마다 정적 생성자는 동일한 인스턴스를 반환한다. 01 RealmConfiguration
  • 6. 5 싱글톤 패턴 (singleton pattern) 1. 객체가 단 하나면 충분하다고 판단 될 때 사용하는 패턴이다. 2. 자바의 static 키워드를 사용하며 메모리 관리면에서 효율적인 패턴이다. public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { } //private로 선언이 되어있기 때문에 사용할 수 없다. public static Singleton getInstance(){ return singleton; } //getInstance를 사용해서만 객체를 얻어올 수 있다. } Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); System.out.println( s1 == s2 ); //true가 반환된다. 3. 생성자는 private로 선언하여 사용 할 수 없도록 한다. 4. 객체의 생성은 한 번만 하고 같은 객체만을 반환하기 때문에 객체는 항상 하나만 생성되어 있다.
  • 7. 6 싱글톤 패턴 (singleton pattern) Realm에 적용된 이유를 알아보자. ( * 주의 : 단순 제 생각 입니다. * ) Thread 1 A Realm 객체1 Thread 2 A Realm 객체2 쓰기 중 쓰기 불가능 1. 2개의 쓰레드에 동일한 realm A에 대한 객체가 2개가 각각 존재한다고 하자. 2. Thread1 에서 쓰기를 작업 중이면 Transaction에 의해 Thread2는 쓰기 작업을 할 수가 없다. 3. Thread1 의 쓰기 작업이 끝났을 때 Thread2가 쓰기 작업을 할 수 있다.  Thread1과 Thread2는 같은 Realm을 사용하기 때문에 한 번에 하나씩만 쓰기 작업이 가능하다.  객체를 두 개 가지고 있는 것은 메모리 낭비이다. 메인 메모리 디스크 A Realm
  • 8. 7 싱글톤 패턴 (singleton pattern) Realm에 적용된 이유를 알아보자. ( * 주의 : 단순 제 생각 입니다. * ) Thread 1 Thread 2 쓰기 중 쓰기 불가능 1. 메인 메모리 상에 singleton 패턴을 이용하여 Realm을 객체화 시켜둔다. 2. 각 쓰레드에서는 A Realm에 대한 객체를 생성하지 않고 singleton에서 생성한 객체를 참조만 하고 있는다. 3. 쓰기는 Transaction에 의해 하나 씩만 가능하므로 문제가 생기지 않는다.  메모리 관리면에서 훨씬 효율적이다. 메인 메모리 디스크 A Realm A Realm 객체 (singleton)
  • 9. 8 Realm을 설정하기 위해 사용하는 RealmConfiguration 객체에 대해서 알아보자. 3 여러 개의 RealmConfiguration 쓰기 RealmConfiguration myConfig = new RealmConfiguration.Builder(context) .name("myrealm.realm") .schemaVersion(2) .setModules(new MyCustomSchema()) .build(); RealmConfiguration otherConfig = new RealmConfiguration.Builder(context) .name("otherrealm.realm") .schemaVersion(5) .setModules(new MyOtherSchema()) .build(); Realm myRealm = Realm.getInstance(myConfig); Realm otherRealm = Realm.getInstance(otherConfig); 1. 여러 개의 Realm파일을 만들고 싶을 때는 여러 개의 Configuration을 사용하면 된다. 2. 이런 방법에서는 각 설정값을 Realm마다 독립적으로 제어할 수 있다. 01 RealmConfiguration
  • 10. 9 Realm을 설정하기 위해 사용하는 RealmConfiguration 객체에 대해서 알아보자. 4 DefaultConfiguration으로 저장 public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); // Context.getFilesDir()에 "default.realm"란 이름으로 Realm 파일이 위치한다 RealmConfiguration config = new RealmConfiguration.Builder(this).build(); Realm.setDefaultConfiguration(config); } } public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Realm realm = Realm.getDefaultInstance(); // ... 무엇을 합니다 ... realm.close(); } } 1. 커스텀 Application 클래스에 기본 설정을 넣으면 다른 클래스에서 사용이 가능하다. 01 RealmConfiguration
  • 12. 11 02 Realm Android에서 Realm을 사용하는 법을 알아보자. 1. 저번에 했잖아…? 01 주차에서 알아본 Realm은 Realm 자체에 대해서 간단히 알아본 것이고 이번에는 Android에서 Realm 파일은 어떻게 생성하고 사용하는 방법을 자세히 알아볼 것이다. 2. 제일 먼저 했어야 하는 것이 아닌가…? realm 문서상 순서가 밑에 있어서 이제 합니다………
  • 13. 12 02 Realm의 종류 Realm을 종류 중 가장 기본이 되는 Realm이다. 기본 Realm RealmConfiguration myConfig = new RealmConfiguration.Builder(context) .name("myrealm.realm") .build(); Realm myRealm = Realm.getInstance(myConfig); 1. 디스크에 저장되는 가장 기본적인 데이터베이스 2. 앞에서 봤던 것 처럼 RealmConfiguration을 설정한 후 객체를 얻어온다. 3. 사용법은 그 동안 어느정도 봐왔다.
  • 14. 13 02 Realm의 종류 메인 메모리에 저장하는 Realm에 대해서 알아보자. In-memory Realm RealmConfiguration myConfig = new RealmConfiguration.Builder(context) .name("myrealm.realm") .inMemory() .build(); Realm myRealm = Realm.getInstance(myConfig); 1. 디스크에 저장하지 않는 인 메모리 Realm이 생성할 수 있다. 2. 메모리가 부족하면 디스크를 이용하기는 한다. 3. 모든 파일들은 메모리 상에서 생성되고 Realm이 닫히면 삭제된다. 4. 디스크에 있는 Realm고 같은 이름의 인 메모리 Realm은 허용되지 않는다. 5. 인 메모리 Realm 인스턴스는 어떤 레퍼런스도 가리키지 않을 때 Realm의 모든 데이터를 해제한다. 경우에 따라서는 Serialize나 Parcelable보다 빠른 속도를 낼 수 있을 것으로 생각 됩니다. ( 이것 외에는 쓰는 이유를 잘 모르겠습니다. )
  • 15. 14 02 Realm의 종류 Dynamic Realm에 대해서 알아보자. Dynamic Realm RealmConfiguration realmConfig = new RealmConfiguration.Builder(context).build(); DynamicRealm realm = DynamicRealm.getInstance(realmConfig); // DynamicRealm에서 모든 객체들은 DynamicRealmObjects입니다 DynamicRealmObject person = realm.createObject("Person"); // 모든 필드는 문자열로 접근가능합니다. String name = person.getString("name"); int age = person.getInt("age"); // 하부의 스키마는 존재하기에 존재하지 않는 필드에 예외를 발생시킵니다 person.getString("I don't exist"); // 질의는 여전히 평범하게 동작합니다 RealmResults<DynamicRealmObject> persons = realm.where("Person") .equalTo("name", "John").findAll(); 1. Realm을 사용할 때 모델 클래스는 RealmObject의 서브클래스로 정의하여 사용한다. 이때 형 안정성에 많은 이점이 있지만 어떤 경우에는 컴파일 시점에서 사용이 가능하지 않을 수 있다. 이때 Dynamic Realm을 사용한다. 2. Dynamic Realm은 DynamicRealmObject라는 클래스로 사용하며 모든 필드에 대한 접근을 클래스 대신 문자열을 통해 접근한다. 3. Dynamic Realm은 스키마, 마이그레이션, 스키마 버전은 무시한다. 4. Dynamic Realm은 안정성과 성능을 포기하고 유연성을 선택하였다. 때문에 정말로 유연성이 필요할 때만 사용하는 것을 권장한다.
  • 17. 16 03 Realm의 사용 사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자. Realm 객체 닫기 1. Realm은 네이티브 메모리 해제와 파일 서술자를 다루기 위해 Closeable을 구현한다. 때문에 Realm을 사용한 후 Realm 객체를 닫는 것은 중요하다. 2. Realm 인스턴스는 레퍼런스 카운팅이 된다. 즉 하나의 쓰레드에서 getInstance()를 두 번 호출하면 사용이 끝난 후 close()도 두 번 호출해야 한다. Closeable – java interface 1. 자바에서 파일을 다룰 때 사용하는 것으로 판단된다. 파일을 사용하는 객체는 claseable이 구현되어 있어 사용을 다 한 후에는 close()를 호출해야 되는 것 같다. 2. Try – catch – finally 문에서 실행되며 자바 7이전 버전에서는 수동으로 close()를 호출해 줘야 했다. 3. 자바 7 버전 부터는 try-with-resources 문이 추가되어 자동으로 수동으로 close()를 호출하는 작업을 해줄 필요가 없어졌다.
  • 18. 17 03 Realm의 사용 사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자. Realm 객체 닫기 1 UI 쓰레드에서 닫기 1. UI 쓰레드에서는 onDestory()에서 realm.close()를 호출하는 것이 간단하다. 2 Try-with-resource 사용하기 // minSdkVersion >= 19 이상이며 Java >= 7 인 앱에서만 가능하다. try (Realm realm = Realm.getDefaultInstance()) { // 수동으로 Realm 인스턴스를 닫을 필요가 없습니다 }
  • 19. 18 03 Realm의 사용 사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자. Realm 객체 닫기 Looper 쓰레드에서 닫기 public class MyThread extends Thread { private Realm realm; @Override public void run() { Looper.prepare(); try { realm = Realm.getDefaultInstance(); // ... Realm 인스턴스를 사용합니다 ... Lopper.loop(); } finally { if (realm != null) realm.close(); } } } 3
  • 20. 19 03 Realm의 사용 사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자. Realm 객체 닫기 4 AsyncTask에서 닫기 protected Void doInBackground(Void... params) { Realm realm = null; try { realm = Realm.getDefaultInstance(); // ... Realm 인스턴스를 사용합니다 ... } finally { if (realm != null) realm.close(); } return null; }
  • 21. 20 03 Realm의 사용 사용을 완료한 Realm 객체를 어떻게 처리하는 방법을 알아보자. Realm 객체 닫기 5 짧게 사용하고 닫기(Thread나 Runnable) // Realm 인스턴스와 비 Looper 스레드를 실행합니다. Thread thread = new Thread(new Runnable() { @Override public void run() { Realm realm = null; try { realm = Realm.getDefaultInstance(); // ... Realm 인스턴스를 사용합니다 ... } finally { if (realm != null) realm.close(); } } }); thread.start();
  • 22. 21 03 Realm의 사용 Realm 파일을 찾는 법을 알아보자. Realm 파일 찾기 1 Realm 브라우저 사용 1. 현재 Realm 브라우저는 맥OS 에서만 지원되며 다른 운영체제에서는 지원되지 않고 있다. 2. Realm 브라우저를 사용하여 Realm 데이터베이스를 읽고 수정이 가능하다. 3. 하지만 현재 브라우저는 디바이스에 직접적인 접근을 하지 못한다. 4. 때문에 디바이스에서 데이터베이스를 복사를 하여 접근해야한다.
  • 23. 22 감사합니다. 정보 출처 : realm.io ppt템플릿 : 홍양홍삼님 블로그