면접 질문 목록으로 가기
면접 질문실전 질문꼬리 질문

ViewStub을 활용한 UI 성능 최적화

skydovesJaewoong Eum (skydoves)||7분 소요

ViewStub을 활용한 UI 성능 최적화

ViewStub은 레이아웃 인플레이션(layout inflation)을 명시적으로 필요한 시점까지 지연시키기 위해 사용하는 경량의 보이지 않는 플레이스홀더(placeholder) 뷰입니다. 앱의 생명주기 동안 즉시 필요하지 않거나 아예 사용되지 않을 수 있는 뷰를 인플레이팅하는 데 드는 오버헤드를 줄여 성능을 높여 줍니다. 실무에서 레이아웃이 복잡한 화면일수록 ViewStub의 효과가 두드러지며, 초기 로딩 시간 단축에 직접적으로 기여합니다.

이번 면접 질문을 통하여 아래 내용들을 학습하실 수 있습니다.

  • ViewStub이 무엇이며, 레이아웃 인플레이션을 어떻게 지연시키는지 설명할 수 있습니다.
  • ViewStub이 플레이스홀더에서 인플레이트된 레이아웃으로 전환되는 과정을 이해할 수 있습니다.
  • ViewStub을 활용하여 초기 로드 시간을 줄일 수 있는 주요 사용 사례를 파악할 수 있습니다.
  • ViewStub의 제약 사항과, 대안이 더 적합한 상황을 판단할 수 있습니다.

ViewStub의 핵심 특성

ViewStub은 성능 최적화에 유용한 세 가지 고유한 특성을 지닙니다.

  1. 경량성: ViewStub은 인플레이트되기 전까지 레이아웃 공간을 차지하지 않고, 렌더링 리소스도 소비하지 않기 때문에 메모리 사용량이 극히 적습니다. 시스템은 measure 및 layout 패스에서 ViewStub을 완전히 건너뜁니다. 즉, 화면에 배치되기 전까지는 뷰 계층 구조에서 거의 존재하지 않는 것과 마찬가지입니다.

  2. 지연 인플레이션(Delayed Inflation): ViewStub에 지정된 실제 레이아웃은 inflate() 메서드를 호출하거나, ViewStub의 가시성을 VISIBLE로 설정하여 화면에 표시할 때에만 인플레이트됩니다. 이 덕분에 초기 레이아웃 구성 시점에 불필요한 뷰 생성을 완전히 생략할 수 있습니다.

  3. 일회성 사용: 한 번 인플레이트되면 ViewStub은 뷰 계층 구조에서 인플레이트된 레이아웃으로 대체되며, 재사용할 수 없습니다. ViewStub 객체 자체는 부모에서 제거됩니다. 따라서 동일한 ViewStub을 다시 인플레이트하려고 하면 IllegalStateException이 발생한다는 점에 유의해야 합니다.

주요 사용 사례

ViewStub은 다음 세 가지 시나리오에서 가장 유용합니다.

조건부 레이아웃: 에러 메시지, 빈 상태(empty state) 화면, 프로그레스 인디케이터, 권한 요청 화면 등 런타임 조건에 따라 표시 여부가 결정되는 UI 요소에 적합합니다. 이러한 레이아웃을 미리 인플레이트하면 실제로 표시되지 않을 경우 리소스가 낭비됩니다. 면접에서는 이 부분을 "불필요한 인플레이션 비용 절감"이라는 핵심 포인트로 설명하시면 좋습니다.

초기 로드 시간 단축: 첫 번째 프레임에 필요하지 않은 복잡하거나 리소스를 많이 소비하는 뷰를 ViewStub으로 지연시킬 수 있습니다. 초기 뷰 계층 구조를 작게 유지하여 첫 번째 의미 있는 페인트(first meaningful paint)까지의 시간을 단축할 수 있습니다.

동적 UI 요소: 확장 가능한 섹션이나 상세 패널처럼 사용자의 액션에 따라 나타나는 콘텐츠를, 사용자가 실제로 요청할 때까지 인플레이션을 미룰 수 있습니다. 예를 들어 "더 보기" 버튼을 누를 때 비로소 추가 콘텐츠를 인플레이트하는 방식이 대표적입니다.

구현 방법

XML 레이아웃에서 android:layout 속성으로 인플레이트할 레이아웃 리소스를 지정하여 ViewStub을 정의합니다.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Main Content" />

    <!-- ViewStub: 필요한 시점에 optional_content 레이아웃을 인플레이트 -->
    <ViewStub
        android:id="@+id/viewStub"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout="@layout/optional_content" />
</LinearLayout>

이 면접 질문은 구독자 전용입니다

Dove Letter를 구독하시면 안드로이드, 코틀린 개발 관련 독점 면접 질문의 전체 내용을 볼 수 있습니다.

구독하기
면접 질문 목록으로 가기