Files
sodalive-android/docs/prd/20260515_typography_xml_style_prd.md

4.4 KiB

PRD: XML Typography 재사용 스타일 추가

1. Overview

XML 레이아웃 기반 화면에서 재사용할 수 있는 Typography 스타일 리소스를 추가한다.


2. Problem

  • 현재 TextView의 android:fontFamilyandroid:textSize가 XML마다 개별 지정되어 있다.
  • 동일한 크기와 굵기를 반복 지정해 Typography 체계를 일관되게 재사용하기 어렵다.
  • Compose를 사용하지 않는 현재 구조에서는 XML 스타일 리소스로 공통 Typography를 제공해야 한다.

3. Goals

  • Heading1부터 Heading4까지 재사용 가능한 스타일을 제공한다.
  • Body1부터 Body6까지 재사용 가능한 스타일을 제공한다.
  • Caption1부터 Caption3까지 재사용 가능한 스타일을 제공한다.
  • 각 스타일은 요청된 글자 크기와 폰트 굵기만 정의한다.

4. Non-Goals

  • 기존 XML 레이아웃의 개별 fontFamily 또는 textSize를 일괄 교체하지 않는다.
  • Compose Typography 또는 Kotlin 테마 파일을 추가하지 않는다.
  • 색상, 줄간격, 자간, 마진, 패딩 등 요청되지 않은 시각 속성을 추가하지 않는다.

5. Target Users

  • XML 레이아웃을 작성하거나 유지보수하는 Android 개발자.

6. User Stories

  • 개발자는 TextView에 공통 Typography 스타일을 지정해 같은 크기와 굵기를 반복 정의하지 않고 재사용하고 싶다.
  • 개발자는 Heading, Body, Caption 계층을 이름으로 구분해 화면 텍스트 스타일을 일관되게 적용하고 싶다.

7. Core Features

XML Typography Style Resource

app/src/main/res/values/typography.xml에 다음 스타일을 추가한다.

Requirements

  • Heading
    • Typography.Heading1: 24sp, @font/bold
    • Typography.Heading2: 22sp, @font/bold
    • Typography.Heading3: 20sp, @font/bold
    • Typography.Heading4: 18sp, @font/bold
  • Body
    • Typography.Body1: 16sp, @font/bold
    • Typography.Body2: 16sp, @font/medium
    • Typography.Body3: 16sp, @font/regular
    • Typography.Body4: 14sp, @font/bold
    • Typography.Body5: 14sp, @font/medium
    • Typography.Body6: 14sp, @font/regular
  • Caption
    • Typography.Caption1: 12sp, @font/bold
    • Typography.Caption2: 12sp, @font/medium
    • Typography.Caption3: 12sp, @font/regular

Edge Cases

  • 기존 레이아웃에 스타일을 자동 적용하지 않으므로 화면 변화는 발생하지 않는다.
  • 폰트 리소스는 기존 app/src/main/res/fontbold, medium, regular를 사용한다.

8. UX / UI Expectations

  • 새 스타일을 적용한 TextView는 정의된 크기와 폰트 굵기를 사용한다.
  • 기존 화면은 스타일을 명시적으로 교체하기 전까지 변경되지 않는다.

Usage Samples

XML 레이아웃에서는 TextView의 루트 속성에 style을 지정한다. styleandroid: 네임스페이스를 붙이지 않는다.

<TextView
    android:id="@+id/tv_title"
    style="@style/Typography.Heading1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="타이틀" />

기존 프로젝트의 동적 TextView 생성 코드는 textSize 등을 직접 지정하고 있다. Kotlin에서 새 Typography 스타일을 적용해야 할 때는 생성한 TextViewsetTextAppearance()를 사용한다. XML 스타일명 Typography.Body3는 Kotlin R.style에서 Typography_Body3로 참조한다.

val textView = TextView(requireContext()).apply {
    text = "본문"
    setTextAppearance(R.style.Typography_Body3)
}

9. Technical Constraints

  • 현재 프로젝트는 Compose가 아니라 XML 레이아웃 중심이므로 XML style 리소스로 구현한다.
  • 새 스타일은 TextView에서 style="@style/Typography.Body3" 형태로 사용할 수 있어야 한다.
  • Kotlin 코드에서는 R.style.Typography_Body3처럼 점(.) 대신 밑줄(_)로 변환된 리소스 이름을 사용한다.
  • 기존 themes.xml을 비대하게 만들지 않기 위해 Typography 전용 values XML 파일을 사용한다.

10. Metrics

  • Android 리소스 병합 및 디버그 빌드가 성공한다.
  • typography.xml에 요청된 13개 스타일이 모두 존재한다.

11. Open Questions

  • 없음. 현재 요청 범위에서는 기존 XML 교체 없이 스타일 리소스만 추가한다.