씬디의 블로그
[Swift] 앱의 생명주기 본문
Swift
면접 단골 질문 앱 생명주기 (강의자료 2회차, 6회차)
앱의 생명주기란?
앱의 처음 실행되는 순간부터 종료되는 시점까지의 상태,
그리고 앱이 비활성화되거나 background로 전환되는 상태 등의 일련의 과정을 뜻한다
앱의 생명주기를 왜 배워야하지?
메모리 효율성
- 앱이 실행되면서 메모리를 효율적으로 사용해야한다. 생명주기를 이해하면 필요할 때 자원을 할당하고, 필요 없을 때 해제하여 시스템 성능을 최적화할 수 있다
안전성
- 앱이 예기치않게 종료되거나 비정상적으로 동작하지 않도록 하는 것은 ⭐️매우 중요⭐️ 하다. 생명주기를 알면 앱이 종료되기 전에 중요한 데이터를 저장하거나, 사용자 상태를 유지할 수 있다
디버깅 용이성
- 생명주기를 알면 앱이 특정 상태에서 문제가 발생했을 때, 어디에서 무엇이 잘못되었는지 쉽게 추적할 수 있다
앱의 생명주기는 AppDelegate와 SceneDelegate가 관여하고있다
디바이스에 설치된 수 많은 앱이 조화롭게 작동하기 위해, 앱 생명주기를 관리하는 부분이자 앱의 실행과 종료를 담당한다
iOS13 이전과 이후의 차이
iOS13 이전
- AppDelegate가 앱의 생명주기를 처리했다
iOS13 이상
앱은 하나의 UI 인스턴스만 매칭될 수 있었기에 동시에 같은 앱을 실행해서 서로 다른 화면을 보고 싶은 경우 대응을 못했다
- iPadOS가 새롭게 등장함에 따라 iPadOS의 멀티 윈도우 기능이 등장하게 되었고, 이를 관리해줄 객체가 필요해졌다
아이폰에선 불가능한 멀티태스킹 기능이 강화되면서
이에 따라 기존의 AppDelegate로 관리하던 앱과 UI의 생명주기 관리 방식이 변경되었다
멀티태스킹을 지원하던 이전에도 AppDelegate가 앱의 모든 것을 관리했다
즉 시스템과의 커뮤니케이션을 통한 프로세스 관리와 앱 상태에 따른 어떤 UI를 보여줄지를 관리하는 역할을 담당했다
이런 관리 방식의 문제점은 같은 앱에서 서로 다른 화면을 동시에 보여줄 수 없다는 점이다
따라서 하나의 앱이 동시에 여러 화면을 띄워주는 작업을 서로 다른 Session이라고 이해하고 시작해야 한다
이를 "Scene Sessions"라고 한다
그리고 이런 Scene들을 관리하도록 SceneDelegate가 등장했다
- 따라서 SceneDelegate가 도입된다
AppDelegate와 SceneDelegate안에 앱의 생명주기 메서드들이 다 담겨져있다
AppDelegate
앱의 entry point 역할을 하고
func application(_: didFinishLaunchingWithOptions: ) -> Bool
didFinishLaunchingWithOptions 메서드가 호출되면 앱이 실행되면서 SceneDelegate로 제어가 넘어간다
SceneDelegate
화면에 무엇을 보여줄지 관리한다
모든 Scene의 연결이 해제되거나 한동안 앱을 사용하지 않는다면
func application(_: didDiscardSceneSessions: )
didDiscardSceneSession 메서드가 호출되어 앱이 메모리에서 완전히 사라진다
앱의 5가지 상태
Not Running
- 앱이 시작되기 전 상태
Foreground - Inactive
- 앱이 실행중이지만 사용자와의 상호작용이 없는 상태
- (예: 카톡하다가 전화가 오거나, 알람이 울려서 카톡을 사용할 수 없게 되는 경우)
- 사용자가 돌아왔을 때 앱이 정상적으로 다시 활성화될 수 있도록 준비하는 작업을 수행한다
- 사용자가 보고있던 비디오, 듣고있던 음악 화면, 진행하고 있던 게임을 일시 정지하고 임시 저장
Foreground - Active
- 앱이 일반적으로 돌아가는 상태, 화면에서 실행중인 상태
Background
- 앱이 background에서 실행중인 상태로, 사용자에게 보이지 않지만 여전히 작업을 수행할 수 있다
- 화면 밖에서 작동하므로 가능한 한 작업을 적게 수행해야 하며, 가급적 아무것도 수행하지 않는 것이 좋다
- (예: 음악, gps, 녹음 등은 background에서도 동작)
- 음악이나 통화는 background일 때 동작을 하고, 보통의 앱은 suspended가 된다
- 앱이 background 상태에서 추가적인 작업을 하지 않으면 바로 suspended 상태로 진입한다
Suspended
- 앱이 메모리에 유지되지만 실행되지 않는 상태
- 앱을 다시 킬 경우 빠르게 Active 상태로 전환될 수 있다
- 메모리가 부족한 상황이 되면 제일 먼저 메모리에서 해제된다
- Suspended가 되면 Not Running과 같다고 봐야한다
앱의 생명주기를 이해하는 것은 앱 개발에서 매우 중요한 부분이다
이를 통해 메모리 효율성을 높이고, 앱의 안전성을 유지하며, 문제 발생 시 빠르게 디버깅할 수 있다
'App > Swift' 카테고리의 다른 글
[Swift] ARC 파헤치기 (2) | 2024.05.28 |
---|---|
[Swift] 프로퍼티 정복 (0) | 2024.05.26 |
[Swift] 클래스 기반의 Realm에서는 didSet이 동작을 안한다? (Property Observer - Class와 Struct에서의 동작 차이) (0) | 2024.02.29 |
[UIKit] UITextField Border Style 테두리 없애기 (0) | 2024.01.13 |
[UIKit] UITextField Left padding (1) | 2024.01.13 |