Skip to content

feat: 목표 템플릿 기반 반다라트 빠른 생성 #208

Description

@easyhooon

배경

현재 반다라트 한 개는 총 25칸으로 구성된다.

  • 메인 목표 1개
  • 서브 목표 4개
  • 각 서브 목표별 태스크 5개, 총 20개

빈 표를 만든 사용자가 25칸을 모두 직접 작성해야 하므로 첫 사용과 새 목표 설정의 입력 부담이 크다. 목표 유형별로 미리 작성된 템플릿을 제공해 사용자는 내용을 처음부터 고민하는 대신 자신에게 맞게 수정하는 데 집중할 수 있도록 한다.

기존의 빈 표 생성 방식은 직접 만들기로 계속 제공하며, 템플릿으로 만든 표도 생성 후 모든 칸을 자유롭게 수정할 수 있어야 한다.

제품 목표

  • 사용자가 새 반다라트의 25칸을 빠르게 채울 수 있다.
  • 템플릿은 완성된 정답이 아니라 수정 가능한 시작점으로 제공한다.
  • 기존 커스텀 생성 flow를 제거하거나 불리하게 만들지 않는다.
  • 앱 업데이트 없이 템플릿을 확장할 필요가 생기기 전까지는 로컬 정적 데이터로 단순하게 운영한다.

권장 UX

진입 flow

  1. 사용자가 반다라트 목록의 + 추가를 누른다.
  2. 생성 방법을 고르는 작은 bottom sheet/dialog를 표시한다.
    • 템플릿으로 시작
    • 직접 만들기
  3. 직접 만들기는 기존 빈 반다라트 생성 flow를 실행한다.
  4. 템플릿으로 시작은 별도의 Circuit 템플릿 선택 화면으로 이동한다.

기존 반다라트 변경 bottom sheet 안에 25칸 미리보기와 선택 flow를 모두 넣으면 정보 밀도가 높아지고 중첩 modal이 발생할 수 있으므로, v1은 별도 화면을 권장한다. 생성 방법 선택까지만 기존 bottom sheet의 스타일을 재사용한다.

템플릿 선택 화면

  • 상단: 제목 어떤 목표를 이루고 싶나요?와 뒤로가기
  • 카테고리 필터 또는 가로 chip
  • 템플릿 목록 item
    • 목표를 나타내는 이모지 아이콘
    • 템플릿 이름
    • 한 줄 설명
    • 대표 서브 목표 4개 요약
  • item 선택 시 선택 상태를 반다라트 디자인 시스템 색상으로 명확히 표시
  • 하단 고정 Primary action: 이 템플릿으로 만들기
  • 선택하지 않은 상태에서는 Primary action 비활성화

25칸 전체 텍스트를 목록 카드 안에 표시하면 읽기 어려우므로, item 선택 시 상세/미리보기 영역에서 다음을 확인할 수 있게 한다.

  • 메인 목표 1개
  • 서브 목표 4개
  • 서브별 태스크 5개

상세 UI는 5x5 축소 표보다는 서브 목표별 접기/펼치기 목록을 우선 검토한다. 실제 디자인 시 5x5 미니 프리뷰와 가독성을 비교한다.

생성 이후

  • 선택한 템플릿의 25칸을 새 반다라트로 복사한다.
  • 새 표로 이동한 뒤 일반 표와 똑같이 제목, 설명, 아이콘, 색상, 마감일과 각 셀을 수정할 수 있다.
  • 템플릿 원본과 생성된 표는 연결하지 않는다. 이후 템플릿이 변경되어도 기존 사용자 표는 변경되지 않는다.
  • 완료 여부는 모두 false, 마감일은 기본적으로 미설정으로 생성한다.

초기 템플릿 후보

v1은 품질을 검수할 수 있는 5~6개로 시작한다.

카테고리 템플릿 예시 아이콘 예시 서브 목표 예시
건강 건강한 다이어트 🥗 식단, 운동, 수면·회복, 기록·습관
운동 꾸준한 운동 습관 🏃 근력, 유산소, 유연성, 회복
학습 자격증 합격 📝 학습 계획, 이론, 문제 풀이, 실전 대비
커리어 취업 준비 💼 역량 정리, 서류, 포트폴리오, 면접
언어 외국어 실력 향상 🗣️ 어휘, 듣기, 읽기, 말하기·쓰기
재정 저축 습관 만들기 💰 예산, 지출 관리, 저축, 월간 점검

각 템플릿의 실제 20개 태스크 문구는 구현 전에 별도 콘텐츠 검수표로 확정한다. 건강·다이어트 템플릿은 의료적 효과나 특정 체중 감량을 보장하는 표현을 사용하지 않는다.

데이터 모델

예시 구조:

data class BandalartTemplate(
    val id: String,
    val version: Int,
    val category: TemplateCategory,
    val title: String,
    val description: String,
    val profileEmoji: String,
    val mainColor: String,
    val subColor: String,
    val mainGoal: TemplateCell,
    val subGoals: List<TemplateSubGoal>,
)

data class TemplateSubGoal(
    val cell: TemplateCell,
    val tasks: List<TemplateCell>,
)

검증 조건:

  • subGoals.size == 4
  • tasks.size == 5
  • 템플릿 ID는 앱 버전 사이에서 안정적으로 유지
  • UI 및 domain model에 Android Context나 Compose resource 타입을 직접 보관하지 않음

초기에는 commonMain의 정적 catalog로 제공한다. 서버 동기화, 원격 추천, 사용자 제작 템플릿은 v1 범위에서 제외한다.

저장 및 생성 구현

  • 기존 createEmptyBandalart()와 별도로 repository에 템플릿 생성 use case를 제공한다.
  • Room transaction 안에서 반다라트, 메인 셀, 서브 셀 4개, 태스크 셀 20개를 원자적으로 삽입한다.
  • 부모 셀 ID가 생성된 뒤 자식 셀에 정확히 연결되도록 한다.
  • 일부 insert 실패 시 25칸이 불완전하게 남지 않도록 전체 transaction을 rollback한다.
  • 생성 완료 후 새 bandalart ID를 반환해 홈에서 해당 표를 바로 선택한다.
  • 템플릿 원본 객체를 Room entity로 직접 사용하지 않고 생성 시점에 새 entity로 복사한다.

AdMob 생성 정책과의 결합

관련 이슈: #206

광고 적용 여부는 보유 개수나 무료 quota가 아니라 사용자가 새 반다라트 생성을 확정하는 시점에 검사한다.

  • 최초 진입 시 앱이 자동 생성하는 기본 반다라트: 광고 없이 생성
  • 직접 만들기: 생성 확정 → 광고 안내 → 보상 완료 → 빈 표 생성
  • 이 템플릿으로 만들기: 템플릿 선택 완료 → 광고 안내 → 보상 완료 → 선택 템플릿 생성

사용자가 템플릿을 고르기 전에 광고부터 보게 하지 않는다. 광고 완료 후에는 선택했던 템플릿 ID를 복원해 정확히 한 번 생성한다. 사용자가 + 추가로 다시 생성할 때마다 동일한 Rewarded Ad gate를 적용한다.

접근성·다국어·디자인

  • 아이콘만으로 카테고리를 구분하지 않고 이름을 함께 표시한다.
  • 선택 상태를 색상에만 의존하지 않고 border/check 표시로 구분한다.
  • 다크 모드에서 카드, 선택 border, 하단 CTA 대비를 검증한다.
  • 모든 텍스트에 Pretendard와 기존 반다라트 typography를 적용한다.
  • 초기 콘텐츠는 한국어로 제공하되 catalog 구조는 locale별 텍스트를 추가할 수 있게 한다.
  • 템플릿 아이콘은 기존 profileEmoji 표현과 호환되는 이모지를 우선 사용한다.

테스트 항목

  • 직접 만들기가 기존과 동일하게 빈 25칸을 생성
  • 각 템플릿이 메인 1 + 서브 4 + 태스크 20 구조인지 검증
  • 템플릿 생성 transaction 성공 시 25개 셀이 정확한 parent ID로 저장
  • 생성 실패 시 불완전한 표가 남지 않음
  • 생성된 표를 수정해도 템플릿 catalog와 다른 사용자 표에 영향 없음
  • 선택 없이 생성 버튼을 누를 수 없음
  • 화면 복귀·회전 시 선택한 템플릿 유지
  • 중복 탭 및 광고 callback 중복에도 표가 한 개만 생성
  • 기존 Room 데이터 및 빈 표 생성 flow 회귀 없음
  • 라이트/다크 모드, 작은 화면, 긴 템플릿 문구 확인

단계별 작업

1. 콘텐츠·디자인

  • 초기 카테고리 및 5~6개 템플릿의 25칸 문구 확정
  • 생성 방법 선택 UI 설계
  • 템플릿 목록, 선택, 상세 미리보기 화면 설계
  • 반다라트 디자인 시스템 및 다크 모드 대조

2. 템플릿 도메인·데이터

  • template/category 모델과 validation 추가
  • 로컬 template catalog 추가
  • repository/use case 및 Room transaction 구현
  • catalog와 transaction 단위 테스트 추가

3. Circuit 화면·생성 연결

  • 템플릿 선택 Screen/Presenter/UI 추가
  • 기존 + 추가에 생성 방법 선택 flow 연결
  • 템플릿 선택 유지와 정확히 한 번 생성 처리
  • 생성 후 새 반다라트로 이동

4. 광고 정책 연동 및 출시

  • #206의 매 추가 Rewarded Ad gate와 두 생성 방식을 공통 연결
  • Internal Testing에서 직접/템플릿/광고 생성 조합 검증
  • 사용자가 개인 목표 내용을 노출하지 않는 범위에서 템플릿 선택·생성 성공률 측정 검토

v1 제외 범위

  • 서버에서 템플릿 다운로드 또는 실시간 갱신
  • AI가 목표를 자동 생성하는 기능
  • 사용자가 만든 템플릿 공유·마켓
  • 기존 표에 템플릿을 덮어쓰기
  • 템플릿 원본 변경 시 기존 표 자동 업데이트

완료 조건

  • 사용자가 직접 만들기템플릿으로 시작 중 하나를 선택할 수 있다.
  • 템플릿 목록에서 아이콘·설명·내용을 확인하고 선택할 수 있다.
  • 선택한 템플릿의 25칸이 새 표에 정확히 생성된다.
  • 생성된 모든 칸은 기존과 동일하게 편집 가능하다.
  • 기존 빈 표 생성과 저장 데이터에 회귀가 없다.
  • #206과 결합했을 때 광고를 보기 전에 템플릿을 선택하고, 보상 완료 후 정확히 한 번 생성된다.

Metadata

Metadata

Assignees

Labels

designtasks related to design aspects of the projectfeaturetasks related to feature development

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions