아요 개발 일기
iOS 데이터 저장 방식 알아보기 - 개념?편 본문
안녕하세요!!
이번 글에서는 데이터 저장 방식에 대해 알아보려고 합니다 :)
회사에서 저장 관련 기능을 구현하게 되면서 이 기회에 전체적으로 정리해두면 좋을 것 같아서 적게되었습니다
다양한 상황에서 잘 활용할 수 있기를 !!
자주 사용하고 중요한 저장방식에대해서 자세히 다루기 위해
총 다섯 개의 글로 나눠서 정리하겠습니다!
1. 데이터 저장 방식 알아보기(여는 글)
2. UserDefaults
3. File System
4. Core Data
5. SwiftData
데이터 저장의 중요성
앱에서 데이터 저장과 관리는 사용자 경험과 성능을 향상시키는 데 매우 중요한 역할을 합니다.
적절한 데이터 저장으로 사용자 설정, 진행 상황, 계정 정보 등이 유지되며, 앱의 가용성과 신뢰성이 보장됩니다.
특히, 앱이 재실행되더라도 이전 상태를 복원할 수 있도록 데이터를 잘 관리하는 것이 필수입니다.
- 사용자 경험 향상: 사용자의 설정을 저장하여, 앱을 재실행해도 동일한 경험을 제공
- 성능 최적화: 로컬에 데이터를 저장하면 네트워크 요청이 필요 없는 경우 성능이 향상되며, 네트워크 연결이 불안정한 상황에서도 원활하게 앱이 작동
- 데이터 보존: 데이터를 저장하지 않으면 사용자가 매번 동일한 정보를 다시 입력해야 할 수 있음
데이터, 어떤 방식으로 저장해야 할까?
저장하려는 데이터의 크기, 보안 수준, 동기화 요구 사항에 따 적절한 저장 방식을 선택하는 것이 중요합니다.
아래에서 대표적인 저장 방식을 간단히 살펴보겠습니다.
📂 단순한 데이터에 적합한 방식
UserDefaults
앱 내에서 자주 사용되는 설정 값이나 작은 데이터를 저장하는 데 사용됩니다.
이 방식은 키-값 쌍으로 데이터를 간단히 저장하며, 앱이 재실행되어도 데이터가 유지됩니다.
사용 예시
- 다크 모드 설정
- 로그인 상태 저장
- 마지막으로 본 화면 위치 저장
장점
- 간단한 사용법: 데이터를 쉽게 저장할 수 있음
- 데이터 지속성: 앱을 재실행해도 데이터가 유지됨
- 경량 데이터 처리: 네트워크 연결이 필요 없는 소규모 데이터 저장에 적합
단점
- 보안에 취약: 비밀번호와 같은 민감한 데이터를 저장하기에 적합하지 않음
- 대규모 데이터 비효율: 대용량 데이터를 저장하기에는 부적합
간단한 예제 코드
// 값 저장
UserDefaults.standard.set(true, forKey: "isLoggedIn")
// 값 가져오기
let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn")
// 값 삭제
UserDefaults.standard.removeObject(forKey: "isLoggedIn")
관련 링크
UserDefaults
📂 복잡한 데이터 관리에 적합한 방식
File System
앱 내에서 파일을 직접 저장하는 방식으로, 데이터의 영구성이나 일시성에 따라 적절한 디렉토리에 파일을 저장합니다.
사용 예시
- 사용자 문서 저장 (Documents 디렉토리)
- 이미지 캐싱 (Caches 디렉토리)
- 임시 작업 파일 저장 (Temporary 디렉토리)
장점
- 다양한 파일 형식 지원: 텍스트, 이미지, 비디오 등 다양한 형식의 파일을 저장 가능
- 직접 파일 경로 관리: 원하는 위치에 데이터를 저장하고 파일 구조를 관리할 수 있음
단점
- 보안 관리 필요: 저장된 파일의 보안과 데이터 무결성은 개발자가 직접 관리해야 함
- 디스크 공간 사용 증가: 파일을 직접 저장하므로 디스크 공간 관리가 필요
간단한 예제 코드
// 파일 경로 생성
if let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = documentDirectory.appendingPathComponent("example.txt")
// 파일 저장
let text = "Hello, File System!"
try? text.write(to: fileURL, atomically: true, encoding: .utf8)
// 파일 읽기
let savedText = try? String(contentsOf: fileURL, encoding: .utf8)
print(savedText ?? "No content")
}
디렉토리 파일 ❓
Documents 디렉토리
- 영구적으로 보관할 데이터를 저장하는 디렉토리
- 사용자가 생성한 데이터나 중요한 파일을 여기에 저장하며, 이 데이터는 iCloud나 백업에도 포함
- 예시: 텍스트 파일, 사용자 설정 파일, 앱 내에서 중요한 사용자 데이터
Caches 디렉토리
- 임시 데이터를 저장하는 데 사용됩니다. 주로 재생성 가능한 데이터를 캐싱할 때 활용
- 시스템은 필요할 때 캐시 데이터를 삭제할 수 있으며, 데이터는 다시 생성할 수 있어야 함
- 예시: 이미지 캐싱, 네트워크 요청에 대한 응답 데이터
Temporary 디렉토리
- 매우 일시적인 데이터를 저장합니다. 작업 중에만 필요한 파일을 저장하며, 앱 종료 시 또는 시스템이 필요할 때 이 데이터는 삭제될 수 있음
- 예시: 임시 파일, 다운로드 중간에 생성되는 파일
관련 링크
File System Basics
FileManager
Core Data
관계형 데이터와 복잡한 객체 모델을 관리할 수 있는 강력한 프레임워크입니다.
SQL을 다루지 않고도 관계형 데이터를 관리할 수 있으며, 데이터 저장, 검색, 마이그레이션 등 다양한 기능을 제공합니다.
사용 예시
- 사용자 프로필 데이터 저장
- 쇼핑 목록 관리
- 앱 상태 저장 및 복원
- iCloud와의 동기화 (CloudKit 사용)
장점
- 복잡한 데이터 구조 관리: 관계형 데이터와 객체 모델을 효율적으로 관리할 수 있어 대규모 앱에 적합합니다.
- 자동화된 마이그레이션 및 버전 관리: 데이터 모델 변경 시 자동 마이그레이션을 지원하여 구조 변경이 용이합니다.
- 백그라운드 작업 지원 및 메모리 최적화: 백그라운드에서 데이터를 처리하고, 필요 시 데이터를 로드해 메모리 사용을 최소화합니다.
단점
- 학습 곡선이 있음: 초기에 설정하고 이해하는 데 시간이 걸림
- 단순한 데이터에는 과도함: 간단한 설정 저장에는 불필요하게 복잡할 수 있음
- 추가적인 설정과 유지보수 필요: 연동 오류나 마이그레이션 실패 시 문제 발생 가능
관련 링크
CoreData
📂 보안이 중요한 데이터에 적합한 방식
Keychain
비밀번호, 인증 정보 등 보안이 중요한 데이터를 저장할 때 사용하는 저장소입니다.
데이터를 암호화하여 안전하게 저장할 수 있습니다.
사용 예시
- 사용자 비밀번호 저장
- 로그인 인증 토큰 저장
- 금융 정보나 민감한 데이터 저장
장점
- 강력한 보안: 민감한 정보를 암호화하여 안전하게 저장
- 다양한 기기 간 공유 가능: 같은 Apple ID를 사용하는 기기들 간 데이터를 쉽게 공유 가능
단점
- 비교적 제한된 데이터 유형: 비밀번호와 같은 소규모 민감 정보 저장에 적합
관련 링크
KeyChain
📂 SwiftUI 기반의 앱에서 실시간 UI 동기화가 필요한 데이터 관리에 적합한 방식
SwiftData
Swift 언어와 SwiftUI에 최적화된 최신 데이터 프레임워크로, 데이터를 손쉽게 모델링하고 관리할 수 있도록 설계되었습니다. 기존의 Core Data보다 단순한 코드 구조와 직관적인 데이터 동기화 기능을 제공하며, iCloud와 통합하여 여러 기기 간 데이터 공유와 동기화가 가능합니다.
사용 예시
- 메모 앱 제작: 사용자의 메모를 로컬 저장소와 iCloud에 동기화
- To-Do 리스트 관리: 할 일 목록을 저장하고 다양한 기기에서 데이터에 접근
- 다양한 개인 설정: 사용자 설정을 관리하고 동기화
장점
- SwiftUI와의 원활한 통합: SwiftData는 SwiftUI와 자연스럽게 연결되며, 데이터 변경 사항이 UI에 실시간 반영
- 간편한 데이터 모델링: @Model과 같은 속성을 통해 데이터 모델을 쉽게 정의하고 활용할 수 있음
- iCloud 연동: iCloud를 통해 여러 기기에서 데이터를 동기화하여 사용 가능
- 최신 데이터 관리 패턴: Swift 생태계와 최신 Swift 표준에 맞춘 설계로 직관적인 데이터 처리가 가능
단점
- Swift 전용: Swift 언어 기반으로 설계되어, Objective-C나 다른 언어와의 호환성이 제한적
- 제한된 기능: Core Data가 제공하는 일부 고급 데이터베이스 기능을 지원하지 않아 복잡한 관계형 데이터 구조 관리에는 제약이 있을 수 있음
- 성숙도 부족: 새로운 프레임워크로, 대규모 데이터나 고성능 애플리케이션의 안정성 확보 측면에서 검증이 부족할 수 있음
관련 링크
SwiftData
이외에도 SQLite는 SQL 쿼리를 사용해 대용량 데이터를 처리할 때,
CloudKit은 클라우드 기반 동기화가 필요한 경우,
Realm은 빠른 읽기/쓰기가 필요한 애플리케이션에 적합한 방식으로 활용할 수 있습니다.
저장 방식에대해서 쭉 훑어봤으니! 다음글에서 UserDefaults에대해 자세히 다뤄보겠습니다 :)
부족한 글 읽어주셔서 감사합니다🙇🏻♀️
'iOS' 카테고리의 다른 글
APFS(Apple File System) (0) | 2024.11.13 |
---|---|
iOS 데이터 저장 방식 알아보기 - UserDefaults 편 (1) | 2024.11.04 |
[iOS] Fastlane - Slack으로 TestFlight 알림보내기 (0) | 2023.10.26 |
[iOS] Fastlane - AppStoreConnect 자동 배포 설정하기 (1) | 2023.10.26 |
[iOS] TextView에 Placeholder 구현하기 (0) | 2023.07.30 |