앱 생명주기(App Lifecycle) vs 뷰 컨트롤러 생명주기(ViewController Lifecycle) in iOS

iOS 앱 생명주기와 뷰 컨트롤러 생명주기 이해하기

Young Kim
스위프트 프로그래밍
6 min readApr 5, 2016

--

본문은 스스로의 이해를 돕기위해 정리한 글입니다. 따라서 부분적으로 잘못 된 부분이 있을 수 있습니다. 지적이 나오면 잘못된 부분을 수정하여 업데이트 하겠습니다. 어렵지 않은 개념이지만 도움이 됬으면 좋겠습니다. 이번 포스트는 많은 부분 “꼼꼼한 재은씨의 스위프트2 프로그래밍”를 참고하였습니다.

앱 생명주기(App Lifecycle)

앱 생명주기는 홈버튼을 눌렀을때, 전화가 왔을때와 같이 앱이 화면상에서 보이지 않는 background 상태, 화면에 올라와 있는 상태인 foreground 등과 같은 상태들을 정의한 것 입니다. 제대로된 앱을 만들기 위해서는 다양한 상황에서도 적절하게 대응해야 하기때문에 앱 생명주기를 이해하는것은 중요합니다. 앱의 생명주기에 대해 이해하기 위해서는 먼저 iOS 앱이 시작할 때 일어나는 일들에 대해서 짧게나마 이해 할 필요가 있습니다. Swift와 Objective-c의 방식에는 조금 차이가 있지만 저는 Swift를 기준으로 설명 드리겠습니다. Swift에서 앱 아이콘을 눌러 앱을 실행시키면 아래와 같은 일들이 일어납니다.

  • UIApplication 객체를 생성
  • @UIApplicationMain 어노테이션이 있는 클래스를 찾아 AppDelegate 객체를 생성
  • Main Event Loop를 실행(touch, text input등 유저의 액션을 받는 루프) 및 기타 설정

각각에 대해서 설명을 하자면 UIApplication 객체는 싱글톤 객체(앱 전체에 하나만 존재)이며 Event Loop에서 발생하는 여러 이벤트들을 감지하고 Delegate에 전달하는 역할을 합니다. 예를 들면 앱이 백그라운드로 갈때, 메모리 부족 경고를 할 때와 같은 상황들을 감지하여 Delegate에 전달합니다.
AppDelegate 객체는 UIApplication 객체로 부터 메시지를 받았을 때, 해당 상황에서 실행 될 함수들을 정의합니다. Xcode로 Swift 프로젝트를 만들면 자동으로 생성되는 AppDelegate.swift 파일이 있는데 이 파일이 AppDelegate 객체가 됩니다. 왜냐하면 AppDelegate.swift 파일을 열어보면 클래스 선언부에 @UIApplicationMain 어노테이션이 붙어 있는걸 볼 수 있습니다. 즉 앱이 구동되면 AppDelegate.swift의 AppDelegate 클래스를 델리게이트 객체로 지정합니다. AppDelegate.swift 파일에는 앱의 상태에 따라 실행되는 함수들이 정의되어 있습니다. 정의된 함수들을 보기에 앞서 앱의 실행 상태는 5개 상태로 구분 될 수 있고 아래와 같습니다.

Not Running: 앱이 실행되지 않은 상태
(Inactive와 Active 상태를 합쳐서 Foreground 라고 함)
Inactive: 앱이 실행중인 상태 그러나 아무런 이벤트를 받지 않는 상태
Active: 앱이 실행중이며 이벤트가 발생한 상태
Background: 앱이 백그라운드에 있는 상태 그러나 실행되는 코드가 있는 상태
Suspened: 앱이 백그라운드에 있고 실행되는 코드가 없는 상태

AppDelegate.swift에는 아래와 같이 앱의 상태에 따라 실행되는 delegate 함수들이 정의되어 있기때문에 함수안에 코드를 작성 함으로써 앱의 특정 상태에서 동작하는 로직을 구현 할 수 있습니다.

application(_:didFinishLaunching:) - 앱이 처음 시작될 때 실행applicationWillResignActive: - 앱이 active 에서 inactive로 이동될 때 실행 applicationDidEnterBackground: - 앱이 background 상태일 때 실행 applicationWillEnterForeground: - 앱이 background에서 foreground로 이동 될때 실행 (아직 foreground에서 실행중이진 않음)applicationDidBecomeActive: - 앱이 active상태가 되어 실행 중일 때applicationWillTerminate: - 앱이 종료될 때 실행

위의 함수를 모두 구현 할 필요는 없고 상황에 맞춰 필요한 함수만 구현하여도 됩니다. 혹은 위 함수들에는 없지만 원하는 delegate를 추가할 수 도 있습니다.

뷰 컨트롤러 생명주기(ViewController Lifecycle)

모바일 앱은 화면의 크기가 작아서 PC와 달리 하나의 화면에 하나의 ViewController만을 가집니다. 그리고 여러개의 ViewController가 모여 하나의 앱을 만듭니다. iOS 에서는 한 화면에서 다른 화면으로 전환할 때 기존의 화면위에 새로운 화면이 쌓이는 식으로 화면을 전환 합니다. 이 때 각각의 뷰 컨트롤러는 자신만의 생명주기를 가지고 있고 이 생명주기를 잘 이해하고 있다면 뷰 컨트롤러의 상황에 따라 원하는 로직을 수행하도록 만들 수 있습니다. 아래는 ViewController의 생명주기를 그림으로 나타낸 것입니다.

ViewController 생명주기

여러개의 뷰 컨트롤러가 있는 앱이라고 한다면 각각의 뷰 컨트롤러는 자신만의 생명주기를 가집니다. 그래서 화면상에 등장 할 때, 사라질 때 등 상황에 맞춰서 함수들이 호출됩니다. 뷰 컨트롤러 생명주기의 대표적인 함수들은 아래와 같습니다.

ViewDidLoad - 해당 뷰컨트롤러 클래스가 생성될 때(ViewWillAppear전에 실행) 실행됩니다. Low memory와같은 특별한 경우가 아니라면 딱 한번만 실행되기 때문에 초기화 할 때 사용 할 수 있습니다.
ViewWillAppear - 뷰 컨트롤러가 화면에 나타나기 직전에 실행됩니다. 뷰 컨트롤러가 나타나기 직전에 항상 실행되기 때문에 해당 뷰 컨트롤러가 나타나기 직전마다 일어나는 작업들을 여기에 배치 시킬 수 있습니다.
ViewDidAppear - 뷰 컨트롤러가 화면에 나타난 직후에 실행됩니다. 화면에 적용될 애니메이션을 그리거나 API로 부터 정보를 받아와 화면을 업데이트 할 때 이곳에 로직을 위치시키면 좋습니다. 왜냐하면 지나치게 빨리 애니메이션을 그리거나 API에서 정보를 받아와 뷰 컨트롤러를 업데이트 할 경우 화면에 반영되지 않습니다.
ViewWill/DidDisappear - 뷰 컨트롤러가 화면에 나타난 직전/직후에 실행됩니다.

이렇게 앱 생명주기와 뷰 컨트롤러 생명주기를 간단하게 정리해볼 수 있습니다. 추후에는 좀더 구체적으로 어떤 상황에서 앱 생명주기와 뷰 컨트롤러 생명주기를 활용 할 수 있는지와 어떤 방식으로 코딩해야 하는지 예제와 함께 포스팅 해보겠습니다.

--

--

Young Kim
스위프트 프로그래밍

Startup, 운동, 영화 그리고 프로그래밍에 관심이 많은 학생입니다.