Swift 에서 사용하는 내부 DB 대표적인 3가지를 정리해본다
1. 사용해본적은 없지만 옛날에 백앤드를 잠깐 공부했을때 들어본 SQLite DBMS
SQLite는 C 언어로 구현되어 있습니다. 이는 다음과 같은 특징을 가지고 있습니다:
- 경량화: 크기가 작고 메모리 사용이 적습니다.
- 서버 없음: 클라이언트/서버 아키텍처가 없어서 앱 내에서 직접 사용됩니다.
- 자체 포함형: 데이터베이스 파일 하나에 모든 데이터가 저장됩니다.
- 트랜잭션 지원: ACID 특성(원자성, 일관성, 고립성, 지속성)을 지원합니다.
- 크로스 플랫폼: iOS 뿐만 아니라 Android, Windows 등 다양한 플랫폼에서도 사용 가능합니다.
ACID의 각 특성
- 원자성 (Atomicity):
- 트랜잭션의 원자성은 "전체 또는 아무것도"라는 의미입니다. 즉, 트랜잭션의 모든 작업은 하나의 논리적 단위로 간주됩니다. 트랜잭션 내의 모든 작업이 성공적으로 완료되면, 모든 변경 사항이 데이터베이스에 커밋되어야 합니다. 하나의 작업이라도 실패하면, 트랜잭션은 롤백되어 이전 상태로 복원됩니다.
- 일관성 (Consistency):
- 트랜잭션 전후에 데이터베이스의 일관성이 유지되어야 합니다. 이는 데이터베이스가 일관된 상태를 유지하는 것을 의미합니다. 트랜잭션은 데이터베이스의 기본 키, 외래 키 등의 제약 조건을 준수하여 데이터베이스의 무결성을 보장해야 합니다.
- 고립성 (Isolation):
- 고립성은 동시에 실행되는 여러 트랜잭션이 서로 영향을 미치지 않도록 보장하는 것입니다. 즉, 한 트랜잭션이 다른 트랜잭션의 결과에 영향을 주지 않고, 독립적으로 실행되어야 합니다. 이는 동시성 제어 메커니즘을 통해 구현됩니다.
- 지속성 (Durability):
- 지속성은 트랜잭션이 성공적으로 완료되면 그 결과가 영구적으로 저장되어야 한다는 것을 의미합니다. 즉, 시스템 장애 또는 전원 공급 장애가 발생해도 데이터는 손실되지 않아야 합니다. 완료된 트랜잭션의 결과는 데이터베이스에 영구적으로 기록되어야 합니다.
ACID 특성의 중요성
ACID 특성은 데이터베이스 시스템이 데이터의 일관성과 신뢰성을 유지할 수 있도록 보장합니다. 특히 다중 사용자 환경에서 여러 트랜잭션이 동시에 실행될 수 있는 상황에서 중요합니다. ACID 특성을 준수하는 데이터베이스 시스템은 데이터의 정확성과 신뢰성을 높이며, 데이터베이스 시스템의 안정성과 내구성을 보장합니다.
앱 개발에서는 데이터의 안전한 관리와 트랜잭션 처리를 위해 ACID 특성을 이해하고 적절히 활용하는 것이 중요합니다.
주의사항
- SQLite는 파일 기반 데이터베이스이므로 앱 내에서 데이터베이스 파일에 대한 적절한 경로 및 접근 권한을 설정해야 합니다.
- SQLite 데이터베이스 파일은 앱의 Documents 디렉토리 또는 Library 디렉토리에 저장하는 것이 일반적입니다.
- 다중 스레드에서 동시에 SQLite에 접근할 때는 적절한 동기화 메커니즘이 필요합니다. 보통 각 스레드에서 별도의 Connection 객체를 사용하는 것이 권장됩니다.
Core Data는 Apple의 프레임워크로, 데이터 관리와 지속성을 제공하는 기술입니다. 주로 iOS 및 macOS 애플리케이션에서 데이터를 구조화하고 저장하기 위해 사용됩니다. Core Data는 객체 관계 매핑(Object-Relational Mapping, ORM) 패턴을 기반으로 하며, 관계형 데이터베이스와 다른 형식의 데이터 저장소를 내부적으로 사용할 수 있습니다 (기본적으로 SQLite를 사용하지만, 다른 백엔드 옵션도 가능합니다).
Core Data 주요 구성 요소
- Managed Object Model:
- 데이터 모델을 정의하는 부분으로, 엔티티(Entity), 속성(Property), 관계(Relationship) 등을 포함합니다. 데이터 모델은 .xcdatamodeld 확장자를 가진 파일로 정의되며, Xcode의 데이터 모델 에디터에서 시각적으로 구성할 수 있습니다.
- Managed Object Context:
- 관리 객체 컨텍스트는 애플리케이션의 데이터 모델을 사용하여 데이터를 읽고 쓰는 인터페이스입니다. 데이터 변경 사항을 추적하고 관리하며, 데이터베이스나 다른 영구 저장소에 데이터를 저장하거나 로드할 때 사용됩니다.
- Persistent Store Coordinator:
- 영구 저장소 관리자로, 데이터베이스와 같은 영구 저장소를 관리합니다. 여러 개의 데이터베이스나 파일 기반 저장소를 동시에 사용할 수 있으며, 관리 객체 컨텍스트와 영구 저장소 사이의 데이터 통신을 관리합니다.
- Persistent Store:
- 실제 데이터가 저장되는 곳으로, 기본적으로 SQLite 데이터베이스를 사용할 수 있습니다. Core Data는 SQLite 외에도 이진 파일(Binary), XML 등 다양한 형식의 저장소를 지원합니다.
- Managed Object:
- 관리 객체는 데이터 모델에서 정의한 엔티티의 인스턴스로, 데이터베이스의 레코드와 일치합니다. 속성과 관계를 가지며, 데이터를 읽고 쓸 수 있는 도메인 객체로서 기능합니다.
Core Data 사용 예시
- 데이터 저장 및 관리:
- 사용자 정보, 설정, 채팅 기록 등과 같은 애플리케이션의 데이터를 구조화하여 저장합니다.
- 객체 지향적인 접근으로 데이터를 다루기 때문에, 코드에서는 객체를 사용하여 데이터를 조작할 수 있습니다.
- 복잡한 데이터 관리:
- 다양한 관계형 데이터를 쉽게 관리하고, 데이터베이스의 성능을 최적화할 수 있는 기능을 제공합니다.
- 관계를 활용한 데이터 쿼리 및 검색 기능을 제공하여 복잡한 데이터 구조를 다룰 때 유리합니다.
- UI와의 통합:
- 테이블 뷰, 컬렉션 뷰 등과 Core Data를 통합하여 데이터를 표시하고 사용자 입력을 관리할 수 있습니다.
- NSFetchedResultsController를 사용하여 데이터 변경 사항을 모니터링하고 UI 업데이트를 자동으로 처리할 수 있습니다.
Core Data의 장점
- 높은 성능: 내부적으로 데이터 캐싱 및 지연 로딩 기능을 제공하여 데이터베이스 성능을 최적화합니다.
- 객체 지향적 접근: 데이터를 객체로 다루기 때문에 코드의 가독성과 유지보수성을 높입니다.
- 간편한 데이터 관리: 데이터 모델의 변경을 쉽게 처리하고, 데이터베이스 스키마의 업데이트나 마이그레이션을 지원합니다.
Core Data의 주의 사항
- 메모리 관리: 대규모 데이터를 다룰 경우 메모리 사용에 주의해야 합니다.
- 스레드 안전성: 다중 스레드 환경에서는 적절한 스레드 안전성을 고려하여 관리 객체 컨텍스트를 사용해야 합니다.
Core Data는 iOS 앱에서 데이터 관리와 지속성을 구현하는 강력한 도구로, 다양한 데이터베이스 기능과 객체 지향적 접근을 통해 개발자가 데이터를 효율적으로 관리할 수 있도록 지원합니다.
Realm은 모바일 애플리케이션을 위한 클라우드 대응 데이터베이스를 제공하는 회사로, Realm 데이터베이스는 Swift, Objective-C, Java 등 다양한 플랫폼에서 사용할 수 있습니다. 특히 iOS 애플리케이션 개발에서 Realm은 데이터베이스 솔루션으로 많이 사용됩니다. 아래에서 Realm의 주요 특징과 iOS에서의 사용 사례에 대해 설명하겠습니다.
Realm의 주요 특징
- 객체 지향적 데이터베이스:
- Realm은 객체 지향 프로그래밍(OOP) 스타일에 맞춰 설계된 데이터베이스입니다. 데이터를 객체로 취급하고 객체 간의 관계를 직접 표현할 수 있습니다.
- 실시간 데이터 동기화:
- Realm은 실시간 데이터 동기화 기능을 제공하여 여러 사용자 간의 데이터 변경을 실시간으로 동기화할 수 있습니다. 이는 실시간 채팅, 협업 애플리케이션 등에 유용합니다.
- 성능 최적화:
- Realm은 뛰어난 성능을 자랑합니다. 내부적으로 Zero-copy architecture를 사용하여 데이터베이스 액세스 속도를 극대화하고, 메모리 사용을 최적화합니다.
- 크로스 플랫폼 지원:
- Realm은 iOS 외에도 Android, React Native, Xamarin 등 다양한 플랫폼에서 사용할 수 있습니다. 각 플랫폼에서 일관된 API를 제공하여 개발자가 동일한 데이터 모델을 사용할 수 있습니다.
- 간편한 사용법:
- Realm은 간단하고 직관적인 API를 제공하여 데이터베이스의 CRUD(Create, Read, Update, Delete) 작업을 쉽게 수행할 수 있습니다. 객체 지향 프로그래밍에 익숙한 개발자들이 빠르게 적응할 수 있습니다.
iOS에서의 Realm 사용 사례
- 로컬 데이터베이스 저장소:
- iOS 애플리케이션에서 Realm을 사용하여 로컬 데이터를 저장하고 관리할 수 있습니다. 사용자의 설정, 프로필 정보, 캐시 데이터 등을 Realm 데이터베이스에 저장할 수 있습니다.
- 실시간 애플리케이션 개발:
- 실시간 데이터 동기화 기능을 활용하여 실시간 채팅, 실시간 협업 애플리케이션 등을 개발할 수 있습니다. 여러 사용자 간의 데이터 변경을 실시간으로 반영할 수 있습니다.
- 복잡한 데이터 모델 처리:
- 복잡한 데이터 구조를 갖는 애플리케이션에서 Realm은 객체 간의 관계를 직접 표현하고 관리할 수 있습니다. 객체 지향적 접근 방식을 통해 데이터 모델을 쉽게 확장하고 유지할 수 있습니다.
- 성능 최적화:
- Realm의 뛰어난 성능은 대용량 데이터 처리나 데이터베이스 액세스 속도를 향상시킬 수 있습니다. 메모리 사용을 최적화하여 애플리케이션의 성능을 개선할 수 있습니다.
Realm은 iOS 개발자들 사이에서 인기 있는 선택지 중 하나로, 객체 지향적 데이터베이스와 실시간 데이터 동기화 기능을 제공하여 다양한 애플리케이션 개발에 활용됩니다.
Realm 인스턴스 관리:
- 각 스레드는 고유한 Realm 인스턴스를 가집니다. Realm 인스턴스는 스레드 간에 공유되지 않으며, 각 스레드에서 독립적으로 생성되고 사용됩니다.
GPT와 각종 블로그글을 정리해보면서 읽어보면서 필요한 상황에따라 적절한 DB를 선택을 해보는게 좋아보인다.
'Swift 공부' 카테고리의 다른 글
WWDC 2021 Explore structured concurrency in Swift 정리 (0) | 2024.09.17 |
---|---|
WWDC 공부 정리 1차 Meet async/await in Swift (2) | 2024.09.16 |
ReactorKit Pulse (2) | 2022.07.11 |
Tuist , Swinject , Clean Architecture , MVVM - Coordinator (7) | 2022.04.26 |
Hashable , Equatable , Identifiable (0) | 2022.04.18 |