콘텐츠로 바로가기

App Lifecycle & Sandbox Physics

App Lifecycle 및 Sandbox 메커니즘의 정의, 범위, 선행 지식, 학습 주제, 참고 근거를 정리한 CS&E 학습 노드입니다.

목차 보기20

1. Overview

앱 생명주기 및 샌드박스 물리(App Lifecycle & Sandbox Physics)는 운영체제(iOS)가 한정된 메모리와 배터리 자원 속에서 애플리케이션의 탄생, 백그라운드 유배, 그리고 강제 처형(OOM: Out Of Memory)을 통제하는 시스템적 생존 법칙을 다룹니다.

데스크톱 환경과 달리 모바일 앱은 유저가 홈 화면으로 나가는 순간(Background), OS로부터 즉각적인 정지 명령(Suspend)을 받아 얼어붙어야 하며 허락 없이 CPU를 사용할 수 없습니다. 학습자는 앱이 Launch, Active, Inactive, Background, Suspended 상태를 횡단하는 라이프사이클의 궤적을 쫓으며 메모리 백업 시점을 체화합니다. 또한, 각 앱이 자신만의 감옥(Sandbox) 안에서만 파일을 읽고 쓰며 외부 앱의 데이터에 접근할 수 없도록 격리되는 파일 시스템 보안 아키텍처의 물리적 한계를 익힙니다.

2. Scope & Boundaries

In-Scope

  • 앱 생명주기(App Lifecycle): UIApplication 생명주기 상태(Active, Inactive, Background, Suspended), 메모리 경고(Memory Warning) 훅.
  • 뷰 컨트롤러 생명주기: viewDidLoad, viewWillAppear, viewDidAppear의 레이아웃 로딩 및 렌더링 물리.
  • 샌드박스 시스템(Sandbox): 앱 전용 디렉토리 격리(Documents, Library, Caches, tmp), 프로세스 간 통신(IPC) 제한.
  • 백그라운드 실행: 백그라운드 태스크(Background Fetch), 오디오 재생, 위치 추적 권한 역학.

Out-of-Scope

  • 권한 승인 시스템 깊은 심연: iOS가 아니라 Android 플랫폼의 런타임 권한(Manifest) 역학 ightarrow ightarrow 13-02-04. Android Security & Permissions Physics 영역으로 위임.
  • 앱스토어 배포 및 바이너리 서명: Provisioning Profile을 씌워 앱스토어에 바이너리를 쏘아 올리는 과정 ightarrow ightarrow 13-04-02. CI-CD & Store Release Policy Physics 영역으로 위임.

Boundaries

  • iOS Lifecycle vs OS Kernel (03-01): OS Kernel(03-01)은 메모리가 꽉 차면 무작위 프로세스를 죽이는 OOM Killer의 하드웨어 메커니즘이라면, 13-01-04는 그 OOM Killer의 칼날이 앱에 날아오기 0.5초 전에 didReceiveMemoryWarning 이벤트를 받아 캐시(Caches) 데이터를 버리고 연명하는 애플리케이션 방어선입니다.

3. Counterexample

  • 백그라운드 무한 생존의 환상 (Background Immortality Fallacy): 앱이 홈 화면으로 나간 뒤에도(Background) 계속해서 서버에 GPS 좌표를 쏘고 타이머를 돌리도록 방치하는 행위. 모바일 OS는 배터리를 구하기 위해 백그라운드로 진입한 지 3초 안에 앱의 스레드를 완전히 강제로 얼려버리며(Suspended), 과도하게 배터리를 먹는 앱은 사용자 모르게 메모리에서 즉각 학살당합니다(OOM Terminate). 백그라운드 작업은 반드시 OS의 시스템 승인(Background Task)을 받아 제한된 시간 내에 끝내야 합니다.
  • 절대 경로 하드코딩 (Absolute Path Fallacy): 앱 내에 이미지를 저장하면서 경로를 /User/MyApp/Documents/image.png처럼 하드코딩(Hard-coding)하여 저장하는 무지. iOS 샌드박스는 앱이 업데이트될 때마다 랜덤한 고유 식별자(UUID) 기반의 루트 디렉토리를 통째로 새로 발급하여 이사시킵니다. 절대 경로를 쓰면 업데이트 다음 날 파일을 찾을 수 없어 앱이 터지며, 반드시 FileManager를 통한 동적 상대 경로 체계를 이용해야 합니다.

4. Prerequisites

  • 운영체제 프로세스 관리 (Basic): 프로세스의 상태(Ready, Running, Blocked) 변화를 이해해야 iOS의 Active/Background 생명주기 궤적을 이해할 수 있습니다. (03-01. OS Processes)
  • 메모리 계층 구조 (Recommended): 캐시(Cache) 메모리와 보조 기억 장치의 속도 차이를 알아야 Sandbox의 Documents와 Caches 디렉토리를 구분해 쓸 수 있습니다. (02-02. Memory Physics)

5. Learning Map

Sequence Core Cluster Objective & Description Evidence (BoK)
1 App States 앱이 실행되고 화면에 뜨며 다시 유배당해 죽기까지의 5단계 롤러코스터 상태 변화를 쫓아갑니다. Industry
2 View Lifecycle 화면이 뜨기 직전(Will)과 뜬 직후(Did)의 1ms 찰나에 애니메이션과 레이아웃 데이터를 채워넣는 훅(Hook)을 장악합니다. Primary
3 Sandbox Jail 다른 앱의 데이터를 훔쳐볼 수 없게 차단된 파일 시스템 감옥(Sandbox)의 구조와 각 폴더의 용도를 구분합니다. Primary
4 Survival Tactics 유저가 폰을 끄거나 다른 앱으로 넘어갈 때, 하던 작업을 황급히 임시 저장하고 숨죽이는 백그라운드 생존법을 배웁니다. Primary

6. Learning Topics

Basic

Core Topic 01: 애플리케이션 상태 전이 (App States)

  • Why to Learn: 앱이 전화를 받거나 홈 화면으로 튕겨나가는 순간에 데이터를 날리지 않고 안전하게 임시 저장하는 타이밍을 잡기 위함입니다.
  • What to Learn: Not Running ightarrow ightarrow Inactive ightarrow ightarrow Active ightarrow ightarrow Background ightarrow ightarrow Suspended 상태 역학.
  • How to Learn: applicationDidEnterBackground 함수에 로그를 박아넣고 홈 화면으로 나가면 그 로그가 즉시 찍히지만, 그 이후의 타이머 연산은 OS에 의해 완전히 무시당하는 물리적 기절(Suspension)을 눈으로 확인합니다.
  • Implement: 폼(Form)에 텍스트를 입력하다가 전화가 걸려와 앱이 Inactive 상태로 밀려나는 순간, 입력 중이던 텍스트를 UserDefaults에 자동 저장하는 방어 시나리오 코드 작성.

Core Topic 02: 뷰 컨트롤러(UI) 생명주기

  • Why to Learn: 메모리에 껍데기만 올라온 상태와, 화면에 실제 픽셀이 렌더링된 상태를 구분하여 무거운 네트워크 호출을 최적의 타이밍에 터뜨리기 위해서입니다.
  • What to Learn: init ightarrow ightarrow loadView ightarrow ightarrow viewDidLoad ightarrow ightarrow viewWillAppear ightarrow ightarrow viewDidAppear.
  • How to Learn: 뷰의 가로 사이즈(width) 값을 찍어볼 때, viewDidLoad에서는 제약 조건이 덜 풀려 0으로 나오다가 viewDidAppear에 이르러서야 실제 스크린 해상도로 계산되어 나오는 공간적 차이를 해부합니다.
  • Implement: viewDidLoad에서는 서버 API 호출 세션을 세팅하고, viewDidAppear에서 비로소 페이드인(Fade-in) 애니메이션을 시작시켜 화면 렌더링을 찢어지게 하지 않는 생명주기 맞춤형 로직 설계.

Core Topic 03: 샌드박스와 파일 시스템 디렉토리

  • Why to Learn: 절대 날아가면 안 되는 사용자 일기장(Data)과, 지워져도 다시 다운받을 수 있는 썸네일 캐시(Cache)를 분리 저장하여 유저의 폰 용량을 아끼기 위함입니다.
  • What to Learn: App Sandbox, Documents(백업 O), Library/Caches(백업 X), tmp 디렉토리 역학.
  • How to Learn: 100MB짜리 임시 데이터를 Documents에 저장했다가 iCloud 백업 용량이 폭발하여 심사에서 리젝(Reject)당한 뒤, 이를 Caches 디렉토리로 옮겨 OS가 용량이 부족할 때 알아서 지워주도록 설계(Architecture)를 전환합니다.
  • Implement: FileManager를 사용하여 앱 실행 시 매번 랜덤하게 갱신되는 샌드박스 루트 경로(URL)를 동적으로 찾아내고, 유저 데이터를 Documents 디렉토리에 안전하게 직렬화하여 쓰는 파일 입출력 로직 작성.

7. Terminology

Term (EN / ko, abbr) 1문장 정의 단계(기본/권장/실무/심화) 역할/맥락 관련 개념 유사/대비/함께 사용 오해 포인트 Evidence(Primary/Secondary/Industry) Flags(core)
App Sandbox 운영체제가 앱마다 부여한 고립된 파일 시스템 감옥으로, 다른 앱의 데이터나 시스템 파일에 무단 접근을 차단하는 보안 물리벽입니다. 기본 보안 격리 File System, IPC vs. Root Access 모바일 앱도 데스크톱처럼 윈도우 C드라이브 전체를 볼 수 있다는 착각 Primary core
Suspended State 앱이 메모리 공간(RAM)에는 살아있지만, CPU의 연산 자원은 단 1%도 배정받지 못한 채 완전히 기절해 있는(얼어붙은) 상태입니다. 실무 자원 제어 Background State vs. Terminated State 앱이 화면에 없으면 메모리에서 완전히 삭제된 상태라는 오해 Industry Docs core
Out of Memory (OOM) 현재 활성(Active) 앱을 살리기 위해, OS가 백그라운드에 얼어있는 앱을 칼로 베듯 강제로 죽여 메모리 공간을 회수하는 현상입니다. 권장 강제 종료 Memory Warning vs. Graceful Exit 메모리가 부족하면 앱이 천천히 스스로 종료될 시간을 줄 거란 맹신 Primary core
Documents vs Caches 유저가 생성해 절대 지워지면 안 되는 파일(Documents)과 성능을 위해 남겨둔 임시 찌꺼기 파일(Caches)을 구분하는 물리적 잣대입니다. 실무 저장 위계 FileManager vs. tmp Directory 모든 다운로드 파일을 제일 안전해 보이는 Documents에 다 때려박는 함정 Industry Guidelines core

8. References

Primary References

  • [CS2023: Operating Systems] — 프로세스 상태(상태 머신 전이도), 자원 할당 및 메모리 고립(Sandbox) 아키텍처.
  • [SWEBOK v3: Software Quality] — 리소스 제약(Resource Constraint) 환경에서의 메모리 풋프린트 관리 최적화.

Secondary References

  • [iOS App Architecture (Objc.io)] — SceneDelegate/AppDelegate 구조의 책임 분리와 상태 전이 이벤트 바인딩.
  • [File System Programming Guide] — 샌드박스 내부 디렉토리 별 iCloud 백업 정책, 일회성 데이터(tmp) 삭제 주기 물리.

Industry References

  • [Apple WWDC: Advances in App Background Execution] — Background Fetch 윈도우 스케줄링, 디퍼드 태스크(Deferred Task) 제어 한계.
  • [Apple Developer: Managing your app's life cycle] — Active/Inactive/Background 상태 머신 전이도 및 메모리 경고(MemoryWarning) 훅(Hook) 처리.

9. Final Checklist

Primary Checklist

  • 유저가 앱을 떠나 Background로 진입할 때(또는 Inactive 전환 시), 작성 중이던 모든 휘발성 데이터를 디스크(UserDefaults/DB)에 안전하게 백업(Save)하는가?
  • 인터넷에서 임시로 다운받은 다량의 이미지나 캐시 파일을 Documents가 아닌 Cachestmp 폴더에 분리 저장하여 기기 백업 용량을 고갈시키지 않는가?

Secondary Checklist

  • 파일 시스템 접근 시 절대 경로(Absolute Path) 문자열을 데이터베이스에 저장하지 않고, 매 런타임마다 동적으로 샌드박스 홈 디렉토리(NSSearchPathForDirectoriesInDomains)를 갱신하여 참조하는가?
  • UI 레이아웃의 너비/높이 값이 필요한 렌더링 로직을 껍데기만 올라온 viewDidLoad가 아닌, 실제 픽셀이 계산된 viewWillAppear/viewDidAppear 훅에 배치했는가?

Industry Checklist

  • 운영체제로부터 메모리 부족 경고(didReceiveMemoryWarning)를 받았을 때, 캐시된 이미지 배열이나 당장 안 쓰는 객체들을 즉시 메모리에서 날려버려 OOM(Out of Memory) 강제 종료를 회피하는가?
  • 백그라운드 태스크(음악 재생, GPS 추적)를 켤 때, OS가 강제로 스레드를 기절(Suspend)시키기 전 부여된 유예 시간(Time Extension) 내에 작업을 종료하고 반납(endBackgroundTask)하는가?

Mobile App Lifecycle & System Integration

4 / 4