14. 무 복제 메커니즘
public long id() {
int o = __offset(4);
return o != 0 ? bb.getLong(o + bb_pos) : 0;
}
public String name() {
int o = __offset(6);
return o != 0 ? __string(o + bb_pos) : null;
}
ByteBuffer bb = ByteBuffer.wrap(bytes);
MyObject obj = MyObject.getRootAsMyObject(bb);
long id = obj.id();
String name = obj.name();
• 사용할 때만 메모리 맵에서 Java 월드로 데이터를 가져올 수 있습니다.
15. 전통적인 수화 (Hydrate)
• 데이터베이스에서 자료를 문자열이나 기타 인코딩된 형태로 가져옵니다.
• 파싱 혹은 디코딩을 해서 가져온 데이터를 몽땅 Java 객체에 담아줍니다.
16. CPU와 메모리를 낭비하는 수화
• 데이터베이스에서 자료를 문자열이나 기타 인코딩된 형태로 가져옵니다.
• 쓰지도 않은 데이터도 다 가져오고 변환까지 거쳤어요.
• 파싱 혹은 디코딩을 해서 가져온 데이터를 몽땅 Java 객체의 필드 담아줍
니다.
• 쓰지도 않을 데이터를 전부 다시 변환하고 몽땅 필드에 담았어요.
17. Realm은 무 복제
현재 row에 대한 정보
컬럼과 로우의 인덱스에 null 혹은 문자열을 저장
실제 데이터가 담긴 테이블
로우와 컬럼을 이용해서 스트링을 가지고 옴
27. APT만으로는 부족합니다.
• APT는 객체를 생성할 수 만 있다.
• 기존의 객체를 상속받아 확장할 수만 있고 자체를 변경할 수 없음.
• Realm은 객체의 게터 / 세터를 Realm의 게터 / 세터로 바꾸어야 함.
• 커스텀 게터와 세트는 동작을 어떻게 확인하고 Realm 게터 / 세터를 적
절히 집어넣지?
28. 버전 1.X 시절의 Realm
• 게터와 세터는 표준 이름으로만 생성. (APT가 예상할 수 없음.)
• 게터와 세터는 표준 동작만 한다고 가정.
• 다른 메서드들도 필드에 대해 직접 접근하지 말아야 함.
29. 바이트 코드를 변경하는 것이 해결책
• 바이트 코드를 변경합니다.
• 필드에 읽으면 그 대신 Realm의 게터를 호출
• 필드에 무엇을 쓰면 대신 Realm의 세터를 호출
• 참 쉽죠?
30. 트랜스포머 API
• 안드로이드 그래들 플러그인의 공식적인 후 가공 방법
dependencies에 트랜스포머 등록
android.registerTransform으로
트랜스 폼을 빌드 과정에 포함.
58. 각기 다른 스레드 로컬을 가집니다.
A
B C
D
F G
E
H I
E’
H’
C’
A’
유저 3:버전 2 쓰기중유저 2: 버전 1 읽기 중
유저 1: 버전 1 읽기 중스레드 로컬 1: 버전 1
스레드 로컬 2: 버전 1
스레드 로컬 3: 버전 1 -> 2
59. 혼란스러울 수 있는 스레드 로컬
• 배타적이지 않게 효율적으로 읽기, 쓰기를 하기 위해
메타 데이터를 스레드 단위로 저장.
• 메모리 맵으로 연결된 데이터는 멀티 스레드로 공유되고 있음.
• 다만 스레드 로컬로 열린 Realm, RealmList, RealmResults,
RealmObjects 객체를 다른 스레드로 전달할 수 없음.
• 다른 스레드에서 쿼리를 하면 멀티 스레드 자료 공유 덕에 바로 읽음.