안녕하세여 :)
이번에는 File System의 개념, 앱 데이터는 어디 파일 저장되는지, 간단한 예제코드에대해서 알아보도록 하겠습니다!
만약, 전체적인 개념이나 UserDefaults에대해서 궁금하시다면 아래 링크를 참조해주세요
iOS 데이터 저장 방식 알아보기 - 개념?편
iOS 데이터 저장 방식 알아보기 - UserDefaults편
이 글은 File System Programming Guide 문서를 기반으로 작성되었습니다.
File System
data files, apps 및 운영 체제와 관련된 파일들의 영구 저장을 관리합니다.
즉, 파일 시스템은 모든 프로세스에서 사용되는 기본 리소스 중 하나입니다.
(저번 UserDefaults에서 파일 시스템에 저장하면서 영구 저장이 되었죠?)
예시를 보면서 좀 더 친근하게 이해해볼까요?
사진 앱 📸
사용자가 사진을 찍으면 앱은 해당 이미지를 임시 디렉토리에 저장합니다.
'저장' 버튼: 사진은 Documents 디렉토리로 이동하여 영구 저장
'취소' 버튼: 임시 디렉토리에서 삭제
문서 관리 앱 📑
사용자가 다운로드한 PDF는 Library/Caches에 임시로 저장됩니다.
이후 사용자가 즐겨찾기로 추가하면 해당 파일은 Documents 디렉토리로 이동하여, 백업 및 동기화가 가능합니다.
하지만, 사용자가 임시 파일을 열지 않고 앱을 종료하면 시스템은 공간을 확보하기 위해 이 파일을 자동으로 삭제할 수도 있습니다.
스트리밍 앱 🎧
오디오 스트리밍 앱에서 사용자가 재생 중인 음악은 tmp 디렉토리에 저장되어, 앱이 종료되면 삭제됩니다.
그러나 사용자가 '오프라인 저장' 기능을 선택하면, 음악 파일은 Library/Caches에 저장되어 앱 재실행 후에도 사용할 수 있습니다.
자 어느정도 이해가 되었으니! 현재 애플은 기본 파일시스템으로 어떤걸 사용하고 있을까요?
APFS(Apple File System)라는 애플이 개발한 파일 시스템을 기본으로 사용하고 있습니다 (이전에는 HFS+)
간단하게 설명해보자면 APFS는 복제/복사(clone), 스냅샷, 공간 공유, 빠른 디렉토리 크기 계산, 안전한 저장(safe-save), 희소 파일(sparse files)과 같은 새로운 기능들을 제공합니다.
만약, APFS에대해 자세히 알고 싶다면 APFS(Apple File System) 글을 참고해주세요 :)
File System에대한 개념은 알겠는데, 앱에서 데이터를 저장할 때 File System의 어디에 저장될까요?
알아봅시다!!
앱 파일을 저장하는 샌드박스 디렉토리
보안상의 이유로 iOS 앱과 파일 시스템의 상호작용은 앱의 샌드박스 디렉토리 내부의 디렉토리로 제한됩니다
새 앱을 설치하는 동안 설치 프로그램은 샌드박스 디렉토리 내부에 앱을 위한 여러 컨테이너 디렉토리를 생성합니다
각각의 컨테이너 디렉토리는 특정 역할을 가집니다.
🤔 샌드박스(SandBox)가 뭔데요??
: iOS 및 macOS에서 보안과 프라이버시를 강화하기 위해 앱이 파일 시스템 및 시스템 자원에 접근할 수 있는 범위를 제한하는 격리 환경을 말 합니다.
앱은 샌드박스 내부에서만 작업이 가능하며, 이로 인해 앱이 다른 앱의 데이터에 접근하거나 시스템에 영향을 줄 수 있는 행위를 방지할 수 있습니다.
위 이미지처럼 샌드박스 내부 디렉토리는 크게 세개로 분류할 수 있습니다!
그렇담.. 이제 샌드박스 내에있는 각각의 컨테이너 디렉토리가 어떤 역할을 하는지 알아볼까요?!
bundle Container
앱 번들을 저장하는 디렉토리(앱 이름.app)를 내부에 가지고 있으며, 앱 자체와 모든 리소스 파일을 포함합니다.
이 디렉토리는 사용할 수 없으며, 변조를 방지하기위해 설치 시 서명이 됩니다.
iTunes나 iCloud에 의해 백업❌
🤔 만약 사용하게 된다면요????
이전에 등록된 서명이 변경되고 앱이 실행되지 않습니다!
앱 번들에 저장된 모든 리소스에 대한 읽기 전용 액세스 권한만 얻을 수 있습니다!
Data Container
앱과 사용자 데이터를 모두 저장합니다.
여러 하위 디렉토리로 나뉘며, 앱은 이 디렉토리들을 사용하여 데이터를 분류하고 조직할 수 있습니다.
이미지에 하위디렉토리 세개가 나오는데, 각 디렉토리가 어떤 데이터를 저장하는지 표로 정리해보았습니다!
디렉토리 | 주요 용도 | 특징 | iTunes 및 iCloud 백업 |
Documents/ | 사용자 생성 콘텐츠 저장 | - 사용자가 생성/관리하는 데이터를 저장 - 파일 공유 가능 - 앱 내부 데이터 저장 금지 |
⭕️ |
Documents/Inbox | 외부 앱과 파일 연동 | - 외부 앱에서 전달된 파일을 열거나 액세스 - 읽기/삭제 권한만 제공 - 수정 시 이동 필요 |
⭕️ |
Library/ | 사용자 데이터 외 파일 저장 | - Application Support: 앱 설정, 데이터베이스 저장 - Caches: 캐시 데이터 저장 |
⭕️ (Caches 제외) |
tmp/ | 임시 파일 저장 | - 앱 실행 중 필요한 임시 데이터 - 시스템이 필요 시 자동 삭제 - 앱 종료 후 보장 X |
❌ |
💡 문서 상호 작용 컨트롤러 ?
: iOS 앱에서 파일을 열고 공유할 수 있는 UIDocumentInteractionController 클래스를 이용한 기능으로, 사용자가 다른 앱에서 파일을 열거나 파일을 공유할 수 있도록 돕는 역할을 합니다.
여러 앱에서 파일을 일관되게 사용할 수 있게 도와주는 동시에 보안을 유지하며, iOS 시스템 내에서 파일 관리 정책을 준수하도록 지원합니다.
오.. 그럼 사용자 데이터 특성에따라 Data Container에 있는 하위 디렉토리로 나뉘어 저장되겠네요??
그렇다면 개발자는 데이터에따라 디렉토리 위치를 잘 정해서 저장해야할 것 같아요!!
문서에 이와 관련된 지침이 있는데 같이 알아보겠습니다😊
iOS 파일 저장 위치에 따른 데이터 관리 지침
iOS 기기에서 백업 및 동기화 시간이 오래 걸리지 않도록 파일을 저장할 위치를 신중하게 선택해야합니다.
특히, 앱이 대용량 파일을 저장하는 경우 iTunes 또는 iCloud 백업 프로세스를 느리게 할 수 있으며, 많은 저장 공간을 차지하여 사용자가 앱을 삭제하거나 iCloud 백업을 비활성화하도록 유도할 수 있습니다.
📁 Documents/
사용자 생성 콘텐츠를 저장하는 공간입니다.
사용자가 직접 접근하거나 생성, 가져오기, 삭제 및 편집할 가능성이 있는 파일을 저장합니다.
- 예:
그림 앱의 그래픽 파일, 텍스트 편집기의 텍스트 파일, 다운로드된 오디오 및 비디오 파일. - 특징:
- 파일 공유를 통해 사용자가 직접 접근 가능.
- 중요한 데이터 저장에 적합.
- iTunes 및 iCloud에 자동으로 백업.
📁 Application Support/
앱 지원 파일을 저장하는 공간입니다.
앱 실행에 필요한 설정 파일이나 데이터베이스를 저장하며, 사용자에게 노출되지 않음.
- 예:
데이터 파일, 설정 파일, 템플릿 파일, 수정된 리소스. - 특징:
- 앱의 내부 데이터 저장에 적합.
- iTunes 및 iCloud에 자동으로 백업.
⚠️ Documents/ & Library/Application Support/ 참고 사항 ⚠️
- 대용량 또는 재생성 가능한 파일은 백업 제외 (NSURLIsExcludedFromBackupKey 사용)
- 백업이 필요한 중요한 데이터는 이곳에 저장하는 것을 권장
📂 Library/Caches/
캐시 데이터를 저장하는 공간입니다.
성능 향상을 위해 사용하며, 재생성 가능한 데이터를 저장합니다.
- 예:
데이터베이스 캐시 파일, 일시적으로 다운로드된 콘텐츠. - 특징:
- 시스템이 디스크 공간 확보를 위해 삭제 가능.
- iTunes 및 iCloud에 백업되지 않음.
📂 tmp/
임시 데이터를 저장하는 공간입니다.
앱 실행 중에만 필요한 데이터를 저장하며, 작업이 끝난 후 삭제해야 합니다.
- 예:
다운로드 중 임시 파일, 일시적 데이터 처리 파일. - 특징:
- 앱 종료 후 시스템이 파일을 삭제할 수 있음.
- iTunes 및 iCloud에 백업되지 않음.
요약 정리
디렉토리 | 주요 용도 | 특징 | iTunes 및 iCloud 백업 |
Documents/ | 사용자 데이터 저장소 | 사용자와 공유 가능, 내부 데이터 금지 | ⭕️ |
Library/Application Support/ | 앱 지원 파일 저장소 | 앱 실행에 필요한 비공개 데이터 저장 | ⭕️ |
tmp/ | 임시 데이터 저장소 | 앱 종료 후 자동 삭제 가능, 임시 데이터 | ❌ |
Library/Caches/ | 캐시 데이터 저장소 | 성능 향상을 위한 데이터 저장 | ❌ |
예제 코드
파일과 디렉토리를 이용한 간단한 예제 코드를 만들어보았습니다!!
파일 생성 및 쓰기
let fileManager = FileManager.default
if let documentDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
let fileURL = documentDirectory.appendingPathComponent("example.txt")
let content = "Hello, File System!"
do {
try content.write(to: fileURL, atomically: true, encoding: .utf8)
print("파일 생성 및 쓰기 성공")
} catch {
print("파일 작성 실패: \(error)")
}
}
파일 읽기
do {
let savedText = try String(contentsOf: fileURL, encoding: .utf8)
print("파일 내용:", savedText)
} catch {
print("파일 읽기 실패: \(error)")
}
파일 존재 여부 확인
if fileManager.fileExists(atPath: fileURL.path) {
print("파일이 존재합니다.")
} else {
print("파일이 존재하지 않습니다.")
}
파일 복사
let destinationURL = documentDirectory.appendingPathComponent("copy_example.txt")
do {
try fileManager.copyItem(at: fileURL, to: destinationURL)
print("파일 복사 성공")
} catch {
print("파일 복사 실패: \(error)")
}
파일 삭제
do {
try fileManager.removeItem(at: fileURL)
print("파일 삭제 성공")
} catch {
print("파일 삭제 실패: \(error)")
}
디렉토리 생성
let newDirectoryURL = documentDirectory.appendingPathComponent("NewFolder")
do {
try fileManager.createDirectory(at: newDirectoryURL, withIntermediateDirectories: true, attributes: nil)
print("디렉토리 생성 성공")
} catch {
print("디렉토리 생성 실패: \(error)")
}
이번에는 File System에 대해서 알아보았습니다!
현업에서 File System을 자주 쓰고 있었는데, 이번에 꼼꼼히 문서 읽어보면서 몰랐던 부분에 대해서도 많이 알게되었던 것 같아요!
만약, 틀리거나 부족한 부분이 있으면 편하게 댓글달아주시면 감사하겠습니다!
요새 날이 많이 추워졌어요!!!
감기 조심하시고 부족한 글 읽어주셔서 감사합니다 :) 🙇🏻♀️
'iOS' 카테고리의 다른 글
iOS 데이터 저장 방식 알아보기 - SwiftData (0) | 2025.01.18 |
---|---|
iOS 데이터 저장 방식 알아보기 - Core Data (0) | 2024.12.16 |
APFS(Apple File System) (1) | 2024.11.13 |
iOS 데이터 저장 방식 알아보기 - UserDefaults 편 (1) | 2024.11.04 |
iOS 데이터 저장 방식 알아보기 - 개념편 (2) | 2024.10.25 |