자기 성찰 타로 상담 앱 실행 로드맵 (MVP 기준, AI 적용준비 포함)

1) 제품 방향
- 제품 한 줄 정의: 예언이 아니라, 사용자의 감정과 생각을 비추는 자기 성찰형 타로 상담 앱
- 앱 목표: 카드 해석, 상담형 질문, 저널 기록, 치유 메시지를 통해 감정 탐색과 정서적 안정을 돕는다.
- 핵심 사용자: 감정 정리가 필요한 사용자, 가벼운 셀프 상담을 원하는 사용자, 타로를 심리적 도구로 쓰고 싶은 사용자
- 핵심 가치: 자기 성찰, 정서적 안정, 기록 습관, 감정 탐색, 치유 경험
2) MVP 범위 (필수)
- 랜덤 카드 추출 (공정한 무작위 셔플)
- 스프레드: 1장 / 3장 우선 구현
- 해석 엔진: 카드 의미 + 사용자 질문 맥락 기반 상담 메시지 생성
- 저널링: 상담 내용 저장/조회, 회고 기록
- 세션 종료 치유 콘텐츠: 긍정 확언(Affirmation), 명상/호흡 메시지
3) 사용자 경험 흐름
- 홈에서 오늘의 질문 선택
- 스프레드 선택 후 카드 추출
- 카드 해석 + 공감형 상담 메시지 확인
- 후속 질문에 사용자 응답 입력
- 저널 저장
- 확언/명상 메시지 확인 후 세션 종료
4) 기능 설계 요약
4-1. 콘텐츠/데이터
- 카드 정보: 카드명, 키워드, 정/역방향 의미, 확언, 명상 문구
- 저널 정보: 질문, 선택 카드, 해석 요약, 상담 메시지, 사용자 회고, 감정 태그, 생성 시각
4-2. 해석 엔진 원칙
- 입력: 사용자 질문 + 선택 카드 + 모드(개인용/상담 모드)
- 처리: 카드 의미 추출 -> 질문 맥락 분류 -> 조합 해석 -> 상담 메시지 -> 후속 질문 생성
- 출력: 해석 결과, 후속 질문, 확언 문구
- 중요 가이드: 미래 예언형 문장 금지, 감정 탐색/자기 이해 중심 어조 유지
4-3. UI/UX
- 기본 플로우: 카드 뽑기 -> 해석 -> 상담 질문 -> 기록 -> 치유 메시지
- 화면 후보: Home, DrawCard, Reading, Counseling, Journal, Meditation
- 디자인 방향: 안정감 있는 색감, 부드러운 애니메이션, 공감형 문구 중심
5) 기술/구조 계획
- 기술 스택: Kotlin, Jetpack Compose, Coroutines, Navigation
- 로컬 데이터: Room 기반 카드/저널 저장
- DI: Hilt 도입 검토(MVP 초기에는 단순 구조 우선, 복잡도 증가 시 적용)
- 아키텍처: 현재 단순 Compose 구조 유지, 이후 Presentation/Domain/Data 레이어로 점진 분리
6) 비기능 요구사항
- 오프라인에서도 카드 조회/저널 저장 동작
- 첫 화면 진입 속도 목표: 2초 내
- 문구 품질: 비판적 표현 없이 중립적/공감적 톤 유지
- UX 품질: 불안 조장 표현 지양, 안정감 있는 경험 유지
7) 8주 실행 일정(초안)
- 1주차: 기획 확정, 와이어프레임, DB 스키마 정의
- 2주차: Navigation/데이터 계층 기초, Room 세팅
- 3주차: 카드 셔플/추출 + 1장/3장 스프레드
- 4주차: 해석 화면 + 해석 엔진 1차 연결
- 5주차: 상담 질문 흐름 + 사용자 입력 UI
- 6주차: 저널 저장/조회 + 확언/명상 화면
- 7주차: 디자인 보정, 문구 튜닝, QA
- 8주차: MVP 배포 및 베타 피드백 수집
8) 출시 후 확장 백로그
- 스프레드 확장: 5장, 켈틱 크로스
- 감정 태그 기반 개인화 리포트
- AI 기반 맞춤형 상담 강화
- 커뮤니티 기능(경험 공유)
- 전문가/상담가 연계 세션
9) 핵심 메시지
"예언이 아닌, 마음을 비추는 거울"
10) 현재 구현 상태 점검 (코드 기준, 2026-03-16)
- 홈 화면 기본 구성(브랜드/히어로/메뉴/상단 앱바) 구현
-
Home -> ReadingList -> ReadingDetailNavigation 기본 흐름 구현 - 앱 시작 시
raw/hanbok_prompt.txt기반 Room 초기 적재 구현 -
raw/tarot_app_cards_ko.json기반 카드 한글명/키워드/의미 보강 로직 구현 - 리딩 목록에서 카드 이미지 + 한글 프롬프트 요약 + 상세 이동 구현
- 리딩 상세에서 한글/영문 프롬프트, 키워드, 의미 전체 스크롤 조회 구현
- 스프레드 선택(1장/3장) 전용 화면/상태 모델 고정
- 카드 드로우(중복 없는 랜덤 선택) 세션 플로우 구현
- 상담 입력(Counseling) 화면 및 후속 질문 플로우 구현
- Journal Entity/DAO/저장-목록-상세 흐름 구현
- 세션 종료용 확언/명상(Meditation) 화면 구현
11) Home 이후 실행 체크리스트 (우선순위 + DoD)
P0 (이번 스프린트 필수)
- 스프레드 선택 흐름 고정 (
1장,3장) - 카드 추출(셔플/중복 없는 랜덤 선택) 완료
- 리딩 결과 화면에서 선택 카드 + 질문 + 해석 요약 표시
- 홈 -> 스프레드 -> 드로우 -> 리딩 단일 플로우 완성
완료 기준(DoD)
- 홈에서 시작해 리딩 결과까지 한 번에 이동 가능
- 시스템 뒤로가기 시 흐름이 깨지지 않음
P1 (P0 직후)
- 상담 질문 1~2개 입력 화면 연결
- 세션 결과를 Journal로 저장
- Journal 목록/상세 조회 연결
- 상세 화면에서 한글 데이터/카드 이미지/본문 전체 확인 가능
완료 기준(DoD)
- 리딩 -> 상담 입력 -> 저널 저장 -> 목록/상세 조회까지 끊김 없음
P2 (품질/마무리)
- 세션 종료용 확언/명상 화면 연결
- 빈 상태/오류 상태 문구 정리
- 오탈자/한국어 톤(자연스러운 번역) 최종 점검
- 릴리즈 전 QA 체크리스트 정리
12) 2주 스프린트 실행안
Week 1: 핵심 플로우 고정
- Route/인자 규칙 확정 (
spreadType,sessionId) - Draw + Reading 구현 마무리
- ViewModel 세션 상태(
spreadType,selectedCardIds,userQuestion) 고정 - 더미 문구 제거 및 실제 데이터 연결
반영 메모 (2026-03-17)
Reading요약이 카드 DB의keywords/meanings/ 사용자 질문을 기반으로 생성되도록 연결Meditation마무리 문구와 확언이 선택 카드/감정 태그 기반 파생 문구를 사용하도록 전환- 홈
최근 기록카드가 날짜/감정 태그뿐 아니라 실제 질문/요약/선택 카드명을 노출하도록 보강
Week 2: 세션 완결 + QA
- Counseling 입력 흐름 연결
- Journal 저장/목록/상세 완성
- Meditation(확언/명상) 종료 화면 연결
- 리소스 매핑/오류 처리/빈 상태/문구 톤 최종 점검
13) 오늘 바로 시작할 작업 (1 -> 2 순서)
- Route/인자 표 확정
- Draw/Reading 상태 모델 고정
- 리딩 결과 화면 최소 스펙(카드/요약/다음 액션) 잠금
- Journal 저장 스키마 + DAO 쿼리 확정
13-1) Route/인자 표 확정
- 목표: Navigation 계약을 먼저 고정해 화면 연결 재작업을 줄인다.
- 세부 작업
- 라우트 후보 확정:
Home,SpreadSelect,Draw,Reading,Counseling,JournalList,JournalDetail,Meditation - 인자 분류: 필수/선택/없음 (
spreadType,sessionId,journalId) - 뒤로가기/딥링크 대응 기준 정리
- 라우트 후보 확정:
- 산출물: Route/인자 표 v1 +
TarotNavRoutes반영 기준 - 완료 기준(DoD): 모든 화면의 인자 규칙이 문서와 코드에서 동일
- 예상 소요: 1.5 ~ 2시간
| route | 인자 | 타입 | 필수 | 예시 |
|---|---|---|---|---|
home |
- | - | - | home |
draw/{spreadType} |
spreadType |
String | Y | draw/three_card |
reading/{sessionId} |
sessionId |
Long | Y | reading/1710572400000 |
counseling/{sessionId} |
sessionId |
Long | Y | counseling/1710572400000 |
journal/detail/{journalId} |
journalId |
Long | Y | journal/detail/42 |
meditation?sessionId={sessionId} |
sessionId |
Long | N | meditation?sessionId=1710572400000 |
13-2) Draw/Reading 상태 모델 고정
- 목표: ViewModel 단일 상태원천(SSOT)으로 Draw와 Reading을 일관되게 연결한다.
- 세부 작업
-
TarotViewModel에 세션 상태 필드 정의 - 이벤트 목록 확정 (
onSpreadSelected,onQuestionChanged,drawCards,clearSession) - UI 로컬 상태와 ViewModel 상태 경계 명시
-
- 산출물: SessionState 필드 표 v1 + 이벤트 계약
- 완료 기준(DoD): Draw/Reading이 동일 상태 모델을 참조하고 상태 전달이 끊기지 않음
- 예상 소요: 2 ~ 3시간
| 필드명 | 타입 | 용도 | 갱신 시점 |
|---|---|---|---|
sessionId |
Long? | 세션 식별자 | 스프레드 시작 시 생성 |
spreadType |
String | one_card/three_card 구분 |
스프레드 선택 시 |
userQuestion |
String | 사용자 질문 원문 | 홈/상담 입력 시 |
selectedCardIds |
List | 중복 없는 카드 번호 | Draw 완료 시 |
readingSummary |
String | 리딩 요약 | Reading 계산 후 |
nextAction |
String | 다음 CTA 분기 | Reading 진입 시 |
isLoading |
Boolean | 로딩 상태 | Draw/저장 중 |
errorMessage |
String? | 에러 노출 | 실패 시 |
13-3) 리딩 결과 화면 최소 스펙 잠금
- 목표: P0 범위를 고정해 과도한 화면 확장을 방지한다.
- 세부 작업
- 필수 UI 3요소 고정: 선택 카드 썸네일, 요약 텍스트(2
4줄), 다음 액션 버튼(12개) - P1 이관 항목 분리: 심화 해석/부가 텍스트
- 빈 상태/오류 상태 문구 확정
- 필수 UI 3요소 고정: 선택 카드 썸네일, 요약 텍스트(2
- 산출물: Reading 최소 스펙 체크리스트
- 완료 기준(DoD): 리딩 진입 시 필수 3요소가 항상 보이고 다음 화면 이동이 일관됨
- 예상 소요: 1.5 ~ 2.5시간
13-4) Journal 저장 스키마 + DAO 쿼리 확정
- 목표: 세션 저장/조회의 DB 계약을 먼저 고정한다.
- 세부 작업
-
JournalEntity필드 확정 (질문, 카드목록, 요약, 상담응답, 감정태그, 생성시각) -
JournalDao최소 쿼리 확정 (insert, list, detail, recent) -
TarotDatabase버전 업 및 마이그레이션 정책 결정
-
- 산출물: JournalEntity/JournalDao 설계표 v1
- 완료 기준(DoD): 저장 1건/목록 조회/상세 조회를 커버하는 쿼리 셋 정의 완료
- 예상 소요: 2 ~ 3시간
추가 반영 메모 (2026-03-17)
TarotRepositoryDataSource도입으로TarotViewModelJVM 단위 테스트 가능 구조로 정리MainDispatcherRule,TarotViewModelTest추가로 리딩 요약 생성 / Journal 저장 회귀 검증 자동화JournalDaoTest추가로 최신순 목록 / 상세 조회 / DB 재오픈 후 데이터 유지 검증MIGRATION_4_5명시적 Room 마이그레이션 추가- DB 정책:
4 -> 5는 비파괴 마이그레이션 적용,1~3구버전은 destructive fallback 유지
14) QA 체크리스트 문서
- MVP QA 체크리스트 작성:
documents/qa_checklist_mvp.md
15) QA/테스트/마이그레이션 진행 상태 (2026-03-17)
-
TarotViewModel최소 회귀 테스트 추가 -
JournalDao저장/조회/재오픈 테스트 추가 -
TarotDatabase 4 -> 5마이그레이션 정책 코드 반영 및 테스트 추가 - 시스템 뒤로가기 동작을
BackHandler로 세션/저널/프롬프트 화면에 명시적 반영 - 명상/확언 문구 톤을 차분한 반성형 문장으로 보강하고 테스트 추가
- 기본 테마를
medium contrast색상표와surfaceContainer*계열 배경으로 조정해 다크/라이트 대비 보강
16) 코드 품질 정리 (2026-03-17)
-
JournalScreens.ktCardDetailBlock: 영문 카드명 중복 표시 버그 수정 →cardNameKo우선 주 타이틀, 영문명은 부제목으로 분리 -
TarotSummaryScreen.kt: 홈 화면 Journal 직접 이동 버튼 복원 (EditNote아이콘, 3 Card Spread 아래 배치) -
TarotSessionFlowScreens.kt: 미사용SimpleTodoScreen제거 -
TarotReadingScreens.kt: 미사용 privateDetailCard제거 -
TarotViewModel.kt: 미사용 publicobserveJournalDetail/clearSessionError제거 -
TarotViewModel.ktbuildReadingSummary: 카드명을cardNameKo우선 사용으로 리딩 요약 문구 한국어화
17) 온디바이스 AI Edge/MediaPipe LLM 적용 계획 (2026-03-20)
17-1) 요구사항 체크리스트 (사용자 요청 5개)
-
- Google AI Edge / MediaPipe LLM 적용
-
- 사용자가 입력한 오늘의 질문 이해(의도/주제 파악)
-
- 질문과 카드
keywords/meanings연관도 기반 카드 선택
- 질문과 카드
-
- 선택 카드 해석 메시지 생성
-
- 리딩 종료 후 선택 카드
meanings기반 확언 문장 생성
- 리딩 종료 후 선택 카드
17-2) 단계별 실행 (준비 -> 설계 -> 구현 -> 검증 -> 배포)
- 준비
- AI Edge/MediaPipe LLM 의존성/ABI/최소 기기 제약 확인
MainActivityIMMEDIATE 업데이트 플로우와 AI 초기화 순서 충돌 방지 정책 확정
- 설계
ai패키지에 엔진 인터페이스(TarotAiService) + 폴백 엔진 정의- 질문 분석 -> 카드 점수화 -> 해석 생성 -> 확언 생성 파이프라인 설계
- 구현
TarotViewModel.drawCards()에 질문 기반 카드 선택 적용- 리딩 요약/해석 메시지를 AI 서비스 출력으로 전환
- 명상 마무리 화면 확언을 AI 생성 결과 우선 사용
- 검증
- JVM 테스트: 질문-카드 매칭, 해석 문구, 확언 생성, AI 실패 시 폴백 회귀
- 성능 기준: 추론/생성 체감 지연과 로딩 UX 점검
- 배포
- 기능 플래그로 단계적 활성화(폴백 엔진 기본값 유지)
- IMMEDIATE 업데이트 취소/실패 시 AI 기능 안전 비활성화 시나리오 점검
17-3) 산출물
working_plan.mdAI 도입 계획 + 진행 체크리스트app/src/main/java/com/billcorea/koreantarot0312/ai/AI 서비스 계층TarotViewModel질문 기반 카드 선택/해석/확언 통합app/src/test회귀 테스트(질문 이해/카드 선택/확언)
17-4) 리스크 및 완화
- 리스크: 온디바이스 LLM 초기화 지연 -> 완화: 규칙 기반 즉시 폴백 유지
- 리스크: 생성 문장 편차 -> 완화: 톤 가드레일 + 템플릿 후처리
- 리스크: 업데이트 플로우와 동시 초기화 충돌 -> 완화: 업데이트 체크 이후 AI 지연 초기화
- 리스크: 앱 용량 증가 -> 완화: 경량 모델 우선 + 단계적 배포
17-5) 오늘 바로 시작할 작업 (착수)
-
working_plan.md에 AI 5요구 실행 계획 반영 -
ai패키지에TarotAiService+ 규칙 기반 기본 구현 추가 -
TarotViewModel에 질문 기반 카드 선택/해석/확언 연결 시작 - 명상 화면에서 AI 확언 우선 노출 연결
- AI Edge/MediaPipe LLM 실제 엔진 어댑터 추가 및 Hilt 교체
자기 성찰 타로 상담 앱 실행 로드맵 (MVP 기준)
1) 제품 방향
- 제품 한 줄 정의: 예언이 아니라, 사용자의 감정과 생각을 비추는 자기 성찰형 타로 상담 앱
- 앱 목표: 카드 해석, 상담형 질문, 저널 기록, 치유 메시지를 통해 감정 탐색과 정서적 안정을 돕는다.
- 핵심 사용자: 감정 정리가 필요한 사용자, 가벼운 셀프 상담을 원하는 사용자, 타로를 심리적 도구로 쓰고 싶은 사용자
- 핵심 가치: 자기 성찰, 정서적 안정, 기록 습관, 감정 탐색, 치유 경험
2) MVP 범위 (필수)
- 랜덤 카드 추출 (공정한 무작위 셔플)
- 스프레드: 1장 / 3장 우선 구현
- 해석 엔진: 카드 의미 + 사용자 질문 맥락 기반 상담 메시지 생성
- 저널링: 상담 내용 저장/조회, 회고 기록
- 세션 종료 치유 콘텐츠: 긍정 확언(Affirmation), 명상/호흡 메시지
3) 사용자 경험 흐름
- 홈에서 오늘의 질문 선택
- 스프레드 선택 후 카드 추출
- 카드 해석 + 공감형 상담 메시지 확인
- 후속 질문에 사용자 응답 입력
- 저널 저장
- 확언/명상 메시지 확인 후 세션 종료
4) 기능 설계 요약
4-1. 콘텐츠/데이터
- 카드 정보: 카드명, 키워드, 정/역방향 의미, 확언, 명상 문구
- 저널 정보: 질문, 선택 카드, 해석 요약, 상담 메시지, 사용자 회고, 감정 태그, 생성 시각
4-2. 해석 엔진 원칙
- 입력: 사용자 질문 + 선택 카드 + 모드(개인용/상담 모드)
- 처리: 카드 의미 추출 -> 질문 맥락 분류 -> 조합 해석 -> 상담 메시지 -> 후속 질문 생성
- 출력: 해석 결과, 후속 질문, 확언 문구
- 중요 가이드: 미래 예언형 문장 금지, 감정 탐색/자기 이해 중심 어조 유지
4-3. UI/UX
- 기본 플로우: 카드 뽑기 -> 해석 -> 상담 질문 -> 기록 -> 치유 메시지
- 화면 후보: Home, DrawCard, Reading, Counseling, Journal, Meditation
- 디자인 방향: 안정감 있는 색감, 부드러운 애니메이션, 공감형 문구 중심
5) 기술/구조 계획
- 기술 스택: Kotlin, Jetpack Compose, Coroutines, Navigation
- 로컬 데이터: Room 기반 카드/저널 저장
- DI: Hilt 도입 검토(MVP 초기에는 단순 구조 우선, 복잡도 증가 시 적용)
- 아키텍처: 현재 단순 Compose 구조 유지, 이후 Presentation/Domain/Data 레이어로 점진 분리
6) 비기능 요구사항
- 오프라인에서도 카드 조회/저널 저장 동작
- 첫 화면 진입 속도 목표: 2초 내
- 문구 품질: 비판적 표현 없이 중립적/공감적 톤 유지
- UX 품질: 불안 조장 표현 지양, 안정감 있는 경험 유지
7) 8주 실행 일정(초안)
- 1주차: 기획 확정, 와이어프레임, DB 스키마 정의
- 2주차: Navigation/데이터 계층 기초, Room 세팅
- 3주차: 카드 셔플/추출 + 1장/3장 스프레드
- 4주차: 해석 화면 + 해석 엔진 1차 연결
- 5주차: 상담 질문 흐름 + 사용자 입력 UI
- 6주차: 저널 저장/조회 + 확언/명상 화면
- 7주차: 디자인 보정, 문구 튜닝, QA
- 8주차: MVP 배포 및 베타 피드백 수집
8) 출시 후 확장 백로그
- 스프레드 확장: 5장, 켈틱 크로스
- 감정 태그 기반 개인화 리포트
- AI 기반 맞춤형 상담 강화
- 커뮤니티 기능(경험 공유)
- 전문가/상담가 연계 세션
9) 핵심 메시지
"예언이 아닌, 마음을 비추는 거울"
10) 현재 구현 상태 점검 (코드 기준, 2026-03-16)
- 홈 화면 기본 구성(브랜드/히어로/메뉴/상단 앱바) 구현
-
Home -> ReadingList -> ReadingDetailNavigation 기본 흐름 구현 - 앱 시작 시
raw/hanbok_prompt.txt기반 Room 초기 적재 구현 -
raw/tarot_app_cards_ko.json기반 카드 한글명/키워드/의미 보강 로직 구현 - 리딩 목록에서 카드 이미지 + 한글 프롬프트 요약 + 상세 이동 구현
- 리딩 상세에서 한글/영문 프롬프트, 키워드, 의미 전체 스크롤 조회 구현
- 스프레드 선택(1장/3장) 전용 화면/상태 모델 고정
- 카드 드로우(중복 없는 랜덤 선택) 세션 플로우 구현
- 상담 입력(Counseling) 화면 및 후속 질문 플로우 구현
- Journal Entity/DAO/저장-목록-상세 흐름 구현
- 세션 종료용 확언/명상(Meditation) 화면 구현
11) Home 이후 실행 체크리스트 (우선순위 + DoD)
P0 (이번 스프린트 필수)
- 스프레드 선택 흐름 고정 (
1장,3장) - 카드 추출(셔플/중복 없는 랜덤 선택) 완료
- 리딩 결과 화면에서 선택 카드 + 질문 + 해석 요약 표시
- 홈 -> 스프레드 -> 드로우 -> 리딩 단일 플로우 완성
완료 기준(DoD)
- 홈에서 시작해 리딩 결과까지 한 번에 이동 가능
- 시스템 뒤로가기 시 흐름이 깨지지 않음
P1 (P0 직후)
- 상담 질문 1~2개 입력 화면 연결
- 세션 결과를 Journal로 저장
- Journal 목록/상세 조회 연결
- 상세 화면에서 한글 데이터/카드 이미지/본문 전체 확인 가능
완료 기준(DoD)
- 리딩 -> 상담 입력 -> 저널 저장 -> 목록/상세 조회까지 끊김 없음
P2 (품질/마무리)
- 세션 종료용 확언/명상 화면 연결
- 빈 상태/오류 상태 문구 정리
- 오탈자/한국어 톤(자연스러운 번역) 최종 점검
- 릴리즈 전 QA 체크리스트 정리
12) 2주 스프린트 실행안
Week 1: 핵심 플로우 고정
- Route/인자 규칙 확정 (
spreadType,sessionId) - Draw + Reading 구현 마무리
- ViewModel 세션 상태(
spreadType,selectedCardIds,userQuestion) 고정 - 더미 문구 제거 및 실제 데이터 연결
반영 메모 (2026-03-17)
Reading요약이 카드 DB의keywords/meanings/ 사용자 질문을 기반으로 생성되도록 연결Meditation마무리 문구와 확언이 선택 카드/감정 태그 기반 파생 문구를 사용하도록 전환- 홈
최근 기록카드가 날짜/감정 태그뿐 아니라 실제 질문/요약/선택 카드명을 노출하도록 보강
Week 2: 세션 완결 + QA
- Counseling 입력 흐름 연결
- Journal 저장/목록/상세 완성
- Meditation(확언/명상) 종료 화면 연결
- 리소스 매핑/오류 처리/빈 상태/문구 톤 최종 점검
13) 오늘 바로 시작할 작업 (1 -> 2 순서)
- Route/인자 표 확정
- Draw/Reading 상태 모델 고정
- 리딩 결과 화면 최소 스펙(카드/요약/다음 액션) 잠금
- Journal 저장 스키마 + DAO 쿼리 확정
13-1) Route/인자 표 확정
- 목표: Navigation 계약을 먼저 고정해 화면 연결 재작업을 줄인다.
- 세부 작업
- 라우트 후보 확정:
Home,SpreadSelect,Draw,Reading,Counseling,JournalList,JournalDetail,Meditation - 인자 분류: 필수/선택/없음 (
spreadType,sessionId,journalId) - 뒤로가기/딥링크 대응 기준 정리
- 라우트 후보 확정:
- 산출물: Route/인자 표 v1 +
TarotNavRoutes반영 기준 - 완료 기준(DoD): 모든 화면의 인자 규칙이 문서와 코드에서 동일
- 예상 소요: 1.5 ~ 2시간
| route | 인자 | 타입 | 필수 | 예시 |
|---|---|---|---|---|
home |
- | - | - | home |
draw/{spreadType} |
spreadType |
String | Y | draw/three_card |
reading/{sessionId} |
sessionId |
Long | Y | reading/1710572400000 |
counseling/{sessionId} |
sessionId |
Long | Y | counseling/1710572400000 |
journal/detail/{journalId} |
journalId |
Long | Y | journal/detail/42 |
meditation?sessionId={sessionId} |
sessionId |
Long | N | meditation?sessionId=1710572400000 |
13-2) Draw/Reading 상태 모델 고정
- 목표: ViewModel 단일 상태원천(SSOT)으로 Draw와 Reading을 일관되게 연결한다.
- 세부 작업
-
TarotViewModel에 세션 상태 필드 정의 - 이벤트 목록 확정 (
onSpreadSelected,onQuestionChanged,drawCards,clearSession) - UI 로컬 상태와 ViewModel 상태 경계 명시
-
- 산출물: SessionState 필드 표 v1 + 이벤트 계약
- 완료 기준(DoD): Draw/Reading이 동일 상태 모델을 참조하고 상태 전달이 끊기지 않음
- 예상 소요: 2 ~ 3시간
| 필드명 | 타입 | 용도 | 갱신 시점 |
|---|---|---|---|
sessionId |
Long? | 세션 식별자 | 스프레드 시작 시 생성 |
spreadType |
String | one_card/three_card 구분 |
스프레드 선택 시 |
userQuestion |
String | 사용자 질문 원문 | 홈/상담 입력 시 |
selectedCardIds |
List | 중복 없는 카드 번호 | Draw 완료 시 |
readingSummary |
String | 리딩 요약 | Reading 계산 후 |
nextAction |
String | 다음 CTA 분기 | Reading 진입 시 |
isLoading |
Boolean | 로딩 상태 | Draw/저장 중 |
errorMessage |
String? | 에러 노출 | 실패 시 |
13-3) 리딩 결과 화면 최소 스펙 잠금
- 목표: P0 범위를 고정해 과도한 화면 확장을 방지한다.
- 세부 작업
- 필수 UI 3요소 고정: 선택 카드 썸네일, 요약 텍스트(2
4줄), 다음 액션 버튼(12개) - P1 이관 항목 분리: 심화 해석/부가 텍스트
- 빈 상태/오류 상태 문구 확정
- 필수 UI 3요소 고정: 선택 카드 썸네일, 요약 텍스트(2
- 산출물: Reading 최소 스펙 체크리스트
- 완료 기준(DoD): 리딩 진입 시 필수 3요소가 항상 보이고 다음 화면 이동이 일관됨
- 예상 소요: 1.5 ~ 2.5시간
13-4) Journal 저장 스키마 + DAO 쿼리 확정
- 목표: 세션 저장/조회의 DB 계약을 먼저 고정한다.
- 세부 작업
-
JournalEntity필드 확정 (질문, 카드목록, 요약, 상담응답, 감정태그, 생성시각) -
JournalDao최소 쿼리 확정 (insert, list, detail, recent) -
TarotDatabase버전 업 및 마이그레이션 정책 결정
-
- 산출물: JournalEntity/JournalDao 설계표 v1
- 완료 기준(DoD): 저장 1건/목록 조회/상세 조회를 커버하는 쿼리 셋 정의 완료
- 예상 소요: 2 ~ 3시간
추가 반영 메모 (2026-03-17)
TarotRepositoryDataSource도입으로TarotViewModelJVM 단위 테스트 가능 구조로 정리MainDispatcherRule,TarotViewModelTest추가로 리딩 요약 생성 / Journal 저장 회귀 검증 자동화JournalDaoTest추가로 최신순 목록 / 상세 조회 / DB 재오픈 후 데이터 유지 검증MIGRATION_4_5명시적 Room 마이그레이션 추가- DB 정책:
4 -> 5는 비파괴 마이그레이션 적용,1~3구버전은 destructive fallback 유지
14) QA 체크리스트 문서
- MVP QA 체크리스트 작성:
documents/qa_checklist_mvp.md
15) QA/테스트/마이그레이션 진행 상태 (2026-03-17)
-
TarotViewModel최소 회귀 테스트 추가 -
JournalDao저장/조회/재오픈 테스트 추가 -
TarotDatabase 4 -> 5마이그레이션 정책 코드 반영 및 테스트 추가 - 시스템 뒤로가기 동작을
BackHandler로 세션/저널/프롬프트 화면에 명시적 반영 - 명상/확언 문구 톤을 차분한 반성형 문장으로 보강하고 테스트 추가
- 기본 테마를
medium contrast색상표와surfaceContainer*계열 배경으로 조정해 다크/라이트 대비 보강
16) 코드 품질 정리 (2026-03-17)
-
JournalScreens.ktCardDetailBlock: 영문 카드명 중복 표시 버그 수정 →cardNameKo우선 주 타이틀, 영문명은 부제목으로 분리 -
TarotSummaryScreen.kt: 홈 화면 Journal 직접 이동 버튼 복원 (EditNote아이콘, 3 Card Spread 아래 배치) -
TarotSessionFlowScreens.kt: 미사용SimpleTodoScreen제거 -
TarotReadingScreens.kt: 미사용 privateDetailCard제거 -
TarotViewModel.kt: 미사용 publicobserveJournalDetail/clearSessionError제거 -
TarotViewModel.ktbuildReadingSummary: 카드명을cardNameKo우선 사용으로 리딩 요약 문구 한국어화
17) 온디바이스 AI Edge/MediaPipe LLM 적용 계획 (2026-03-20)
17-1) 요구사항 체크리스트 (사용자 요청 5개)
-
- Google AI Edge / MediaPipe LLM 적용
-
- 사용자가 입력한 오늘의 질문 이해(의도/주제 파악)
-
- 질문과 카드
keywords/meanings연관도 기반 카드 선택
- 질문과 카드
-
- 선택 카드 해석 메시지 생성
-
- 리딩 종료 후 선택 카드
meanings기반 확언 문장 생성
- 리딩 종료 후 선택 카드
17-2) 단계별 실행 (준비 -> 설계 -> 구현 -> 검증 -> 배포)
- 준비
- AI Edge/MediaPipe LLM 의존성/ABI/최소 기기 제약 확인
MainActivityIMMEDIATE 업데이트 플로우와 AI 초기화 순서 충돌 방지 정책 확정
- 설계
ai패키지에 엔진 인터페이스(TarotAiService) + 폴백 엔진 정의- 질문 분석 -> 카드 점수화 -> 해석 생성 -> 확언 생성 파이프라인 설계
- 구현
TarotViewModel.drawCards()에 질문 기반 카드 선택 적용- 리딩 요약/해석 메시지를 AI 서비스 출력으로 전환
- 명상 마무리 화면 확언을 AI 생성 결과 우선 사용
- 검증
- JVM 테스트: 질문-카드 매칭, 해석 문구, 확언 생성, AI 실패 시 폴백 회귀
- 성능 기준: 추론/생성 체감 지연과 로딩 UX 점검
- 배포
- 기능 플래그로 단계적 활성화(폴백 엔진 기본값 유지)
- IMMEDIATE 업데이트 취소/실패 시 AI 기능 안전 비활성화 시나리오 점검
17-3) 산출물
working_plan.mdAI 도입 계획 + 진행 체크리스트app/src/main/java/com/billcorea/koreantarot0312/ai/AI 서비스 계층TarotViewModel질문 기반 카드 선택/해석/확언 통합app/src/test회귀 테스트(질문 이해/카드 선택/확언)
17-4) 리스크 및 완화
- 리스크: 온디바이스 LLM 초기화 지연 -> 완화: 규칙 기반 즉시 폴백 유지
- 리스크: 생성 문장 편차 -> 완화: 톤 가드레일 + 템플릿 후처리
- 리스크: 업데이트 플로우와 동시 초기화 충돌 -> 완화: 업데이트 체크 이후 AI 지연 초기화
- 리스크: 앱 용량 증가 -> 완화: 경량 모델 우선 + 단계적 배포
17-5) 오늘 바로 시작할 작업 (착수)
-
working_plan.md에 AI 5요구 실행 계획 반영 -
ai패키지에TarotAiService+ 규칙 기반 기본 구현 추가 -
TarotViewModel에 질문 기반 카드 선택/해석/확언 연결 시작 - 명상 화면에서 AI 확언 우선 노출 연결
- AI Edge/MediaPipe LLM 실제 엔진 어댑터 추가 및 Hilt 교체
반응형
'모바일 앱(안드로이드)' 카테고리의 다른 글
| 알림수집기 앱의 수정 이력... (0) | 2026.04.08 |
|---|---|
| Han Tarot (타로가 한복을 입었다 ?) 앱 사용자 설명서 (0) | 2026.03.30 |
| 자기 성찰 타로 상담 앱 실행 로드맵 (MVP 기준, 업데이트 #1) (1) | 2026.03.27 |
| Han Tarot 다음 개발 스텝 정리 (HomeScreen 이후) (0) | 2026.03.23 |
| Han Tarot 앱 개발 기획안 (수정버전) (0) | 2026.03.21 |