본문 바로가기
조그만 기술로 세상을 이롭게/건강시계어때

건강시계어때 개발 방법 및 주요 모듈 정리

by eplus 2026. 9. 19.

1. 건강시계어때는 어떤 구조의 앱인가?

건강시계어때는 .NET MAUI와 C#을 이용해 개발한 Android 중심의 생활 건강관리 앱입니다.

단순한 만보계나 운동 기록 앱이 아니라 다음 기능을 하나의 앱으로 통합하는 것을 목표로 합니다.

  • 현재 시각과 세계시간
  • 타이머와 스톱워치
  • 음력 날짜
  • 자동 만보계
  • 달리기
  • 수영
  • 근력운동
  • 실내자전거
  • 체중 및 BMI
  • 운동별 예상 소비 칼로리
  • 운동 기록
  • 기록 공유
  • Android 홈 화면 위젯

앱의 핵심 개념은

시계 → 일상 활동 확인 → 운동 기록 → 체중 변화 확인

이라는 흐름입니다.


2. 개발 환경

현재 프로젝트는 다음 환경을 기준으로 구성했습니다.

  • C#
  • .NET 10
  • .NET MAUI
  • Android API 36
  • XAML
  • Android Sensor API
  • Android App Widget
  • 로컬 데이터 저장
  • CSV 공유

프로젝트 파일은 다음과 같습니다.

eHealth.slnx
eHealth.csproj

Android Target Framework는 다음처럼 설정합니다.

<TargetFramework>net10.0-android</TargetFramework>

빌드나 배포 시에도 net10.0이 아니라 반드시

net10.0-android

를 사용해야 합니다.

예:

dotnet publish eHealth.csproj ^
-f net10.0-android ^
-c Release

3. 전체 프로그램 구조

앱이 커지면 화면 코드에 모든 기능을 넣지 않는 것이 중요합니다.

권장 구조는 다음과 같습니다.

eHealth
│
├─ Models
│  ├─ AppSettings.cs
│  ├─ WeightRecord.cs
│  ├─ ExerciseRecord.cs
│  ├─ WalkingRecord.cs
│  ├─ RunningRecord.cs
│  ├─ SwimmingRecord.cs
│  └─ WorldCity.cs
│
├─ Services
│  ├─ DataService.cs
│  ├─ StepCounterService.cs
│  ├─ CalorieService.cs
│  ├─ ClockService.cs
│  ├─ ExerciseService.cs
│  ├─ ShareService.cs
│  └─ TimerAlarmService.cs
│
├─ Views
│  ├─ ClockPage.xaml
│  ├─ WalkingPage.xaml
│  ├─ RunningPage.xaml
│  ├─ SwimmingPage.xaml
│  ├─ ExercisePage.xaml
│  ├─ WeightPage.xaml
│  ├─ HistoryPage.xaml
│  ├─ SettingsPage.xaml
│  └─ AboutPage.xaml
│
├─ Platforms
│  └─ Android
│     ├─ MainActivity.cs
│     ├─ AndroidManifest.xml
│     ├─ StepCounterService.cs
│     └─ Widget
│        └─ HealthClockWidget.cs
│
├─ Resources
│  ├─ Images
│  ├─ Fonts
│  └─ Styles
│
├─ App.xaml
├─ App.xaml.cs
├─ AppShell.xaml
└─ MauiProgram.cs

실제 프로젝트 규모가 작다면 Models와 Services를 조금 단순하게 가져가도 됩니다.

하지만 화면과 데이터 처리 코드를 분리하는 것이 유지보수에는 훨씬 유리합니다.


4. 화면 구성

전체 메뉴는 다음과 같이 구성했습니다.

시계
걷기
달리기
수영
운동
체중
기록
설정
안내

왼쪽 사이드 메뉴에서는 모든 기능을 사용할 수 있고 하단에는 자주 사용하는 기능만 배치했습니다.

시계 | 걷기 | 수영 | 운동 | 안내

하단 메뉴는 Android 기본 TabBar를 사용하지 않고 5개의 메뉴를 직접 배치했습니다.

이렇게 하면 Android에서 탭 수가 많아질 때 발생할 수 있는 More 메뉴를 피할 수 있습니다.


5. 시계 모듈

시계 화면은 건강시계어때의 시작 화면입니다.

주요 기능은 다음과 같습니다.

현재시간
날짜
음력
세계시간
타이머
스톱워치

현재 시간

MAUI DispatcherTimer 또는 IDispatcherTimer를 사용할 수 있습니다.

예:

var timer = Dispatcher.CreateTimer();

timer.Interval = TimeSpan.FromSeconds(1);

timer.Tick += (s, e) =>
{
    TimeLabel.Text = DateTime.Now.ToString("HH:mm:ss");
};

timer.Start();

1초 간격으로 화면을 갱신합니다.


6. 음력 날짜

한국 음력은 .NET의

KoreanLunisolarCalendar

를 이용할 수 있습니다.

예:

var calendar = new KoreanLunisolarCalendar();
var today = DateTime.Today;

int year = calendar.GetYear(today);
int month = calendar.GetMonth(today);
int day = calendar.GetDayOfMonth(today);

윤달 여부도 확인해 표시할 수 있습니다.

화면에서는

2026년 9월 19일
음력 8월 9일

형태로 표현합니다.


7. 세계시계

서울은 기본 도시로 고정하고 다른 도시는 사용자가 설정에서 추가하거나 삭제합니다.

도시 모델 예:

public class WorldCity
{
    public string Name { get; set; } = "";
    public string TimeZoneId { get; set; } = "";
}

대표적인 도시:

서울
도쿄
런던
파리
뉴욕
로스앤젤레스
두바이
시드니

시간대 계산 시 단순히

서울 +9
뉴욕 -5

처럼 고정값을 사용하면 안 됩니다.

서머타임 때문에 시차가 계절별로 달라질 수 있기 때문입니다.

따라서 TimeZoneInfo를 사용합니다.

var cityTime =
    TimeZoneInfo.ConvertTimeFromUtc(
        DateTime.UtcNow,
        timeZone);

서울 기준 시차도 현재 UTC Offset을 비교합니다.

화면에는

뉴욕  18:30
서울보다 13시간 늦음

같이 표시합니다.


8. 타이머

타이머는 카운트다운 방식입니다.

사용자가

5분
10분
30분

등을 설정하고 시작합니다.

내부적으로는 남은 시간을 초 단위로 관리하는 것이 편합니다.

int remainSeconds = 300;

1초마다 감소시킵니다.

remainSeconds--;

var ts = TimeSpan.FromSeconds(remainSeconds);

TimerLabel.Text =
    ts.ToString(@"mm\:ss");

0초가 되면 알람 모듈을 실행합니다.


9. 타이머 종료 알람

Android에서는 기본 알람음을 이용할 수 있습니다.

var uri =
    RingtoneManager.GetDefaultUri(
        RingtoneType.Alarm);

var ringtone =
    RingtoneManager.GetRingtone(
        Android.App.Application.Context,
        uri);

ringtone.Play();

건강시계어때에서는 한 번만 짧게 울리기보다는 사용자가 쉽게 알아차릴 수 있도록 여러 차례 반복하도록 구성했습니다.

예:

알람
진동
약 5회 반복

사용자가 확인 버튼을 누르면 즉시 중지합니다.

반복 알람은 반드시 CancellationToken을 사용해 취소 가능하게 만드는 것이 좋습니다.


10. 만보계 모듈

건강시계어때에서 가장 중요한 기능 중 하나입니다.

스마트폰 자체 센서를 사용합니다.

Android 센서:

SensorType.StepCounter

TYPE_STEP_COUNTER

입니다.

별도의 스마트워치나 외부 만보계가 없어도 지원 센서가 있는 스마트폰이라면 측정할 수 있습니다.


11. StepCounterService

Android Sensor Event Listener를 사용합니다.

중요한 점은 다음입니다.

ISensorEventListener

는 Java 인터페이스이므로 MAUI에서 구현할 때

Java.Lang.Object

를 상속해야 합니다.

예:

public class StepCounterService :
    Java.Lang.Object,
    ISensorEventListener
{
}

그렇지 않으면 다음과 같은 오류가 발생할 수 있습니다.

IJavaObject.Handle을 구현하지 않습니다.
IJavaPeerable...
Dispose...
JniPeerMembers...

12. Step Counter 센서 연결

예:

var sensorManager =
    (SensorManager)Android.App.Application.Context
    .GetSystemService(Context.SensorService)!;

var sensor =
    sensorManager.GetDefaultSensor(
        SensorType.StepCounter);

센서가 없을 수도 있으므로 반드시 확인합니다.

if (sensor == null)
{
    // 이 기기는 Step Counter 미지원
    return;
}

센서 등록:

sensorManager.RegisterListener(
    this,
    sensor,
    SensorDelay.Normal);

13. Step Counter 값의 특징

TYPE_STEP_COUNTER는 오늘 걸음 수를 바로 반환하는 센서가 아닙니다.

보통 기기 부팅 후 누적 걸음 수를 반환합니다.

예:

센서 값 = 128,520

오늘 처음 앱을 실행했을 때:

기준값 = 124,000

이라면

오늘 걸음수 =
128,520 - 124,000
= 4,520보

형태로 계산해야 합니다.

따라서 날짜별 기준값을 저장하는 구조가 중요합니다.


14. ACTIVITY_RECOGNITION 권한

Android에서는 걸음 센서를 위해 다음 권한이 필요할 수 있습니다.

<uses-permission
    android:name=
    "android.permission.ACTIVITY_RECOGNITION" />

런타임 권한도 처리해야 합니다.

중요한 점은 앱 시작과 동시에 무조건 요청하지 않는 것입니다.

권장 흐름:

사용자가 걷기 메뉴 선택
        ↓
걸음 센서 사용 목적 설명
        ↓
사용자가 사용 버튼 선택
        ↓
ACTIVITY_RECOGNITION 권한 요청

권한을 거부하더라도 다른 기능은 사용할 수 있어야 합니다.


15. 걷기 거리 계산

사용자의 보폭을 설정해 거리 계산에 활용합니다.

예:

보폭 70cm
걸음수 5,000

거리:

5,000 × 0.70m
= 3,500m
= 3.5km

C#:

double distanceKm =
    steps * strideMeters / 1000.0;

보폭은 개인차가 크므로 설정에서 사용자가 변경할 수 있게 합니다.


16. 칼로리 계산

운동 칼로리는 일반적으로 MET 기반 추정식을 사용할 수 있습니다.

개념적으로

MET × 체중 × 운동시간

을 이용합니다.

예:

double calories =
    met *
    weightKg *
    durationHours;

실제 계산 시 운동 종류에 따라 MET 값을 다르게 적용합니다.

예:

걷기
달리기
수영
실내자전거
스쿼트
스트레칭

각각 운동 강도가 다릅니다.

앱에서 표시할 때는

약 235 kcal

처럼 예상값임을 명확하게 표현하는 것이 좋습니다.


17. 달리기 모듈

달리기 기록 모델 예:

public class RunningRecord
{
    public DateTime Date { get; set; }

    public double DistanceKm { get; set; }

    public int DurationMinutes { get; set; }

    public double Calories { get; set; }

    public string Memo { get; set; } = "";
}

평균 페이스는

운동시간 ÷ 거리

로 계산합니다.

예:

30분 ÷ 5km
= 6분/km

18. 수영 모듈

수영은 휴대폰을 수영 중 직접 사용하기 어렵기 때문에 기본적으로 운동 후 기록 방식입니다.

관리 데이터:

강습 / 자유수영
25m / 50m
랩 수
수영거리
수영시간
영법
칼로리

모델 예:

public class SwimmingRecord
{
    public DateTime Date { get; set; }

    public string Type { get; set; } = "";

    public int PoolLength { get; set; }

    public int Laps { get; set; }

    public double DistanceMeters { get; set; }

    public int DurationMinutes { get; set; }

    public string Stroke { get; set; } = "";

    public double Calories { get; set; }
}

수영거리:

distance =
    poolLength * laps;

예:

25m × 40랩 = 1,000m

19. 운동 관리 모듈

현재 관리하는 운동은 다음과 같습니다.

매달리기
턱걸이
스쿼트
팔굽혀펴기
윗몸일으키기
플랭크
스트레칭
실내자전거

운동별 측정 단위가 다릅니다.

턱걸이         회
스쿼트         회
팔굽혀펴기     회
윗몸일으키기   회

매달리기       초
플랭크         초

스트레칭       분
실내자전거     분

따라서 모델에서 단위를 함께 관리하면 편합니다.


20. 선택한 운동만 표시

모든 사용자가 모든 운동을 하지는 않습니다.

따라서 설정에

☑ 스쿼트
☑ 팔굽혀펴기
☐ 턱걸이
☑ 플랭크

같은 체크박스를 제공합니다.

설정 모델:

public class ExerciseSetting
{
    public string ExerciseType { get; set; } = "";

    public bool Enabled { get; set; }

    public double Goal { get; set; }
}

운동 화면에서는

var enabledExercises =
    settings.Exercises
    .Where(x => x.Enabled)
    .ToList();

처럼 선택된 운동만 보여줍니다.

체크를 해제해도 기존 기록은 삭제하지 않는 것이 좋습니다.


21. 체중 관리

체중 기록:

public class WeightRecord
{
    public DateTime Date { get; set; }

    public double WeightKg { get; set; }

    public string Memo { get; set; } = "";
}

설정에는 다음 정보가 있습니다.

기본 체중
키
보폭
목표 체중

가장 최근 체중 기록이 있으면 칼로리 계산에 최근 체중을 사용합니다.

없으면

기본 체중

을 사용합니다.


22. BMI 계산

BMI는

체중(kg) ÷ 키(m)²

입니다.

C#:

double heightM =
    heightCm / 100.0;

double bmi =
    weightKg /
    (heightM * heightM);

BMI 역시 건강 참고용 정보로 표현해야 합니다.


23. 기록 통합

건강시계어때에서는

걷기
달리기
수영
운동
체중

기록을 하나의 기록 화면에서 확인합니다.

기간 필터:

오늘
7일
30일
전체

항목 필터:

전체
걷기
달리기
수영
운동
체중

이런 구조를 사용하면 기록이 많아져도 쉽게 조회할 수 있습니다.


24. 기록 공유

.NET MAUI의 Share API를 이용합니다.

텍스트 공유:

await Share.Default.RequestAsync(
    new ShareTextRequest
    {
        Text = shareText,
        Title = "건강시계어때 기록"
    });

Android 공유창이 열리고 사용자가

카카오톡
문자
메일
Drive
기타 앱

중 원하는 앱을 선택합니다.


25. CSV 공유

기록이 많을 경우 텍스트보다 CSV가 좋습니다.

예:

날짜,구분,운동,시간,거리,칼로리
2026-09-19,걷기,,35,4.2,210
2026-09-19,운동,스쿼트,,100,45

한글 Excel 호환을 위해 UTF-8 BOM을 포함하는 것이 좋습니다.

await File.WriteAllTextAsync(
    path,
    csv,
    new UTF8Encoding(true));

생성 위치는 앱 CacheDirectory를 사용하는 것이 좋습니다.


26. 로컬 데이터 저장

건강시계어때는 서버 중심 앱이 아니므로 기록은 기본적으로 기기 내부에 저장합니다.

간단한 설정값은

Preferences.Default

을 사용할 수 있습니다.

예:

Preferences.Default.Set(
    "DefaultWeight",
    70.0);

복잡한 기록은 JSON으로 저장할 수 있습니다.

string json =
    JsonSerializer.Serialize(data);

await File.WriteAllTextAsync(
    filePath,
    json);

향후 기록량이 크게 늘어나면 SQLite로 변경하는 것도 좋은 방법입니다.


27. 저장 데이터 오류 방어

모바일 앱에서는 저장 파일이 손상되거나 이전 버전 데이터와 구조가 다를 수 있습니다.

따라서 반드시 예외 처리를 합니다.

try
{
    var json =
        await File.ReadAllTextAsync(path);

    data =
        JsonSerializer.Deserialize<AppData>(json);
}
catch
{
    data = new AppData();
}

앱 실행 시 데이터 하나 때문에 전체 앱이 종료되지 않는 것이 중요합니다.


28. Android 홈 화면 위젯

건강시계어때에는

시간 + 오늘 걸음수

위젯을 추가했습니다.

구성:

현재시간
날짜
오늘 걸음
목표 걸음
진행률

Android에서는

AppWidgetProvider
RemoteViews

를 이용합니다.

시간은 TextClock을 사용하면 시스템이 직접 시간을 갱신하기 때문에 편리합니다.


29. 위젯 걸음수 갱신

Android 위젯은 일반 앱 화면처럼 계속 실행되는 구조가 아닙니다.

따라서 다음 시점에 업데이트합니다.

걸음 데이터 저장
앱 실행
수동 새로고침
Android 위젯 업데이트

위젯을 누르면 건강시계어때 앱을 실행하도록 PendingIntent를 설정합니다.


30. 반응형 화면

MAUI 앱은 다양한 스마트폰 크기와 시스템 글꼴 크기를 고려해야 합니다.

특히 피해야 할 구조는

WidthRequest="350"
HeightRequest="200"

처럼 불필요한 고정 크기를 많이 사용하는 것입니다.

가능하면

<Grid ColumnDefinitions="*,*">

또는

<VerticalStackLayout>

을 사용합니다.

기록 목록도 내부에 고정 높이를 두기보다 전체 페이지 ScrollView가 스크롤하도록 만드는 편이 큰 글꼴에서 안전합니다.


31. 시스템 글꼴 대응

모든 글씨가 시스템 설정에 따라 지나치게 커지면 타이머나 하단 탭 레이아웃이 깨질 수 있습니다.

설명 문구는 폰트 확대를 허용하되

시계
타이머
숫자
하단탭

등 레이아웃에 민감한 부분은 적절히 제한하는 것이 좋습니다.

필요한 경우

FontAutoScalingEnabled="False"

를 선택적으로 사용합니다.

모든 글자에 일괄 적용하는 것은 권장하지 않습니다.


32. Safe Area

Android 기기마다

상태바
카메라 노치
하단 제스처 영역

이 다릅니다.

따라서 화면 콘텐츠와 하단 메뉴가 시스템 영역과 겹치지 않도록 Safe Area를 고려합니다.


33. 앱 강제 종료 방지

모바일 앱에서 가장 중요한 부분 중 하나입니다.

특히 다음 위치는 반드시 예외 처리를 고려합니다.

앱 시작
데이터 읽기
센서 초기화
타이머 알람
공유
위젯 갱신
Shell 생성
페이지 이동
파일 저장

예:

try
{
    await service.StartAsync();
}
catch (Exception ex)
{
    Debug.WriteLine(ex);
}

사용자에게 치명적이지 않은 기능 오류가 앱 전체 종료로 이어져서는 안 됩니다.


34. JavaProxyThrowable 주의

MAUI Android 개발 중

Android.Runtime.JavaProxyThrowable

이 나타날 수 있습니다.

원인이 JavaProxyThrowable 자체인 것은 아닙니다.

보통 내부의

XAML 오류
Android callback 예외
잘못된 Resource
센서 callback 예외

가 Java 쪽으로 전달되면서 감싸진 것입니다.

따라서 먼저 다음을 확인해야 합니다.

누락된 StaticResource
잘못된 PNG
Sensor Listener
Shell/Flyout
async void 이벤트

특히 Android callback에서 async void를 사용할 경우 예외가 밖으로 나가지 않도록 주의해야 합니다.


35. PNG 리소스 주의

MAUI에서는 확장자가 .png인데 실제 파일 포맷이 PNG가 아니면

failed to read PNG signature

오류가 발생합니다.

따라서 이미지 파일은 실제 PNG인지 확인해야 합니다.

빌드 오류가 반복되면

rmdir /s /q bin
rmdir /s /q obj
dotnet restore

후 다시 빌드하는 것이 좋습니다.


36. Google Play 권한 정책

걷기 기능 때문에

android.permission.ACTIVITY_RECOGNITION

권한을 사용합니다.

하지만 권한은 걸음 측정 기능을 위해서만 사용합니다.

사용자에게 다음 내용을 명확히 알려야 합니다.

왜 권한이 필요한지
어떤 데이터를 사용하는지
어디에 저장되는지
외부 전송 여부
권한 거부 시 어떻게 되는지

현재 구조에서는

걸음 데이터 → 기기 내부 저장
체중 → 기기 내부 저장
운동 기록 → 기기 내부 저장

이 기본입니다.


37. 개인정보 처리

설정에

모든 건강 데이터 삭제

기능을 제공하는 것이 좋습니다.

삭제 대상:

걷기 기록
달리기 기록
수영 기록
운동 기록
체중 기록
설정 데이터

사용자가 직접 자신의 데이터를 관리할 수 있게 하는 것이 중요합니다.


38. 추천 서비스 구조

앱이 커지면 다음처럼 서비스 역할을 명확히 나누는 것이 좋습니다.

DataService

데이터 읽기
저장
초기화

StepCounterService

걸음 센서 연결
걸음수 계산
센서 해제

CalorieService

체중 조회
MET 계산
운동별 칼로리 계산

ClockService

세계시간
서울 기준 시차
음력

ExerciseService

운동 목표
운동 기록
선택 운동 관리

ShareService

텍스트 공유
CSV 생성
CSV 공유

TimerAlarmService

타이머 종료 알람
진동
알람 중지

이 정도로 나누면 기능 추가나 수정이 상당히 편해집니다.


39. 데이터 흐름

전체 구조를 간단히 표현하면 다음과 같습니다.

        사용자
           │
           ▼
        MAUI View
           │
           ▼
       View / Service
           │
     ┌─────┼─────┐
     ▼     ▼     ▼
   센서   계산   기록
     │     │     │
     └─────┼─────┘
           ▼
       Local Data
           │
     ┌─────┴─────┐
     ▼           ▼
   화면 표시     공유
                 │
                 ▼
              CSV/Text

서버가 없어도 대부분의 기능을 구현할 수 있습니다.


40. 향후 확장 가능 기능

건강시계어때는 현재 기능에서 다음 단계로 확장할 수도 있습니다.

SQLite

기록이 많아지면 JSON 대신 SQLite 사용

차트

주간 걸음 그래프
월간 체중 그래프
운동 횟수 변화
수영 거리 변화

Health Connect

향후 필요할 경우 Android Health Connect와 연동해

걸음
심박수
체중
운동
수면

등을 통합할 수 있습니다.

단 Health Connect를 추가하면 Google Play의 건강 데이터 정책과 권한 선언을 다시 검토해야 합니다.

스마트워치

Wear OS를 지원하면

걸음
심박수
수영
운동시간

을 더 자동화할 수 있습니다.


41. Google Play 배포

APK 테스트:

dotnet publish eHealth.csproj ^
-f net10.0-android ^
-c Release ^
-p:AndroidPackageFormats=apk

Google Play용:

dotnet publish eHealth.csproj ^
-f net10.0-android ^
-c Release ^
-p:AndroidPackageFormats=aab

서명 키를 사용하는 경우 별도로 Keystore 설정을 추가합니다.

Google Play에서는 AAB를 사용하는 것이 기본입니다.


42. 건강시계어때 개발에서 중요했던 부분

이 앱을 만들면서 기술적으로 가장 중요한 부분을 정리하면 다음과 같습니다.

첫째는 Android 센서와 MAUI의 연결입니다.

만보계는 단순히 MAUI 코드만으로 끝나는 기능이 아니라 Android Sensor API를 연결해야 합니다.

둘째는 로컬 데이터의 안정성입니다.

건강 기록 하나가 손상됐다고 앱 전체가 실행되지 않아서는 안 됩니다.

셋째는 다양한 화면 크기 대응입니다.

스마트폰마다 화면과 글꼴 설정이 다르기 때문에 처음부터 반응형 구조를 고려해야 합니다.

넷째는 운동을 사용자에게 강요하지 않는 구조입니다.

모든 운동을 표시하는 대신 자신이 하는 운동만 선택하도록 하는 것이 사용하기 편합니다.

다섯째는 권한과 개인정보입니다.

건강 앱에서는 기능보다 데이터 취급을 먼저 생각해야 합니다.


마무리

건강시계어때는 기술적으로 아주 복잡한 AI 앱은 아닙니다.

하지만

시계
센서
타이머
세계시간
운동 계산
체중 관리
파일 저장
공유
Android 위젯
권한
Google Play 정책

등 모바일 앱 개발에서 자주 사용하는 여러 기술을 하나의 프로젝트에서 경험할 수 있다는 장점이 있습니다.

특히 .NET MAUI를 이용해 Android 생활 앱을 개발하려는 개발자라면 좋은 예제 프로젝트가 될 수 있습니다.

전체 구조의 핵심은 단순합니다.

센서에서 데이터를 받고 → 필요한 값을 계산하고 → 로컬에 저장하고 → 사용자가 이해하기 쉽게 보여주는 것.

그리고 그 위에 시계와 운동, 체중, 수영, 달리기 같은 기능을 하나씩 확장해 나가는 방식입니다.

처음부터 모든 기능을 만들기보다는

시계 → 만보계 → 운동 → 체중 → 기록 → 공유 → 위젯

순서로 단계적으로 개발하면 훨씬 안정적으로 완성할 수 있습니다.

조그만 기술로 세상을 이롭게.

건강시계어때 역시 거창한 기술보다는 매일 실제로 사용할 수 있는 작은 기능들을 하나씩 연결해서 만든 생활형 앱입니다.

반응형