2026. 1. 29. 05:17ㆍAI Product Building/HalloGerman
이 글의 핵심
- 언어 학습 앱에서 모든 데이터를 저장하지 않은 이유와 기준
- 학습 진도·복습·홈 화면을 유지하면서도 구조를 단순화한 저장 설계
16편에서 홈 화면 진도 모니터링을 다뤘다면, 이번 17편에서는 그 진도의 기반이 되는 학습 데이터 저장 전략을 설명한다.
HalloGerman를 만들면서 가장 많이 받은 질문 중 하나는 이것이었다. “왜 이 데이터는 저장하지 않나요?”
이 글의 결론은 단순하다. 저장할 수 있는 것과 저장해야 하는 것은 다르다.
1. 학습 앱에서 데이터는 왜 위험해질 수 있을까
학습 앱은 사용자의 행동을 매우 많이 만들어낸다.
- 카드를 몇 번 넘겼는지
- 몇 초 동안 봤는지
- 발음을 몇 번 틀렸는지
- 필기를 어떻게 했는지
기술적으로는 이 모든 것을 저장할 수 있다. 하지만 저장하는 순간,
- 데이터 구조가 복잡해지고
- 버그 가능성이 늘어나며
- 유지보수 비용이 급격히 증가한다
그래서 HalloGerman에서는 처음부터 저장 범위를 강하게 제한했다.
2. 저장 전략의 기준: “다음 행동에 필요한가?”
데이터를 저장할지 말지 결정하는 기준은 하나였다.
이 데이터가 없으면 다음 학습 행동이 불가능한가?
이 질문에 “아니오”라면, 그 데이터는 저장 대상에서 제외했다.
3. HalloGerman에서 저장하는 핵심 데이터
HalloGerman이 실제로 저장하는 데이터는 많지 않다.
- 단어 학습 로그(날짜, 타입)
- 틀린 횟수
- 마지막 학습 날짜
- 연속 학습 일수
이 정보만으로도
- 복습 대상 선정
- 홈 화면 진도 표시
- 알람 트리거 판단
이 모두가 가능하다.
3-1. 학습 로그 데이터 모델 예시
data class StudyLog(
val word: String,
val type: StudyType,
val timestamp: Long
)
이 모델에는 시간, 단어, 학습 타입 외의 정보는 없다. 의도적인 최소화다.
4. 저장하지 않기로 한 데이터들
반대로, 다음 데이터들은 저장하지 않는다.
- 필기 결과 이미지
- 음성 인식 원본 텍스트
- 플래시 카드 체류 시간
- 부분 입력 중간 상태
이 데이터들은 학습 효과 대비 관리 비용이 너무 크다. 특히 음성·필기 데이터는 개인정보·보안 이슈로도 이어질 수 있다.
5. 로컬 저장을 선택한 이유
HalloGerman은 서버 기반 동기화를 초기 버전에서는 사용하지 않는다.
- 오프라인에서도 학습 가능해야 하고
- 초기 운영 비용을 줄여야 하며
- 데이터 마이그레이션 리스크를 피하고 싶었기 때문이다
그래서 학습 데이터는 로컬 DB에만 저장한다.
5-1. Room 기반 저장 구조 예시
@Dao
interface StudyLogDao {
@Insert
fun insert(log: StudyLog)
@Query("SELECT * FROM StudyLog WHERE date = :today")
fun getTodayLogs(today: String): List<StudyLog>
}
Room을 사용하면 쿼리와 데이터 구조가 명확해지고, 향후 확장도 비교적 수월하다.
6. 데이터 삭제 정책도 설계의 일부다
데이터를 저장하는 것만큼 중요한 것이 언제, 어떻게 지울 것인가다.
HalloGerman에서는
- 오래된 원본 로그는 주기적으로 정리하고
- 집계된 결과만 남기며
- 앱 재설치 시 완전 초기화를 허용한다
이 정책 덕분에 DB 크기와 복잡도가 일정하게 유지된다.
7. 이 저장 전략이 유지보수에 주는 이점
데이터를 최소화한 덕분에,
- 버그 원인 추적이 쉬워지고
- 구조 변경 시 영향 범위가 작으며
- 기능 추가 시 판단이 명확해진다
저장 전략은 기술 문제가 아니라 제품 철학의 문제다.
8. 다음 편 예고
다음 18편에서는 앱이 커질수록 중요한 문제인 유지보수를 고려한 구조 설계를 다룬다. 기능이 늘어나도 구조가 무너지지 않게 한 기준을 설명할 예정이다.
참고 자료
- Android Room Persistence Library
https://developer.android.com/training/data-storage/room
'AI Product Building > HalloGerman' 카테고리의 다른 글
| [독일어 학습 앱 개발기 19편] 무료 학습 앱에서 AdMob을 선택한 이유 – 수익화의 현실적인 출발점 (0) | 2026.02.01 |
|---|---|
| [독일어 학습 앱 개발기 18편] 유지보수를 고려한 구조 설계 – 앱이 커져도 무너지지 않게 하는 기준 (0) | 2026.01.30 |
| [독일어 학습 앱 개발기 16편] 홈 화면 진도 모니터링 – 숫자가 학습을 계속하게 만드는 이유 (0) | 2026.01.28 |
| [독일어 학습 앱 개발기 15편] 알람(리마인드) 기능은 왜 필요한가 – 학습을 ‘습관’으로 만드는 설계 (0) | 2026.01.27 |
| [독일어 학습 앱 개발기 14편] 복습 로직 설계 – 왜 단순 반복 학습은 실패하는가 (1) | 2026.01.26 |