ENAN

Developer, Artist, Traveler

공부/Android

Realm vs Room

ENAN 2021. 2. 28. 14:36

AAC중 Room을 공부하다가 전에 프로젝트를 하며 사용했던 Realm과 어떤 차이가 있는지 궁금해져서 둘은 어떤 차이가 있는지 간단히 알아보려 한다.

Realm과 Room은 Android 환경에서 내부 DB로 가장 많이 사용하는 라이브러리이다. 물론 realm, room 외에도 다양한 db 라이브러리들이 있으나 논외로 하고 가장 많이 사용하는 두 녀석을 알아보자.

Realm

Realm이란 모바일 환경을 주요 타깃으로 삼은 오픈소스 데이터베이스 관리시스템(DBMS)이다.

Realm은 NoSQL 데이터베이스를 지향하며, 모델 구조 자체가 객체 컨테이너로 구성되어 있다. 또한, Realm 데이터베이스는 rawSQL을 사용할 수 없으며 자체적으로 Realm API를 통해 실행된다. 이를 통해 좀 더 직관적인 사용이 가능해지고 데이터 처리 속도가 향상된 장점이 있지만, 기존 데이터베이스들과 달리 Realm의 자체 사용법에 대해 조금 더 공부를 해야 하는 단점도 존재한다.

pros

뛰어난 성능

sql 문법을 몰라도 사용 가능하며, 유용하고 안전성이 보장된 메서드가 많음

2014년부터 지금까지 안정성 있게 사용해왔고 문서가 잘 정리되어 있음

잘 운영되고 있는 오픈소스로서 커뮤니티가 잘 되어있고 업데이트가 빠름

cons

다중 쓰레드에서의 Realm 객체 관리에 신경써야 한다. (쓰레드별 객체 관리 필요함)

앱 용량이 약 2.5Mb 늘어난다.

raw쿼리를 지원하지 않기 때문에, realm에서 지원하지 않는 일부기능이나 복잡한 쿼리를 사용할 수 없음 (하지만 realm은 빠르게 업데이트 되고 있기 때문에, 빠른 시일내에 추가될 수도 있고 이미 추가되었을 수도 있음)

Room

Room에 대한 설명은 전에 남겨논 글의 링크로 대체한다.

[Android] AAC - Room
Room은 SQLite의 추상 레이어를 제공해 주어 DB에 편하게 접근할 수 있도록 해주는 ORM Library이다. JetPack, 그 안에서도 AAC 안에 속해있는 라이브러리 중 하나다. SQLite에 비해 Room을 사용했을 때 얻을 수 있는 이점이 많다.보일러 플레이트 코드를 줄일 수 있다는 점부터, 컴파일 타임에 유효성 검사를 할 수 있고, schema가 변경되었을 때도 자동으로 업데이트가 되며, LiveData 등과 함께 사용해 데이터를 Observation 할 수 있다는 점 등 장점이 많다.

pros

64kb의 적은 용량(realm은 거의 40배)

sqlite를 통해 인터페이스 제공 → sqlite의 모든 기능 이용 가능

livedata 등 다른 aac 라이브러리들과 쉽게 연결 가능

테스트 코드 작성 용이

cons

딱히 특별한 단점을 찾지 못했다. realm의 장점을 반대로 생각하면 room의 단점이지 않을까 싶지만, 어디까지나 realm이 room보다 이부분에선 조금 더 낫다! 하는 점들이고 충분히 만족하며 사용할 만 하다.

정리

둘다 좋은 라이브러리이고 장단점이 있어서 취사선택하면 좋을 것 같다.

우선 둘다 좋다 라고 말한 이유는, 우선 둘 다 사용하기 편리하다. 편리함은 주관적인 기준이라 직접 사용했을 때 경험으로 보면, realm도 정말 편하게 잘 사용했었고, 지금 공부하고 있는 room도 굉장히 편하다는 생각이 들었다.

그 외에도, 둘 다 성능이 괜찮으며 안정성이 보장되고 공식 문서가 잘 정리되어 있다. 즉, 기본을 만족한다.

성능은 realm이 더 나은 편. (그렇다고 room이 성능이 나쁘다는 말은 아니다) 기존에 sqlite를 사용했다고 치면 러닝커브는 더 높을 수 있지만 개인적으로는 realm이 조금 더 사용하기 편리했다.

room은 sqlite의 모든 기능을 그대로 사용할 수 있으며, realm은 raw 쿼리를 지원하지 않기 때문에 복잡한 쿼리를 사용해야 할 경우 힘들어질 수 있다. 또한 realm은 앱 용량이 2.5Mb나 커진다. 사용자에 따라 충분히 민감할 수 있는 크기라고 생각한다.

장단점에는 Realm과 Room 라이브러리 자체의 얘기 외에도 NoSQL 기반 DB / SQL을 사용하는 RDBMS, 오픈소스 / Google 공식 지원 등과 같은 면에서 오는 부가적인 장단점도 포함해서 생각하면 좋을 것 같다.

개인적인 생각으로 대량의 데이터를 사용해야 할 경우에는 realm을 사용해서 성능을 개선시키는 것이 좋을 것 같다. 하지만 성능 최적화가 필요할 만큼 데이터 수가 많지 않고, 또 db 접근이 잦지 않다면 앱 용량 증가로 사용자에게 부담을 줄 수 있는 realm보다는 room을 사용하는 것이 여러모로 낫다고 본다.

참고

https://github.com/AlexeyZatsepin/Android-ORM-benchmark

https://medium.com/swlh/android-dbms-performance-comparison-using-the-jetpack-benchmark-library-19581bf67443

https://stackoverflow.com/questions/47219257/realm-vs-room-in-android

https://yoon-dailylife.tistory.com/2

https://velog.io/@jojo_devstory/Android-Realm이란-SQLite보다-좋다던데

https://hellominchan.tistory.com/27

https://medium.com/@maryangmin/realm-데이터베이스-제대로-알고-안드로이드에서-사용하기-bac02b8faef7

p.s 간략히 적으려고 했지만 적다보니 글의 덩치가 커져서, 혹시나 틀린 내용이 있을까 겁이 납니다. 빠진 내용이나 정정할 내용이 있다면 제발 댓글로 남겨주세요!