아이패드 Playground에서 프로젝트를 만들면 ContentView 말고도 MyApp이라는 Swift 파일이 항상 같이 생성됩니다. 파일에 작성된 코드를 보면 평소에 보던 ContentView와 비슷한 듯하면서도 다른 모습을 볼 수 있습니다.
//MyApp.Swift
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
//ContentView.Swift
import SwiftUI
struct ContentView: View {
var body: some View {
ㆍㆍㆍ
}
}
코드 짤 때는 한번도 못 본 @main
, App
, Scene
, WindowGroup
같은 것들이 보이네요..
이 것들은 모두 SwiftUI 앱의 생명주기(Lifecycle)와 관련이 있습니다.
이번 포스팅에서는 이를 알아보기 전에 먼저 iOS 앱의 생명주기를 먼저 알아보겠습니다.
iOS 앱의 생명주기란 앱이 아이폰의 디바이스에서 실행되고 사용되며 종료되기까지의 과정입니다.
iOS 앱의 생명주기는 크게 3가지로 분류할 수 있습니다.
Foreground는 Active
와 Inactive
로, background는 Running
과 Suspend
상태로 구분할 수 있습니다..
Active
상태는 앱이 화면을 차지하고 있으면서, 사용자가 앱을 Full Control할 수 있는 상태를 말합니다.
Inactive
상태는 외부적인 방해에 의해서 사용자가 앱을 Full Control할 수 없는 상태를 말합니다.
Active
가 Inactive
에게 감싸져 있는게 보이시나요?
Active
상태가 되거나 벗어날 때는 Inactive
상태를 반드시 거쳐야함을 의미합니다.
텍스트로만 설명하면 이해가 어려울 수 있으니 제가 지금 글쓰면서 사용하고있는 Youtube Music 앱을 예시로 설명해보겠습니다.
Youtube Music 앱이 Not Running
상태에서 Inactive
상태를 거쳐 Active
상태가 되었습니다.
Active
상태에는 이렇게 앱을 Full Control(앨범을 누르고, 노래를 재생) 할 수 있습니다.
위처럼 Active
상태가 되기위해서는 반드시 Inactive
를 거쳐야 합니다.
유튜브 뮤직이 외부의 방해(사용자의 제스처로 앱 스위처로 이동)를 받아 Active
에서 Inactive
상태가 되었습니다. 이 때는 어느정도 화면을 차지하고 있지만, 앱을 Full Control하지 못합니다.
이번엔 노래를 재생한 채로 제스처를 통해 유튜브 뮤직을 백그라운드로 보냈습니다.
앱의 상태는 Active
에서 Inactive
를 거쳐 Running
상태가 되었습니다. Running
상태에서는 화면을 차지하지 않더라도 백그라운드에서 계속 작업을 수행하고 있습니다. 다이나믹 아일랜드에서 노래가 계속 재생되고 있는걸 확인할 수 있습니다. 깨알 다이나믹 아일랜드 자랑(ㅋㅋ)할랫는데 사진 깨졋네 ㅡㅡ
하지만 iOS에서는 보안상의 이유로 백그라운드에서 앱이 오랫동안 돌아가는걸 지양하고 있습니다. 그래서 앱이 백그라운드에서 작업을 정해진 시간 내에 완료하지 못하면, Timeout 함수를 호출하여 하던 작업을 정리하고, Not Running
상태가 됩니다.
만약 정해진 시간 내에 작업을 완료하면 Running
상태에서 Suspend
상태가 됩니다.
노래를 정지하고 백그라운드로 보내 앱이 Active
에서 Inactive
를 거쳐 Suspend
상태가 되었습니다. 이 때 앱은 메모리에서 아무 행동을 하지 않으면서 사용자가 앱을 다시 실행할 때까지 계속 대기합니다.
Suspend
상태에서 메모리의 용량이 부족해지면 OS의 결정에 따라 앱이 메모리에서 내려가 Not Running
가 됩니다.
그리고 그림에 화살표로 표시되고 있진 않지만, Running
에서 Not Running
이 되거나, Inactive
에서 Not Running
상태가 되는 것도 가능합니다.(앱 스위처에서 드래그 제스처로 종료)
저희가 일상에서 쓰고있는 앱들은 매번 이런 과정들을 거칩니다.
Safari를 백그라운드로 내려도 다운이 멈추지 않고,
게임을 하다가 중간에 전화를 받아도 다시 그 전 게임 화면으로 돌아올 수 있는 것도 다 앱들이 이런 과정을 거치기 때문이겠죠.
이 말을 다르게 하면, 저희가 만들 앱들 역시 이런 상태에 대한 반응을 다룰 수 있음을 의미합니다.
다음 포스팅에서 SwiftUI App의 Life Cycle에 대해 다루겠습니다.
스위프트 하이: 개발자 교양필수 : iOS 앱의 라이프사이클. iOS 앱이 실행 된 후 종료하기까지 거치는 변화. 개발자만이 아니라 기획자 디자이너도 알아야 하는 앱 상식