UIKit Architecture Guide

container view controller 기본 개념

container view controller는 "여러 child VC를 조합해 하나의 화면 흐름을 운영"하는 부모 컨트롤러다. 핵심은 화면 분할이 아니라 책임 분리와 lifecycle 전달 계약을 정확히 지키는 것이다.

Parent-child composition Lifecycle forwarding Knowledge item #25
학습 날짜

기록 없음

container VC가 필요한 이유

대표 예시

컨테이너역할child 관리 방식
`UINavigationController` 스택 기반 push/pop 흐름 관리 top VC 중심으로 생명주기/전환 이벤트 전달
`UITabBarController` 탭별 독립 흐름 전환 선택된 child만 active로 운용
`UIPageViewController` 페이지 스와이프 전환 현재/인접 child를 컨텍스트로 유지
Custom Container 앱 요구사항 맞춤 조합 개발자가 containment 계약을 직접 구현

Containment 계약 (필수 순서)

func attach(child: UIViewController, into containerView: UIView) {
    addChild(child)                      // 1) parent-child 관계 등록
    containerView.addSubview(child.view) // 2) child.view 계층 편입
    child.view.frame = containerView.bounds
    child.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    child.didMove(toParent: self)       // 3) 편입 완료 통지
}

func detach(child: UIViewController) {
    child.willMove(toParent: nil)       // 1) 분리 예정 통지
    child.view.removeFromSuperview()    // 2) view 계층에서 제거
    child.removeFromParent()            // 3) parent-child 관계 해제
}
이 순서를 틀리면 lifecycle 전달 누락, appearance callback 비정상, 메모리 해제 누락이 발생하기 쉽다.

난이도 높은 설명 1: ownership 관점

container는 "화면 주도권 ownership"을 child들에게 분배한다. 예를 들어 탭 전환 시 기존 child는 ownership을 잃고, 새 child가 획득한다. 이때 container가 전환 타이밍과 상태 일관성을 보장한다.

난이도 높은 설명 2: 상태 경계

child가 직접 전역 상태를 만지기 시작하면 container 존재 의미가 약해진다. 전환 정책/선택 상태/조합 규칙은 parent(container)에 두고, child는 "자기 화면 로직"에 집중해야 유지보수성이 오른다.

난이도 높은 설명 3: appearance forwarding 함정

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("[Container] willAppear")
}

// child 쪽에서도 동일 패턴으로 로그
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    print("[ChildA] willAppear")
}

실무 체크리스트

  • add/remove 순서를 UIKit 계약대로 지켰는가?
  • container 책임(전환/선택/조합)과 child 책임(화면 로직)이 분리됐는가?
  • child 교체 시 기존 child 정리(관찰/작업 취소/메모리 해제)가 되는가?
  • 디버깅 시 parent/child lifecycle 로그를 동시에 확인하는가?

한 줄 결론

container VC는 화면 조립기가 아니라 lifecycle 계약 관리자다.

Q

이 섹션은 위에서 나온 질문뿐 아니라, 새로운 개발적 지식과 시니어라면 알아야 할 내용까지 추가한다.