본문 바로가기
공부/[iOS&Swift]

[iOS] iOS 앱의 생명주기(App, Scene)에 대하여

by 인생은아름다워 2022. 2. 19.

 

오늘은 iOS에서 키워드와 관련된 공부를 해볼까 한다.

중요한 것은 생명주기라는 것이 한 가지에만 있는 것이 아니라, App, Scene, View(ViewController)가 각각 생명주기라는 개념이 있다 라는 것이 중요한 사실이다.

 

생명주기라는 것이 일단 말이 거창하지만, 실제로 공부하는 입장에서는 상태변화(?)또는 위치를 점유하는 기간 정도의 말이 이해가 더 잘 되는 것 같다 ㅎㅎ..(저 에게는요..) 그러니까, App, Scene, View의 상태가 변할 때마다 OS에서 지원하는 method가 호출되는데 그 상태변화에 대해서 정확하게 이해하고, 필요한 Lifecycle method를 잘 재정의(override)해서 사용하면 되는 것이다!

 

생명주기라는 것이 존재하는 이유는 : 한정된 자원을 통해 여러 개의 App, Scene, View들을 실행하거나 나타내야 하기 때문에 실제로 각 App, Scene, View가 각자의 위치를 점유하는 기간을 좀 디테일(?)하게 다뤄야 한다. 그리고 그 기간을 명명하여 어떠 어떤 때 무슨무슨 작업을 하게끔 할 수 있게 생명주기 메서드를 제공하는 것이다. (예시 : 뷰가 나타날 때 프린트를 한다! → viewDidLoad메서드 내에 print함수 추가하여 메서드를 재정의)


✏️ App Lifecycle & Scene Lifecycle에 대하여

먼저 이와 관련된 내용은 아래 참고자료에 첨부한 Managing Your App’s Life Cycle이라는 공식 문서를 통해 확인할 수 있다.

문서에서는 가장 처음에 이런 말을 한다. “앱이 foreground, background에 있을 때 시스템 노티피케이션에 대한 응답하고, 중요한 시스템 관련 이벤트를 처리한다” (라이프사이클이 또는 라이프사이클을 통해)

어떤 생명주기에 있느냐에 따라서 애플리케이션의 행동을 적절하게 구현해줘야 하는데, 어떤 생명주기에 있느냐 라는 것은 UIKit에서 적절한 delegate method를 호출함으로써 알려준다.

그리고 iOS 13을 기점으로 기존에는 AppDelegate만 존재했고, 이후에는 SceneDelegate이 추가되었음을 알 수 있다.

실제로 새로운 프로젝트를 생성하면 위와 같이 AppDelegate.swift 파일과 SceneDelegate.swift파일이 동시에 생성되어 있음을 알 수 있다. 그리고 UIKit은 이 두 가지 delegate로 하여금 App과 Scene의 생명주기마다 생명주기 메서드를 실행하게끔 전달한다.

 

그러면 App, Scene에 대해 아주 간략하게는 정리해보는 게 좋을 것 같다.

App : 말 그대로 애플리케이션 그 자체

Scene : 디바이스에서 실행 중인 앱 UI의 하나의 인스턴스. 하나의 App에는 여러 개의 Scene 인스턴스가 있을 수 있다. 이를 통해 아래 사진과 같은 Multi-scene환경을 만들 수 있고, 각 scene를 보여주거나 숨길 수 있다.

(여기서의 scene은 storyboard상의 ViewControllerScene이랑은 다르다!!)

이렇게 multi-scene환경에서 각 scene은 서로 다른 인스턴스이기 때문에 독립적인 생명주기를 가지게 되고, 그렇기 때문에 AppDelegate, SceneDelegate를 나눠두어 SceneDelegate에서 여러 Scene 인스턴스들의 생명주기 메서드를 호출하게끔 바뀐 내용이 iOS 13에서의 변화이다.

 

이 정도로 App과 Scene에 대한 내용 정리를 마치고, iOS 13 이후 버전의 Scene-based Lify-cycle에 대해서 정리해보자. 아래 그림은 scene의 상태변화를 나타낸다.

사용자나 시스템이 새로운 scene을 요청한다면, UIKit은 scene을 만들어서 Unattached상태에 가져다 둔다. 여기서 사용자 요청 scene은 빠르게 foreground로 이동시키고, 시스템이 요청한 scene은 보통의 경우 background로 이동하여 이벤트를 처리한다. 예를 들어보자, 시스템은 어떤 위치 이벤트를 처리하기 위해 scene을 background에서 시작할 수 있다.

 

또한 사용자가 앱 UI를 종료하면 UIKit은 해당 scene을 background로 가져가고 suspend상태로 가게 된다. 물론, UIKit은 background에 있거나 suspend 된 scene을 언제든지 리소스를 회수하기 위해서 연결을 끊고 scene을 unattached상태로 되돌릴 수 있다.

 

위에서는 어떤 Scene이 생성되어 Unattached, Background, Foreground상태에 있는 상황들을 이야기했다. 그런데 ‘연결을 끊고’라는 표현을 사용했는데, 이것은 어떤 연결을 끊는다는 것일까?

Scene 입장에서 연결을 하거나, 연결을 끊을 상대는 App이다.

 

뭔가 앱의 생명주기가 전체적으로 있고, 그 내부에서 하나 이상의 Scene들이 존재하며 생명주기를 독립적으로 가지는 개념인 것인데, 그러면 App과 Scene이 어떤 생명주기를 가지는지 알아보면 될 것 같다.

 

다음은 iOS13 전후의 AppDelegate 도식이다.

먼저 iOS 13 이전을 보자면, AppDelegate의 responsibilities에 Process lifecycle과 UI lifecycle이 모두 포함되어 있는 것을 볼 수 있다. 그런데 아래 그림을 보면 Scene Delegate이라는 놈이 새로 생겨서 기존에 AppDelegate의 책임 중 UI lifecycle부분을 똑 떼어 가버렸다.

정말 개념이 와닿으려고 한다.

그냥 App 생명주기 그 자체(앱이 준비된다, 앱이 종료된다)는 AppDelegate이 하고, 그 내부에서 Scene의 생명주기가 독립적으로 돌며 이 내용은 SceneDelegate에서 확인 하능 하며, 이 둘의 연결고리가 SceneSession이라는 녀석을 통해 진행되는 것이다!

지금까지 정리한 내용을 아주 잘 정리해놓은 유셩장님 블로그의 사진으로 확인할 수 있다.

🍎 결론

App의 생명주기 안에 Scene생명주기들이 있다!

UIKit은 각 생명주기 변화의 경계에서 해당 delegate 객체에게(AppDelegate, SceneDelegate) 전달하여 생명주기 메서드(Lifecycle method)를 호출하게끔 한다!

🍎 참고 자료

Managing Your App’s Life Cycle

WWDC2019 - Architecting Your App for Multiple Windows

유셩장님 블로그 - iOS) 앱/Scene 생명주기

레나참나님 블로그 - [iOS] AppDelegate와 SceneDelegate

댓글