아요 개발 일기

iOS 데이터 저장 방식 알아보기 - 개념?편 본문

iOS

iOS 데이터 저장 방식 알아보기 - 개념?편

김망복 2024. 10. 25. 10:30
반응형

안녕하세요!!
이번 글에서는 데이터 저장 방식에 대해 알아보려고 합니다 :)
회사에서 저장 관련 기능을 구현하게 되면서 이 기회에 전체적으로 정리해두면 좋을 것 같아서 적게되었습니다
다양한 상황에서 잘 활용할 수 있기를 !!
 
 
자주 사용하고 중요한 저장방식에대해서 자세히 다루기 위해
다섯 개의 글로 나눠서 정리하겠습니다!
 
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

UserDefaults | Apple Developer Documentation

An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.

developer.apple.com

 


📂  복잡한 데이터 관리에 적합한 방식

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

File System Basics

File System Basics A file system handles the persistent storage of data files, apps, and the files associated with the operating system itself. Therefore, the file system is one of the fundamental resources used by all processes. APFS is the default file s

developer.apple.com

FileManager

FileManager | Apple Developer Documentation

A convenient interface to the contents of the file system, and the primary means of interacting with it.

developer.apple.com

 

Core Data

관계형 데이터와 복잡한 객체 모델을 관리할 수 있는 강력한 프레임워크입니다.
SQL을 다루지 않고도 관계형 데이터를 관리할 수 있으며, 데이터 저장, 검색, 마이그레이션 등 다양한 기능을 제공합니다.
 

사용 예시

  • 사용자 프로필 데이터 저장
  • 쇼핑 목록 관리
  • 앱 상태 저장 및 복원
  • iCloud와의 동기화 (CloudKit 사용)

장점

  • 복잡한 데이터 구조 관리: 관계형 데이터와 객체 모델을 효율적으로 관리할 수 있어 대규모 앱에 적합합니다.
  • 자동화된 마이그레이션 및 버전 관리: 데이터 모델 변경 시 자동 마이그레이션을 지원하여 구조 변경이 용이합니다.
  • 백그라운드 작업 지원 및 메모리 최적화: 백그라운드에서 데이터를 처리하고, 필요 시 데이터를 로드해 메모리 사용을 최소화합니다.

단점

  • 학습 곡선이 있음: 초기에 설정하고 이해하는 데 시간이 걸림
  • 단순한 데이터에는 과도함: 간단한 설정 저장에는 불필요하게 복잡할 수 있음
  • 추가적인 설정과 유지보수 필요: 연동 오류나 마이그레이션 실패 시 문제 발생 가능

 

관련 링크

CoreData

Core Data | Apple Developer Documentation

Persist or cache data on a single device, or sync data to multiple devices with CloudKit.

developer.apple.com


📂 보안이 중요한 데이터에 적합한 방식

Keychain

비밀번호, 인증 정보 등 보안이 중요한 데이터를 저장할 때 사용하는 저장소입니다.
데이터를 암호화하여 안전하게 저장할 수 있습니다.
 

사용 예시

  • 사용자 비밀번호 저장
  • 로그인 인증 토큰 저장
  • 금융 정보나 민감한 데이터 저장

장점

  • 강력한 보안: 민감한 정보를 암호화하여 안전하게 저장
  • 다양한 기기 간 공유 가능: 같은 Apple ID를 사용하는 기기들 간 데이터를 쉽게 공유 가능

단점

  • 비교적 제한된 데이터 유형: 비밀번호와 같은 소규모 민감 정보 저장에 적합

 

관련 링크

KeyChain

Keychain services | Apple Developer Documentation

Securely store small chunks of data on behalf of the user.

developer.apple.com

 


📂 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

SwiftData | Apple Developer Documentation

Write your model code declaratively to add managed persistence and efficient model fetching.

developer.apple.com


 
이외에도 SQLite는 SQL 쿼리를 사용해 대용량 데이터를 처리할 때,
CloudKit은 클라우드 기반 동기화가 필요한 경우,
Realm은 빠른 읽기/쓰기가 필요한 애플리케이션에 적합한 방식으로 활용할 수 있습니다.
 


 
저장 방식에대해서 쭉 훑어봤으니! 다음글에서 UserDefaults에대해 자세히 다뤄보겠습니다 :)
부족한 글 읽어주셔서 감사합니다🙇🏻‍♀️

반응형