서론
UserDefaults, CoreData, Realm은 iOS의 대표적인 데이터 저장 방식입니다.
저는 지금까지 진행한 프로젝트에서는 UserDefaults만 사용했었습니다.
많은 데이터를 저장할 필요가 없기 때문이었는데요.
추후 데이터 저장이 필요한 상황에서 기술 선택을 용이하게 하기 위해 비교 글을 포스팅하기로 했습니다.
각각 어떤 특징이 있는지 알아야 필요한 기술이 뭔지 정확히 알 수 있겠죠??
장단점을 비교하는 것이 주 목적이기 때문에 깊은 내용까진 다루지 않습니다.
UserDefaults
먼저 UserDefaults입니다.
UserDefaults는 포스팅으로 다룬 적이 있는데요. ([Swift] UserDefaults 알아보기)
UserDefaults는 데이터 저장을 위한 가장 기초적인 방법으로, 세 가지 중에서 가장 간단하고 러닝 커브도 적습니다.
싱글턴 객체이고, Key-Value 쌍으로 데이터를 저장하는 방식입니다.
UserDefaults는 소규모 데이터 저장에 사용하는 것이 적절합니다.
그 이유는 메모리 효율성 때문입니다.
UserDefaults는 plist에 XML 형태로 데이터가 저장됩니다. 그래서 데이터 크기가 커지면 파일 크기가 커져요.
앱이 실행할 때 이 데이터를 모두 메모리에 올리기 때문에 메모리 성능에 악영향을 줍니다.
대신 데이터 Read/Write를 할 때 다시 메모리에 접근하지 않아도 되니 추가적인 오버헤드가 발생하지 않아요.
소규모 데이터를 다룬다면 속도도 빠르고 메모리에 부담도 주지 않게 기능을 구현할 수 있습니다.
UserDefaults의 큰 장점 중 하나는 Thread-Safe 하다는 것입니다.
CoreData와 Realm은 Thread-Safe 하지 않기 때문에 멀티 스레드 환경에서 주의를 해야하지만,
UserDefaults는 Thread-Safe 하기 때문에 별도의 처리가 필요 없습니다.
위에서 말했듯이 plist에 데이터가 저장되기 때문에 앱이 삭제되면 데이터도 모두 삭제됩니다.
또한, 암호화해서 저장하지 않기 때문에 보안도 좋지 않아요.
종합해보면 간단한 소규모 데이터를 쉽게 저장하고 싶을 때 UserDefaults를 사용하는 것이 좋습니다.
만약 데이터가 앱이 삭제되도 남아있어야 하거나, 보안이 중요하다면 UserDefaults는 절대 사용하면 안 되겠습니다.
CoreData
CoreData는 데이터베이스 기능을 지원하는 프레임워크입니다.
"데이터베이스"가 아니라 이를 지원하는 "프레임워크"라는 것이 특징입니다.
대규모 데이터를 저장하거나 체계적인 데이터베이스가 필요할 때 사용하는 것이 적절합니다.
공식 문서에서 CoreData의 5가지 기능을 볼 수 있는데요.
- 영속성(Persistence)
- 변경사항의 Undo, Redo
- 백그라운드 데이터 작업 기능
- 동기화 기능
- 버전 관리 및 마이그레이션(Migration)
이 중 데이터베이스는 1번 영속성 기능입니다.
이 영속성 기능은 SQLite를 기반으로 지원하는데 일반적인 데이터베이스와는 차이가 있습니다.
CoreData는 객체 그래프 관리자로, 객체를 직접적으로 연결해서 관리합니다.
데이터베이스는 행렬 관계를 이용해 데이터를 읽고 쓰는 반면 CoreData는 객체를 연속적으로 탐색해야 한다는 점이 차이점입니다.
링크드 리스트처럼 객체를 탐색하다보니 탐색 성능은 비교적 나쁘고,
Thread-Safe 하지 않아 Lock으로 동기화 처리를 해줘야 합니다.
대신, 원하는 데이터가 메모리에 올릴 수 있기 때문에 대규모 데이터를 저장해도 메모리 효율이 떨어지지 않습니다.
종합하면 대규모 데이터를 저장해야하는 상황에서 영속성 기능을 포함한 CoreData의 다른 기능도 필요하다면 CoreData를 선택하는 것이 적절해 보입니다.
Realm
Realm(렘)은 오픈소스 데이터베이스 관리시스템(DBMS)으로 모바일 환경을 주요 타깃으로 삼은 데이터베이스입니다.
iOS에서는 CoreData를 대체하는 모바일 디비로 NoSQL 데이터베이스를 지향합니다.
(TMI: Realm을 인수한 몽고DB가 NoSQL의 대표주자라고 하네요! NoSQL은 여러 유형의 데이터베이스를 사용하는 것으로 관계형 데이터베이스인 RDBMS와 다른 길을 지향한다고 합니다.)
Realm의 가장 큰 장점은 성능입니다.
Realm은 데이터 컨테이너 모델을 사용하며 데이터 객체를 Realm에 객체로 저장합니다.
즉, Realm은 객체 중심의 데이터베이스입니다.
따라서 ORM(Object Relational Mapping)을 통한 테이블과 객체 간의 변환이 필요 없어
빠른 속도로 쿼리를 수행할 수 있습니다.
초당 쿼리수를 비교한 그래프를 보면
Realm이 CoreData보다 두 배이상 빠른 것을 볼 수 있습니다.
두 번째 장점은 가이드와 패치노드가 잘 관리되고 있다는 점입니다.
어떤 점이 변했는지 자세히 적어두기 때문에 변화가 생겼을 때 빠르게 대처할 수 있습니다.
패치노트는 https://github.com/realm/realm-swift/releases 에서 확인할 수 있습니다.
(원래 한국어 가이드도 있다고 하던데... 사라졌는지 안 보이더라구요 ㅠㅠ)
이러한 장점때문에 여러 기업에서도 Realm을 사용하고 있습니다.
네이버웹툰의 기업 영상을 보니 네이버웹툰도 Realm을 사용하고 있다는 것을 알았습니다.
물론 단점도 있는데요.
Thread-Safe 하지 않다는 점입니다.
Realm은 객체로 관리된다고 위에서 얘기했죠??
이 객체에 변화가 생겼을 때 Realm의 모든 객체에 적용이 됩니다.
그래서 멀티 스레드 환경에서 스레드별 객체 관리가 필요합니다.
마무리
정리를 해보니 소규모 데이터에서는 UserDefaults,
CoreData 학습 시간이 있다면 CoreData, 빠르게 배우고 사용해야 한다면 Realm으로 좁혀지는 거 같은데요.
이번 글은 처음에 언급한대로 서로 비교만 한 것이기 때문에 참고만 해주시면 감사하겠고,
각자의 상황에 맞춰 선택하면 효율적인 개발이 가능하겠습니다.
감사합니다!
참고
https://jeong9216.tistory.com/520
https://developer.apple.com/documentation/coredata
https://www.mongodb.com/docs/realm/sdk/swift/realm-database/
https://github.com/realm/realm-swift
https://hellominchan.tistory.com/m/27
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.