티스토리 뷰
개요
이번 글에서는 iOS File System에 대해서 이야기해보겠습니다!
어떤 앱에서 다른 앱(또는 위젯)에 원하는 데이터를 전달하는 데에 저장소에 대한 이해가 필요해서 이 글을 쓰게 되었어요 :]
우선, 공식 문서를 기준으로(iOS를 초점으로) 저장 시스템의 기본을 이해해볼게요!
File System이란?
Apple 생태계의 기본 파일 시스템은 APFS로 macOS, iOS, watchOS, tvOS 파일 시스템의 기본이 돼요(iOS 10.3 이상, macOS HighSierra 이상).
여기서 파일 시스템이란 데이터 파일, 앱 및 운영체제와 관련된 파일의 저장소를 처리하는 시스템을 의미해요.
특정 데이터를 저장, 삭제, 수정하는 것처럼 파일 시스템과 상호 작용하는 코드를 작성하기 위해서는 이 시스템에 대한 이해가 선행되어야 해요 :]
About iOS File System
iOS File System의 기본은 "사용자가 파일 시스템에 직접 엑세스할 수 없다"는 것이고, 앱은 이 규칙을 따라야 해요.
예전에는 이 규칙에 불편함을 느껴 탈옥이라는 것을 해서 파일 시스템에 직접 액세스 했었어요!
이를 통해 애플이 의도한 것 이상의 커스터마이즈를 할 수 있었는데, 말 그대로 시스템의 규칙을 어기는 행위이기 때문에 안 하는 것을 권장하였고, 요새는 보기 힘든 것 같아요 :]
사용자가 파일 시스템에 직접 액세스 할 수 없다면 파일 시스템이 규칙을 통해서만 관리되기 때문에 문제의 소지가 적어지고 관리가 조금 더 심플해질 수 있어요.
SandBox
iOS 파일 시스템의 기본은 샌드박스에요.
샌드박스는 말 그대로 모래를 담고 있는 박스예요.
아이들이 그 안에서 마음껏 모래를 가지고 놀 수 있게 만들어놓은 미니 놀이터라고 할 수 있어요.
애플은 사용자들이 특정 앱의 샌드박스 안에서 파일들을 마음껏 사용할 수 있게 시스템을 설계했어요 :]
보안을 위해 iOS 앱과 파일 시스템의 상호 작용은 앱의 샌드박스 디렉터리 내부 디렉터리로 제한해요.
조금 더 쉽게 이야기하면 특정 앱에서 그 앱만의 샌드박스를 가지고 있고, 그 앱이 그 샌드박스 내부에서 파일들을 관리하는 것은 자유롭게 할 수 있어요.
하지만 다른 앱이 가진 샌드박스에는 함부로 들어갈 수 없어요.
하나의 앱이 다른 앱들의 샌드박스에 마구 들어갈 수 있다면 악성코드와 같은 앱이 설치되어 은행 앱 등의 개인 정보에 쉽게 접근할 수 있겠죠?
새 앱을 설치할 때 설치 프로그램은 샌드박스 디렉터리 내에 앱에 대한 여러 컨테이너 디렉터리를 생성해요.
즉, 하나의 샌드박스 안에 하나의 폴더로 관리되는 것이 아니라 여러 폴더로 구분되어 관리되고, 당연히 각각의 폴더는 고유의 역할이 있어요.
1. Bundle Container: 앱의 번들(Bundle)*을 보유해요.
2. Data Container: 앱과 사용자 모두에 대한 데이터를 보유해요. 앱이 데이터를 정렬하고 구성하는 데 사용할 수 있는 여러 하위 디렉터리로 더 나뉘어요.
3. iCloud Container: 앱은 런타임 시 iCloud 컨테이너와 같은 추가 컨테이너 디렉터리에 대한 액세스를 요청할 수 있어요.
- Bundle: 앱의 번들은 실행 코드와 이미지, 사운드와 같은 관련 리소스를 한 곳에서 그룹화하는 파일 시스템의 디렉터리를 의미해요. 또한 번들은 실행 가능한 코드와 해당 코드에서 사용하는 리소스를 보유하는 표준화된 계층 구조를 가진 디렉터리예요.
앱은 기본적으로 컨테이너 디렉터리 외부에 있는 파일에 액세스하거나 파일을 생성할 수 없어요.
이 규칙에 한 가지 예외가 있는데 앱이 공개 시스템 인터페이스를 활용하여 사용자 연락처나 음악과 같은 항목에 엑세스 하는 경우예요.
이제 Data Container 내부의 디렉터리에 대해 조금 더 살펴볼게요 :]
Data Container
Documents
이 Documents에는 유저 데이터를 보관해요.
여기서 유저 데이터란 일반적으로 사용자에게 노출할 수 있는 (사용자가 생성, 가져오기, 삭제, 편집이 가능한) 모든 파일을 의미해요.
예를 들어 그리기 앱의 경우 사용자가 만들 수 있는 모든 그래픽 파일이 포함되고, 텍스트 편집 앱의 경우 텍스트 파일이 포함돼요.
이 Documents의 파일들은 iCloud나 iTunes에서 백업을 할 경우 함께 백업되는 파일들이에요.
/ Inbox
Documents 내부에는 Inbox라는 디렉터리가 따로 존재해요.
이 Inbox는 외부 앱의 전달 자료를 저장해요.
즉, 해당의 앱에서 샌드박스 외부의 자료가 필요할 때 외부 앱에서 특정 정보를 전달받아야 하고, 이 정보가 Inbox로 들어와요.
Library
사용자가 만든 데이터가 아니라 앱이 직접 관리하는 데이터를 가지는 공간이에요!
가장 중요한 포인트는 사용자에게 직접 노출될 일이 없는 파일들이란 점이에요.
이 Library의 파일들 역시 사용자가 직접 만들진 않지만 iCloud / iTunes 백업 시 함께 백업이 돼요(/Caches 제외)!
라이브러리 내에는 Application Support, Caches, Preferences와 같은 하위 폴더가 존재해요.
/ Application Support
앱에서 생성된 데이터를 저장해요.
물론 유저가 생성한 데이터가 아니라 앱에서 관리용으로 사용되는 데이터를 의미해요 :]
/ Caches
반복 사용되는 임시 데이터를 저장해요.
디스크 용량이 부족시 시스템에서 자동으로 청소하지만, 앱 실행 중에는 삭제하지 않아요.
재요청 / 재생산이 가능한 데이터를 저장해요.
그리고 백업이 되지 않는 공간이에요.
/ Preferences
앱 환경 설정 데이터를 저장해요.
직접 수정이 권장되지 않으며 UserDefaults, CFPreferences 등을 사용하는 것이 권장돼요.
환경 설정 역시 백업이 되는 공간이에요 :]
tmp
tmp에는 재사용이 되지 않으며 장기간 유지할 필요가 없는 임시 데이터를 넣어요.
작업이 끝나면 해당 파일을 삭제하여 디바이스 공간을 낭비하지 않도록 해줘요.
시스템은 앱이 실행되고 있지 않을 때 이러한 파일을 주기적으로 제거해줘요.
그리고 당연히 백업이 되지 않는 공간이에요!
참고: Apple Develop Documents - File System Basics
'iOS 앱개발 > iOS' 카테고리의 다른 글
[iOS] 앱 테스트를 위해 네트워크 속도 조절하기(Mac & iPhone) (0) | 2022.10.06 |
---|---|
[iOS] - XCTest 놓치고 있던 내용 가벼운 정리 (0) | 2022.09.12 |
[iOS] - SwiftUI 이해하기(2) (0) | 2022.05.29 |
[iOS] - SwiftUI 이해하기(1) (0) | 2022.05.29 |
[iOS] ReactorKit 개념 이해하기(feat.README of ReactorKit) (0) | 2022.04.07 |
- Total
- Today
- Yesterday
- Distinct#Codility#Python
- 반복수열#백준알고리즘#Python
- 파이썬알고리즘인터뷰#4장
- 리모컨#완전탐색#BOJ#Python
- 백준 알고리즘#BackTracking
- N으로 표현#DP#Programmers#Python
- NumberofDiscIntersections#Codility#Sort#Python
- 암호코드#dp#BOJ#Python
- 순열사이클#BOJ#Python
- 섬의개수#백준알고리즘#Python
- Brackets#Stacks and Queues#Codility#Python
- Triangle#Sorting#Codility#Python
- 토마토#백준알고리즘#Python
- 날짜 계산#BOJ#완전탐색#Python
- 미로 탐색#백준알고리즘#Python
- 터틀비치#리콘#xbox#controller
- 랜선자르기#이분탐색#BOJ#Python
- 배열합치기#분할정복#BOJ#Python
- 병든 나이트#BOJ#탐욕법#Python
- django
- API#lazy#
- 쿼드트리#BOJ#분할정복#Python
- Swift#Tuples#Range
- django#slicing
- 종이자르기#분할정복#BOJ#Python
- PassingCars#Codility#Python
- filter#isalnum#lower
- 텀 프로젝트#백준알고리즘#Python
- 공유기 설치#BOJ#이분탐색#Python
- 나무자르기#BOJ#이분탐색#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |