하루 다님 (HaruDanim) — 앱 스펙 문서
한 줄 소개: 하루의 습관과 시간을 추적하는 iOS 앱. 사용자가 등록한 "행동"의 소요 시간을 측정하거나 횟수를 기록하고, 이를 바탕으로 목표(Goal)와 다짐(Quest) 을 세워 달성 여부를 관리한다.
문서 버전: v1.0 (2026-07-06) / 이 문서는 개발자·AI에게 전달하기 위한 기획 명세서입니다.
1. 앱 개요
| 항목 |
내용 |
| 앱 이름 |
하루 다님 — 하루 습관 및 시간 추적 |
| 플랫폼 |
iOS (추후 iPadOS 동기화, watchOS 앱 — 유료 기능) |
| 기본 언어 |
한국어 (설정에서 영어 / 일본어 전환 가능) |
| 핵심 콘셉트 |
시간 추적형 타임 트래커 + 습관 카운터/스트릭 관리를 하나로 합친 앱. 행동을 버튼 한 번으로 기록하고, 그 기록들이 모여 목표 달성률로 이어지는 구조 |
| 수익 모델 |
부분 유료화 (무료 사용 + 프리미엄 결제 시 제한 해제 및 확장 기능) |
2. 개발 환경 및 기술 스택
2.1 개발 환경
- 장비/도구: MacBook + Xcode
- Apple Developer Program: 현재 미가입 상태.
- 1단계: 미가입 상태로 구현 가능한 기능을 모두 먼저 구현
- 2단계: 구현 완료 후 가입하여 유료 계정이 필요한 기능(인앱결제, iCloud 동기화, 앱 배포 등) 추가 구현
- 프로젝트 구조: Xcode 프로젝트 생성 완료. 최상위 폴더명
HaruDanim, 그 하위의 앱 타깃 폴더명은 iOS로 변경했으며 관련 설정(빌드 세팅, 경로 등)도 모두 반영된 상태
2.2 기술 스택
| 영역 |
기술 |
비고 |
| UI |
SwiftUI |
|
| 데이터 저장 |
SwiftData |
프로젝트 생성 시 Storage는 None으로 선택했으나 실제 구현은 SwiftData 사용 |
| 시간 추적 (백그라운드/다이나믹 아일랜드/잠금화면) |
ActivityKit — Live Activities |
앱을 나가도 추적 중인 시간 표시 |
| 위젯 |
WidgetKit |
홈 화면 / 잠금 화면 위젯 (유료) |
| 워치 앱 |
watchOS App + WidgetKit 기반 컴플리케이션 |
유료 |
| 통계 그래프 |
Swift Charts |
|
| 아이콘 |
SF Symbols |
가능한 전체 심볼을 선택할 수 있도록 제공 |
| 결제 |
StoreKit 2 |
개발자 프로그램 가입 후 |
| 기기 간 동기화 |
CloudKit (SwiftData + CloudKit 연동) |
개발자 프로그램 가입 후, 유료 기능 |
| 다국어 |
String Catalog (ko 기본, en / ja) |
|
2.3 개발 단계 구분 (개발자 프로그램 가입 기준)
- 가입 전 구현: 앱 본체 전체(행동/목표/다짐/꼬리표/기록/설정), SwiftData 저장, Live Activity·다이나믹 아일랜드, 위젯·워치 앱의 로직/UI (실기기 테스트는 무료 프로비저닝 범위 내)
- 가입 후 구현: 인앱결제(StoreKit), iCloud(CloudKit) 기기 간 동기화, App Store 배포
3. 핵심 용어 (도메인 개념)
3.1 행동 (Action)
- 추적·기록의 최소 단위. 습관(habit) 또는 할 일(task)을 등록한다.
- 추적 방식은 생성 시 둘 중 하나로 지정:
- 시간 추적형: 시작/종료 토글로 소요 시간을 측정. 앱이 백그라운드로 가도 측정이 계속 유지되어야 함 (Live Activity로 표시)
- 횟수 추적형: 탭할 때마다 카운트 +1
- 구성 요소: 이름, 아이콘(SF Symbols), 꼬리표(복수 지정 가능), 추적 방식(시간/횟수)
- 행동 버튼의 색은 지정된 꼬리표의 색을 따른다.
3.2 목표 (Goal)
- 상위 개념의 큰 목표. 사용자가 직접 텍스트로 작성 (예: "토익 700점 이상 받기")
- 구성 요소: 목표 내용(텍스트), 아이콘, 색, 시작일(필수, 과거 날짜 가능), 종료일(선택)
- 종료일 미지정 시 → 수동 완료 처리 가능해야 함. 이때 달성 여부는 하위 다짐들의 전체 달성 여부에 따라 결정
- 종료일 지정 시 → 목표 탭에 진행률 표시
3.3 다짐 (Quest)
- 목표의 하위 단위. 목표를 먼저 만들고, 그 목표 안에 다짐을 하나씩 추가하는 흐름
- 대상: 특정 행동 또는 특정 꼬리표를 선택
- 반복 주기 옵션:
- 하루 단위 / 일주일 단위 / 한 달 단위 / 특정 기간 단위
- 요일 지정: "매주 월·수·금" 등 복수 요일
- 날짜 지정: "매달 15일, 20일, 25일" 등 복수 날짜
- 주차+요일 지정: "매달 셋째 주 화요일" 등
- 목표량과 방향:
- 시간 추적형 행동 → 해당 기간 동안 특정 시간을 초과 달성(이상) 이 목표인지 / 초과하지 않음(이하) 이 목표인지 선택
- 횟수 추적형 행동 → 특정 횟수 이상이 목표인지 / 넘지 않음이 목표인지 선택
3.4 꼬리표 (Tag)
- 행동을 분류하는 태그. 고유의 색을 가지며 생성 시 색을 지정
- 생성 위치: 꼬리표 탭, 또는 행동 추가 화면의 꼬리표 지정 단계에서 즉석 추가
- 하나의 행동은 여러 개의 꼬리표를 가질 수 있음 (다대다 관계)
4. 시간 추적 시스템 (핵심 동작 명세)
4.1 기본 동작
- 시간 추적형 행동 버튼을 탭 → 측정 시작 / 다시 탭 → 측정 종료 (토글)
- 앱을 나가도 측정은 계속되며, 다이나믹 아일랜드와 잠금화면 실시간 현황(Live Activity) 에 추적 중인 시간이 표시됨
4.2 동시(멀티) 추적
- 한 행동을 측정 중인 상태에서, 종료하지 않고 다른 행동을 탭하면 그 행동도 함께 추적 시작 (동시 추적 개수 제한 없음)
- 다이나믹 아일랜드/잠금화면에 표시할 대표 시간은 설정에서 선택:
- 가장 먼저 시작한 행동 표시 / 가장 나중에 시작한 행동 표시 (기본값 제안: 가장 나중에 시작한 것)
- 여러 개를 동시에 추적 중이면 대표 시간 옆에
+1, +2 형식으로 추가 추적 중인 개수를 표시
4.3 하루 경계(하루 시작 시간) 예외 처리
- 설정에서 "하루 시작 시간"을 지정 가능 (예: 오전 6시)
- 세션이 하루 경계를 걸치는 경우 (예: 하루 시작이 06:00일 때, 05:00 시작 → 07:00 종료):
- 저장: 세션 자체는 실제 시작~종료 시각 그대로 하나의 기록으로 저장
- 집계/통계: 하루 시작 시간을 기준으로 자동 분할하여 각 날짜에 귀속 (위 예시에서는 05:00
06:00은 전날, 06:0007:00은 당일 실적으로 계산)
- 기록 탭 표시/다짐 진행률 계산에도 동일한 분할 규칙 적용
5. 화면 구성
5.1 로딩(스플래시) 화면
- 앱 실행 시 앱 로고 + 앱 이름이 표시되는 로딩 화면 필요 (로고는 아직 미제작 → 플레이스홀더로 진행 후 교체)
5.2 테마
- 라이트 / 다크 두 가지 모드
- 컬러 팔레트: 두 모드 모두 초록 + 노랑 + 배경색(라이트=흰색 계열 / 다크=검정 계열) 구성
- 모드별로 초록·노랑의 컬러 값을 다르게 하여 각 배경에 어울리게 조정. 흔한 원색 계열 초록/노랑은 배제
- 제안 컬러 값 (구현 시 조정 가능):
| 역할 |
라이트 모드 |
다크 모드 |
| Primary Green |
#2F6B4F (딥 모스 그린) |
#7FBF9E (세이지 민트) |
| Accent Yellow |
#D9A621 (머스터드 골드) |
#E8C558 (소프트 앰버) |
| Background |
#FAFAF6 (웜 화이트) |
#111512 (그린 틴트 블랙) |
5.3 탭 구조 (총 6개, 순서 고정)
메인 → 행동 → 꼬리표 → 목표 → 기록 → 설정
6. 탭별 상세 명세
6.1 메인 탭
- 행동 버튼 그리드: 등록된 행동들이 스마트폰 홈 화면의 앱 아이콘처럼 나열됨
- 각 버튼: 라운드가 있는 직사각형 / 꼬리표 색 배경 + SF Symbols 아이콘 + 행동 이름
- 시간 추적형: 탭 → 측정 시작, 다시 탭 → 종료. 측정 중/아닐 때 시각적으로 구분 필수
- 횟수 추적형: 탭 → 카운트 +1
- 진행 중 영역: 측정 중인 행동은 메인 탭 상단의 "현재 진행 중" 영역에 표시. 옆의 종료 버튼으로 종료 가능 (아래 그리드의 버튼을 다시 탭해도 동일하게 종료)
- 길게 누르기(롱프레스) 메뉴:
- 횟수 추적형: ① 횟수 직접 입력/수정 (증가 취소 포함. 횟수를 여러 개 추가할 경우 각 건마다 "지금 시각"으로 기록할지 특정 시각을 지정할지 선택 가능) ② 행동 설정 수정 ③ 행동 삭제
- 시간 추적형: ① 시작/종료 시각 수동 입력·수정 ② 행동 설정 수정 ③ 행동 삭제
- 배치 편집 모드: 배치 수정 버튼 존재(위치는 구현 시 재량). 누르면 iPhone 홈 화면 편집처럼 버튼들이 흔들리며(지글 애니메이션) 드래그로 순서 변경 가능. "완료"를 누르면 배치가 저장·유지됨
6.2 행동 탭
- 등록된 모든 행동을 꼬리표별로 그룹화한 리스트로 표시
- 리스트에서 행동을 탭해도 측정이 동작하지 않음 → 대신 설정 내용 상세가 표시되고, 수정 버튼으로 수정 / 삭제 가능
- 행동 추가: 추가 버튼 → 이름, 아이콘, 꼬리표, 추적 방식(시간/횟수) 설정
- 아이콘 선택기는 SF Symbols를 최대한 폭넓게 전부 사용할 수 있도록 구성 (검색/카테고리 탐색 제공 권장)
6.3 꼬리표 탭
- 생성된 태그 목록 확인 / 새 태그 추가 / 기존 태그의 이름·색 수정
- 태그 생성 시 색 지정 필수
6.4 목표 탭
- 목표 생성: 내용(텍스트) + 아이콘 + 색 + 시작일(필수, 과거 가능) + 종료일(선택)
- 목표 상태 표시 (각각 다른 시각 상태 필요):
- 진행 중 (종료일 있으면 진행률 함께 표시)
- 달성 완료
- 미달성 종료
- 확인 필요: 다짐이 하나도 등록되지 않은 채 종료일이 도래한 목표 → "달성했나요?" 질문 상태로 전환, 사용자가 탭하여 달성/미달성 직접 선택 → 선택에 따라 2 또는 3 상태로 변경
- 종료일 없는 목표 → 수동 종료 버튼 제공. 종료 시 달성 여부는 하위 다짐 전체 달성 여부로 판정
- 다짐 추가 플로우: 목표 상세에서 [다짐 추가] → ① 대상 선택(행동 목록 또는 꼬리표 목록에서 선택) → ② 주기 선택(하루/주/월/특정 기간 + 요일·날짜·몇째 주 요일 옵션) → ③ 목표량 입력(시간 또는 횟수) + 방향 선택(이상 달성 / 이하 유지)
- 표시 구조: 목표 리스트 아래에 해당 목표의 다짐들이 하위 리스트로 표시되고, 각 다짐마다 하루 진행률 / 주간 진행률 / 월간 진행률이 표기됨
6.5 기록 탭
- 기본(일간) 뷰: 진입 시 오늘 하루의 기록 표시
- 시간 추적형: 각 행동을 언제부터 언제까지, 총 몇 시간 했는지
- 횟수 추적형: 언제 몇 번을 했는지(시각 포함)
- 각 기록을 탭하면 바로 수정 화면이 떠서 세부 데이터 수정 가능
- 상단 날짜 이동 버튼으로 이전/이후 날짜의 기록도 동일한 형태로 조회
- 타임테이블 뷰 (전환 버튼 제공):
- 24시간 축의 타임테이블. 하루 단위 / 일주일 단위 보기 전환 가능
- 시간 추적형 → 해당 시간 구간만큼 영역(블록)을 차지. 횟수 추적형 → 기록된 그 시점에 점/마커로 표시
- 표시는 행동의 아이콘 + 꼬리표 색 사용
- 통계 영역 (아래로 스크롤):
- 태그별 하루 시간 투자량 / 횟수 달성량
- 일주일별, 한 달별 집계
- 그래프(차트)로 빈도·비율을 한눈에 파악 가능하게 (Swift Charts)
6.6 설정 탭
- 테마: 라이트 / 다크 선택
- 언어: 한국어(기본) / 영어 / 일본어
- 주 시작 요일 설정 (기본값 제안: 월요일)
- 하루 시작 시간 설정 (기본값 제안: 00:00)
- Live Activity/다이나믹 아일랜드 대표 시간 기준: 가장 먼저 시작한 행동 / 가장 나중에 시작한 행동
- 프리미엄 기능 메뉴:
- 미결제 상태 → 유료 기능 소개 + 결제 화면으로 연결
- 결제 완료 상태 → 홈/잠금화면 위젯 사용 가능, 애플워치 앱 사용 가능, 기기 간 동기화 on/off 토글 제공
7. 무료 / 유료(프리미엄) 구분
7.1 무료 사용 제한
| 항목 |
무료 한도 |
| 행동(Action) |
최대 10개 |
| 목표(Goal) |
최대 2개 |
| 다짐(Quest) |
각 목표당 최대 3개 |
7.2 프리미엄 결제 시
- 위 개수 제한 전부 해제 (무제한)
- 홈 화면 및 잠금화면 위젯 사용 가능
- 아이패드 앱과의 데이터 동기화 (iCloud)
- 애플워치 앱 + 워치 페이스 컴플리케이션 사용 가능
8. 위젯 명세 (프리미엄)
8.1 공통 — 위젯 테마 옵션
위젯 설정에서 선택:
- 앱 테마와 일치
- 라이트 고정 / 다크 고정
- 리퀴드 글라스(Liquid Glass) 스타일 — 유리 질감 배경 위에서 잘 보이도록 별도 디자인 변형 필요
8.2 행동 실행 위젯 (홈 화면)
| 크기 |
구성 |
| 소형 A |
행동 1개의 실행 버튼. 시간 추적형은 탭으로 시작/종료 토글 + 누적 시간 표시, 횟수 추적형은 누적 횟수 표시. 표시 기간을 옵션에서 선택: 오늘 / 이번 주 / 이번 달 |
| 소형 B |
소형 A를 축소·간소화한 셀을 2×2로 배치 → 행동 4개 |
| 중형 A |
소형 A 스타일 셀 3개 |
| 중형 B |
소형 B 스타일 셀 8개 |
| 대형 |
중형 기준으로 동일한 방식으로 확장 (중형 A 확장형 / 중형 B 확장형) |
8.3 목표/다짐 통계 위젯 (홈 화면)
- 옵션에서 어떤 목표를 표시할지 선택 가능. 목표 전체 또는 그 목표의 특정 다짐만 표시하는 것도 가능
- 진행 정보는 하루 / 주간 / 월간 진행률 등으로 표기
| 크기 |
구성 |
| 소형 |
목표 1개의 달성률/통계 |
| 중형 |
① 목표 1개를 소형보다 상세하게, 또는 ② 목표 2개를 소형처럼 간단하게 |
| 대형 |
① 목표 2개를 중형 수준으로 상세하게, 또는 ② 목표 4개를 간단하게 |
8.4 잠금화면 위젯
- 소형(1칸) 위주로 최소한만 구성
- 종류: 특정 목표 1개의 달성률 / 해당 목표에 속한 다짐들의 달성 여부 표시 등 간단한 정보 위주
9. 애플워치 앱 (프리미엄)
9.1 워치 앱 본체
- 진입 시 꼬리표(태그) 목록이 나열됨 → 태그를 탭하면 그 태그에 속한 행동 목록 표시
- 행동을 탭하면: 횟수 추적형 → 카운트 +1 / 시간 추적형 → 측정 시작·정지 토글
- iPhone 앱과 실시간 데이터 연동 필수 (워치에서 시작한 측정이 폰에도 반영, 그 반대도 동일)
9.2 컴플리케이션 (워치 페이스 요소)
- 현재 현황 컴플리케이션
- 시간 측정 중이면 어떤 행동이 실행 중인지 표시
- 표시 기준은 다이나믹 아일랜드/잠금화면과 동일한 설정을 따름 (여러 개면 설정된 기준의 대표 1개 + 추가 실행 개수 별도 표시, 추가 개수가 없으면 개수 표시 생략)
- 실행 중인 것이 없으면 "실행 중 아님" 상태로 표시
- 목표 달성률 컴플리케이션
- 지정한 특정 목표의 달성률 표시
- "넘기면 안 되는" 목표(시간/횟수 상한형)의 경우 일반 달성형과 다른 시각 표현 사용 (예: 한도 대비 사용량으로 표시)
10. 데이터 모델 (SwiftData 설계 제안)
사용자가 기술한 기능을 구현하기 위한 권장 모델 구조. 세부 필드는 구현 시 조정 가능.
- Tag: id, 이름, 색상, 생성일
- Action: id, 이름, SF Symbol 이름, 추적방식(
time | count), 태그들(다대다), 메인 화면 정렬 순서
- TimeSession (시간 기록): id, action 참조, 시작 시각, 종료 시각(진행 중이면 nil)
- CountEntry (횟수 기록): id, action 참조, 기록 시각, 수량(기본 1)
- Goal: id, 내용 텍스트, 아이콘, 색, 시작일, 종료일(옵션), 상태(
진행중 | 달성 | 미달성 | 확인필요)
- Quest: id, goal 참조, 대상(행동 또는 태그), 주기 유형(일/주/월/기간), 주기 상세(요일 배열, 날짜 배열, 몇째주+요일 등), 목표값(시간 또는 횟수), 방향(
이상 | 이하)
- AppSettings: 테마, 언어, 주 시작 요일, 하루 시작 시간, Live Activity 대표 시간 기준, 프리미엄 여부
11. 문서에서 확정한 기본값 (원문에 명시되지 않아 합리적으로 정한 것)
| 항목 |
확정값 |
근거 |
| 하루 시작 시간 기본값 |
00:00 |
설정에서 변경 가능하므로 표준값으로 시작 |
| 주 시작 요일 기본값 |
월요일 |
한국 사용 관행, 설정에서 변경 가능 |
| 다이나믹 아일랜드 대표 시간 기본값 |
가장 나중에 시작한 행동 |
워치 컴플리케이션 설명에서 "여러 개면 가장 나중 것"이라 언급된 것에 맞춤 |
| 하루 경계 걸침 세션 처리 |
저장은 1개 세션, 집계 시 경계 기준 분할 |
원문 데이터 보존 + 일간 통계 정확성 양립 |
| 테마 컬러 값 |
§5.2의 제안 팔레트 |
"흔하지 않은 초록/노랑" 요구 반영, 조정 가능 |
| 동시 추적 개수 |
제한 없음 |
원문에 제한 언급 없음 |