<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Domain Modeling on Kelly Dev</title><link>https://kelly-chui.github.io/tags/domain-modeling/</link><description>Recent content in Domain Modeling on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Tue, 18 Aug 2026 23:30:00 +0900</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/domain-modeling/index.xml" rel="self" type="application/rss+xml"/><item><title>StackDay. 0. Concept</title><link>https://kelly-chui.github.io/posts/stackday-dev-log-concept/</link><pubDate>Sat, 08 Aug 2026 15:36:21 +0900</pubDate><guid>https://kelly-chui.github.io/posts/stackday-dev-log-concept/</guid><description>&lt;h2 id="시작하기"&gt;시작하기&lt;/h2&gt;
&lt;p&gt;애플 리마인더나 마이크로소프트 To do를 쓰면 매일 해야하는 일들을 관리할 수 있다.&lt;/p&gt;
&lt;p&gt;나도 매일 LeetCode Daily를 풀고, Bing 출석체크를 하고, 매일 TIL 을 적으려고 한다.&lt;/p&gt;
&lt;figure class="media-caption align-center"&gt;&lt;img src="https://kelly-chui.github.io/posts/stackday-dev-log-concept/image-001-optimized-image.webp" alt="" loading="lazy" width="360"&gt;
&lt;/figure&gt;
&lt;p&gt;하지만 기본적으로 Reminder, Todo 앱과 습관 형성 앱은 차이가 있다.&lt;/p&gt;
&lt;p&gt;첫 번째로 기능 요구사항이 다르다. 애플 리마인더는 매일 반복해야 하는 태스크를 하지 않았을 경우에, 날짜가 새로 갱신되지 않고, 그 날짜에 계속 남아있는다. 마이크로소프트 To do는 하루를 빠뜨리면 그 태스크가 사라지지 않고 누적된다.&lt;/p&gt;
&lt;p&gt;내가 원하는 습관 형성 앱은 리마인더의 방식, 마이크로소프트 투 두의 방식 등등을 포괄할 수 있는 앱이었다.&lt;/p&gt;</description></item><item><title>StackDay. 데이터 모델링, Entry가 아닌 Completion을 관리해야 하는 이유</title><link>https://kelly-chui.github.io/posts/stackday-dev-log-entry-vs-completion/</link><pubDate>Tue, 11 Aug 2026 16:48:37 +0900</pubDate><guid>https://kelly-chui.github.io/posts/stackday-dev-log-entry-vs-completion/</guid><description>&lt;p&gt;StackDay의 MVP 범위와 정책을 가지고 앱의 도메인과 데이터를 모델링한다.&lt;/p&gt;
&lt;p&gt;도메인 모델링 -&amp;gt; 데이터 모델링 -&amp;gt; 유즈케이스 검증 순서로 진행하고, 각각의 단계가 이전 단계를 검증하는 방향이다.&lt;/p&gt;
&lt;h2 id="앱의-핵심-동작"&gt;앱의 핵심 동작&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://kelly-chui.github.io/posts/stackday-dev-log-concept/"&gt;이전 포스트&lt;/a&gt;에서 정한 앱의 컨셉과 정책에서부터, 이 앱이 어떤 동작을 해야 할지 먼저 정리했다.&lt;/p&gt;
&lt;pre class="mermaid" data-mermaid-source="flowchart&amp;#43;LR%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;A%5B%EC%8A%B5%EA%B4%80&amp;#43;%EC%83%9D%EC%84%B1%5D%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;B%5B%EC%8A%B5%EA%B4%80&amp;#43;%EC%B6%94%EC%A0%81%5D%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;C%5B%EB%A7%A4%EC%9D%BC&amp;#43;%EC%88%98%ED%96%89&amp;#43;%EC%97%AC%EB%B6%80&amp;#43;%EA%B8%B0%EB%A1%9D%5D%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;D%5B%EC%8A%A4%ED%8A%B8%EB%A6%AD%EA%B3%BC&amp;#43;%ED%86%B5%EA%B3%84&amp;#43;%EA%B3%84%EC%82%B0%5D%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;E%5B%EC%8A%B5%EA%B4%80&amp;#43;%EC%A2%85%EB%A3%8C%5D%0A%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;A&amp;#43;--%3E&amp;#43;B&amp;#43;--%3E&amp;#43;C&amp;#43;--%3E&amp;#43;D%0A&amp;#43;&amp;#43;&amp;#43;&amp;#43;B&amp;#43;--%3E&amp;#43;E"&gt;&lt;/pre&gt;&lt;p&gt;사용자가 습관을 만들면 그날부터 습관의 추적이 시작된다. 사용자는 매일 습관을 수행했는지 기록하고, 앱은 누적된 기록을 바탕으로 현재 스트릭과 통계를 보여준다. 더 이상 이어가지 않을 습관은 추적을 종료할 수 있다.&lt;/p&gt;</description></item><item><title>TIL. Aug 18, 2026</title><link>https://kelly-chui.github.io/til/2026/til-2026-08-18/</link><pubDate>Tue, 18 Aug 2026 23:30:00 +0900</pubDate><guid>https://kelly-chui.github.io/til/2026/til-2026-08-18/</guid><description>&lt;h2 id="오늘-한-내용"&gt;오늘 한 내용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Stack Day
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LocalDay&lt;/code&gt; 날짜 모델 도입&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Clock&lt;/code&gt;과 &lt;code&gt;FixedClock&lt;/code&gt; 추가&lt;/li&gt;
&lt;li&gt;완료 기록·취소·보관·삭제 UseCase를 날짜 모델에 맞게 수정&lt;/li&gt;
&lt;li&gt;&lt;code&gt;InMemoryHabitRepository&lt;/code&gt;, &lt;code&gt;InMemoryCompletionRepository&lt;/code&gt; 구현 및 테스트 추가&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kelly-chui.github.io/posts/stackday-dev-log-localday-time-boundary/"&gt;StackDay. Date로 하루를 표현하면 생기는 문제&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="배운-내용"&gt;배운 내용&lt;/h2&gt;
&lt;h3 id="localday-도입하기"&gt;LocalDay 도입하기&lt;/h3&gt;
&lt;p&gt;Stack Day에서는 &lt;code&gt;Date&lt;/code&gt; 하나로 특정 시점과 특정 날짜를 모두 표현하고 있었다. 그래서 달력상의 날짜만 필요한 값을 &lt;code&gt;LocalDay&lt;/code&gt;로 분리했다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;LocalDay&lt;/code&gt;: &lt;code&gt;startedOn&lt;/code&gt;, &lt;code&gt;archivedOn&lt;/code&gt;, &lt;code&gt;completedOn&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Date&lt;/code&gt;: &lt;code&gt;createdAt&lt;/code&gt;, &lt;code&gt;updatedAt&lt;/code&gt;, &lt;code&gt;recordedAt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;현재 시각은 &lt;code&gt;Clock&lt;/code&gt;이 제공하고, 그 시각을 어느 날짜로 해석할지는 TimeZone이 결정하도록 분리했다. 전체 설계와 구현 코드는 &lt;a href="https://kelly-chui.github.io/posts/stackday-dev-log-localday-time-boundary/"&gt;개발일지&lt;/a&gt;에 정리했다.&lt;/p&gt;</description></item><item><title>StackDay. Date는 날짜가 아니다</title><link>https://kelly-chui.github.io/posts/stackday-dev-log-localday-time-boundary/</link><pubDate>Tue, 18 Aug 2026 17:52:46 +0900</pubDate><guid>https://kelly-chui.github.io/posts/stackday-dev-log-localday-time-boundary/</guid><description>&lt;p&gt;StackDay는 일정 주기의 습관 수행 여부를 기록하는 앱이고, MVP에서는 그 주기를 매일로 고정했다.&lt;/p&gt;
&lt;p&gt;지금까지 구현할 때, &amp;ldquo;어느 날에 수행했는가&amp;quot;와 &amp;ldquo;정확히 언제 기록했는가&amp;quot;를 모두 Foundation의 &lt;code&gt;Date&lt;/code&gt;로 표현했다.&lt;/p&gt;
&lt;p&gt;두 정보는 비슷해 보이지만 다르다. 이 차이를 타입으로 구분하지 않으면 날짜 검증, 중복 기록 검사, 통계 계산마다 같은 해석을 반복하게 된다.&lt;/p&gt;
&lt;p&gt;이번 글에서는 그 문제가 실제 코드에서 어떻게 드러났고, &lt;code&gt;LocalDay&lt;/code&gt;·&lt;code&gt;Clock&lt;/code&gt;·TimeZone을 어떤 경계로 나눴는지 정리한다.&lt;/p&gt;
&lt;h2 id="date타입이-저장하는-것은-순간"&gt;Date타입이 저장하는 것은 순간&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Date&lt;/code&gt;는 연, 월, 일이나 자정 같은 달력 개념을 저장하지 않는다.&lt;/p&gt;</description></item><item><title>StackDay. 비즈니스 규칙과 Entity Identity 분리하기</title><link>https://kelly-chui.github.io/posts/stackday-dev-log-completion-identity/</link><pubDate>Sun, 16 Aug 2026 15:23:36 +0900</pubDate><guid>https://kelly-chui.github.io/posts/stackday-dev-log-completion-identity/</guid><description>&lt;p&gt;현재 StackDay MVP에서는 하나의 &lt;code&gt;Habit&lt;/code&gt;에 대해 하루 한 번만 &lt;code&gt;Completion&lt;/code&gt;을 기록할 수 있다.&lt;/p&gt;
&lt;p&gt;그래서 처음에는 &lt;code&gt;(habitID, completedOn)&lt;/code&gt; 조합을 Completion의 identity처럼 사용해도 될 것 같았고, 실제로 그런 코드도 있었다.&lt;/p&gt;
&lt;p&gt;하지만 &lt;code&gt;Completion&lt;/code&gt; 삭제를 구현하면서 이 둘을 분리해야 한다는 점을 알게 되었다.&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;Completion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Equatable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Identifiable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;habitID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;completedOn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;recordedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h2 id="같은-날의-기록을-찾는-조건"&gt;같은 날의 기록을 찾는 조건&lt;/h2&gt;
&lt;p&gt;같은 &lt;code&gt;Habit&lt;/code&gt;의 같은 날 &lt;code&gt;Completion&lt;/code&gt;을 찾는 데에는 &lt;code&gt;habitID&lt;/code&gt;와 &lt;code&gt;completedOn&lt;/code&gt;이 필요하다. 현재 정책에서는 이 조건으로 중복 기록도 막을 수 있다.&lt;/p&gt;
&lt;p&gt;하지만 이것은 현재 정책에서 필요한 조회 조건이다. 이후 시간 단위로 습관을 기록하거나, 하루에 여러 번 수행하는 &lt;code&gt;Habit&lt;/code&gt;이 생기면 같은 조합으로 여러 &lt;code&gt;Completion&lt;/code&gt;이 존재할 수 있다.&lt;/p&gt;</description></item><item><title>StackDay. UseCase와 Entity는 각각 어디까지 책임져야 할까</title><link>https://kelly-chui.github.io/posts/stackday-dev-log-usecase-entity-responsibilities/</link><pubDate>Fri, 14 Aug 2026 16:31:52 +0900</pubDate><guid>https://kelly-chui.github.io/posts/stackday-dev-log-usecase-entity-responsibilities/</guid><description>&lt;p&gt;&lt;code&gt;CreateHabitUseCase&lt;/code&gt;를 시작으로 여러 유즈케이스를 구현하면서, 도메인 규칙을 어디에 두어야 할지 계속 고민하게 됐다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Habit&lt;/code&gt;을 생성할 때 이름의 유효성을 누가 검증해야 하는지, &lt;code&gt;Completion&lt;/code&gt;을 남길 때 해당 날짜에 기록할 수 있는지는 누가 판단해야 하는지처럼 비슷한 문제가 반복해서 나타났다.&lt;/p&gt;
&lt;p&gt;처음에는 유즈케이스가 사용자의 작업을 처리하니 이런 검증도 함께 담당하면 된다고 생각할 수 있었다. 하지만 구현을 진행할수록 엔티티가 스스로 보장해야 하는 규칙과 유즈케이스 작업의 흐름을 위해 판단해야 하는 규칙을 구분할 필요가 있었다.&lt;/p&gt;
&lt;p&gt;이 포스트에서는 &lt;code&gt;Habit&lt;/code&gt;의 생성과 &lt;code&gt;Completion&lt;/code&gt; 기록을 중심으로 어떤 고민을 했는지와 어떻게 해결했는지를 정리한다.&lt;/p&gt;</description></item><item><title>StackDay. 책임 분리와 타입 분리</title><link>https://kelly-chui.github.io/posts/stackday-dev-log-separating-responsibility-and-types/</link><pubDate>Thu, 13 Aug 2026 18:32:51 +0900</pubDate><guid>https://kelly-chui.github.io/posts/stackday-dev-log-separating-responsibility-and-types/</guid><description>&lt;p&gt;이전 작업에서 &lt;code&gt;HabitStreak&lt;/code&gt;을 구현하면서 계산 결과와 계산 로직을 분리했다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;HabitStreak&lt;/code&gt;은 현재 스트릭과 최장 스트릭이라는 값만 표현하고, 계산은 &lt;code&gt;HabitStreakCalculator&lt;/code&gt;가 담당한다.&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;HabitStreak&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Equatable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;current&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;longest&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;HabitStreakCalculator&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;func&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;habit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Habit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Completion&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;referenceDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Calendar&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;HabitStreak&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;같은 원리로 &lt;code&gt;HabitStatistics&lt;/code&gt;도 파생 값과 계산 책임을 분리해서 구현했다.&lt;/p&gt;
&lt;h2 id="habitstatistics"&gt;HabitStatistics&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;HabitStatistics&lt;/code&gt;는 Habit의 수행 기록을 요약한 파생 값이다.&lt;/p&gt;
&lt;p&gt;MVP에서는 다음 값을 제공한다.&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;HabitStatistics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Equatable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;totalCompletedDays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;eligibleTrackingDays&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;completionRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Double&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;streak&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;HabitStreak&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;&lt;code&gt;totalCompletedDays&lt;/code&gt;는 추적 기간 안에서 완료한 날짜의 수이고, &lt;code&gt;eligibleTrackingDays&lt;/code&gt;는 시작일부터 기준일까지 추적 대상이 된 날짜의 수다. 아카이브된 Habit은 &lt;code&gt;archivedOn&lt;/code&gt;을 마지막 추적일로 사용한다.&lt;/p&gt;</description></item></channel></rss>