IMCAT.DEV
로그인 가입
Swift 중급 프로젝트

Swift 애플리케이션 생명주기

Swift 애플리케이션 생명주기 — 중급

애플리케이션 생명주기

1. 도입 (왜 배워야 하는가)

애플리케이션 생명주기는 iOS 애플리케이션이 시작되고 종료되는 과정에서의 상태 변화를 설명합니다. 이 생명주기를 이해하는 것은 앱이 어떻게 동작하는지를 파악하고, 사용자에게 최적의 경험을 제공하기 위해 필수적입니다. 예를 들어, 사용자가 앱을 열고, 사용 중에 다른 앱으로 전환하고, 다시 돌아올 때 각각의 상황에서 앱이 어떻게 반응해야 하는지를 결정해야 합니다.

이러한 생명주기를 모르면, 앱이 불필요하게 메모리를 소비하거나 사용자가 앱을 종료했을 때 데이터를 잃는 등의 문제가 발생할 수 있습니다. 따라서, 올바른 생명주기 관리는 앱의 성능과 사용자 만족도에 큰 영향을 미칩니다.

2. 핵심 개념 설명

애플리케이션 생명주기는 주로 네 가지 상태로 나눌 수 있습니다:

상태설명
Not Running앱이 실행되지 않는 상태
Inactive앱이 활성화되었지만, 사용자와 상호작용하지 않는 상태
Active앱이 현재 사용자와 상호작용하고 있는 상태
Background앱이 사용자의 눈에 보이지 않지만, 여전히 실행 중인 상태

이 상태를 이해하는 것은 마치 우리의 하루 일과를 관리하는 것과 비슷합니다. 우리는 잠에서 깨어나서 일어나고, 일하는 동안 여러 가지 일을 하며, 저녁에는 휴식을 취합니다. 앱도 이와 유사하게 각 상태에 맞춰 동작해야 합니다.

3. 기본 코드 예제

아래는 애플리케이션 생명주기 메소드를 구현한 간단한 예제입니다.

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func applicationDidFinishLaunching(_ application: UIApplication) {
        print("앱이 실행되었습니다.")
    }

    func applicationWillResignActive(_ application: UIApplication) {
        print("앱이 비활성화됩니다.")
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        print("앱이 백그라운드로 들어갔습니다.")
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        print("앱이 포그라운드로 복귀합니다.")
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        print("앱이 활성화되었습니다.")
    }

    func applicationWillTerminate(_ application: UIApplication) {
        print("앱이 종료됩니다.")
    }
}

실행 결과:

앱이 실행되었습니다.
앱이 비활성화됩니다.
앱이 백그라운드로 들어갔습니다.
앱이 포그라운드로 복귀합니다.
앱이 활성화되었습니다.
앱이 종료됩니다.

코드 한 줄씩 동작 설명:

  1. @UIApplicationMain - 앱의 진입점을 정의합니다.
  2. class AppDelegate: UIResponder, UIApplicationDelegate - 앱의 대표 클래스입니다.
  3. applicationDidFinishLaunching - 앱이 실행된 후 호출됩니다.
  4. applicationWillResignActive - 앱이 비활성화될 때 호출됩니다.
  5. applicationDidEnterBackground - 앱이 백그라운드로 들어갈 때 호출됩니다.
  6. applicationWillEnterForeground - 앱이 포그라운드로 복귀할 때 호출됩니다.
  7. applicationDidBecomeActive - 앱이 활성화될 때 호출됩니다.
  8. applicationWillTerminate - 앱이 종료될 때 호출됩니다.
  9. 4. 실전 활용 예제

    예제 1: 쇼핑몰 앱에서 장바구니 유지

    사용자가 앱을 종료하고 다시 열었을 때 장바구니에 담긴 제품을 유지해야 합니다. 이 때 applicationDidEnterBackground 메소드에서 데이터를 저장하고, applicationDidBecomeActive 메소드에서 데이터를 복원하는 로직을 추가할 수 있습니다.

    func applicationDidEnterBackground(_ application: UIApplication) {
        UserDefaults.standard.set(cartItems, forKey: "savedCart")
        print("장바구니가 저장되었습니다.")
    }
    
    func applicationDidBecomeActive(_ application: UIApplication) {
        if let savedCart = UserDefaults.standard.array(forKey: "savedCart") as? [String] {
            cartItems = savedCart
            print("장바구니가 복원되었습니다.")
        }
    }

    예제 2: 뉴스 앱에서 최신 기사 업데이트

    앱이 백그라운드에 있을 때 최신 뉴스를 다운로드하고, 포그라운드로 돌아올 때 이를 사용자에게 표시하는 로직을 구현할 수 있습니다.

    func applicationDidEnterBackground(_ application: UIApplication) {
        fetchLatestArticles()
    }
    
    func applicationDidBecomeActive(_ application: UIApplication) {
        updateUIWithLatestArticles()
    }

    5. 흔한 실수와 주의사항

    실수 1: 상태 변화에 대한 무관심

    • 잘못된 코드: 생명주기 메소드를 전혀 구현하지 않음.
    • 올바른 코드: 각 메소드에 적절한 로직을 추가하여 상태 변화에 응답.
    • 실수 2: 데이터 저장 실패

    • 잘못된 코드: 앱 종료 시 데이터를 저장하지 않음.
    • 올바른 코드: applicationDidEnterBackground 메소드에서 필수 데이터를 저장.
    • 6. 정리

    • 애플리케이션 생명주기는 앱의 상태 변화를 이해하는 데 필수적입니다.
    • 다양한 상태(비활성화, 백그라운드 등)에 따라 적절한 로직을 구현해야 합니다.
    • 사용자 경험을 향상시키기 위해 데이터를 저장하고 복원하는 방법을 아는 것이 중요합니다.

다음에 학습하면 좋은 주제는 비동기 프로그래밍 및 데이터 저장입니다. 이를 통해 사용자와의 상호작용을 더욱 매끄럽게 만들 수 있습니다.