Watch App: 개념, Apple Watch 및 Wear OS 개발

저자: IT Sectr 게시일: 2026-02-15 읽는 시간: 9 분

Watch App은 웨어러블 기기용 애플리케이션입니다: watchOS를 실행하는 Apple Watch와 Google의 Wear OS를 사용하는 스마트워치. 모바일 앱과 달리 Watch App은 작은 화면(1.5~2인치 대각선), 짧은 상호작용 세션(5~15초), 특정 시나리오(피트니스, 알림, 빠른 응답, 음성 입력)에 최적화되어 있습니다. 개발은 Apple Watch용 SwiftUI와 Android용 Kotlin 및 Jetpack Compose for Wear OS로 이루어집니다. 두 플랫폼의 주요 개념, 아키텍처, 탐색 및 코드 예제를 살펴보겠습니다.

주요 내용

  • Watch App — 짧은 세션(5~15초)과 제한된 화면을 가진 스마트워치용 애플리케이션
  • Apple Watch는 SwiftUI 및 WatchKit이 포함된 watchOS, 엄격한 계층적 탐색 사용
  • Wear OS는 Jetpack Compose for Wear OS, Material You 및 사이드 탐색이 포함된 Kotlin 사용
  • 자율성 — LTE 버전의 시계는 스마트폰 연결 없이 앱 실행 가능
  • 센서 — 가속도계, 자이로스코프, 심박수 모니터, GPS를 두 플랫폼 모두 네이티브 API로 사용 가능

Watch App이란

Watch App은 웨어러블 기기에서 작동하도록 설계된 애플리케이션입니다: Apple Watch(watchOS) 및 Wear OS 스마트워치. 모바일 앱과의 주요 차이점은 폼 팩터입니다. 시계 화면의 대각선은 1.5~2인치(스마트폰의 6~7인치에 비해)로 동시에 표시할 수 있는 정보량이 제한됩니다. 앱과의 상호작용은 짧습니다 — 사용자는 5~15초 안에 시간, 알림, 심박수 또는 걸음 수를 확인한 후 손을 내립니다.

주요 Watch App 시나리오: 피트니스 트래커(걸음 수, 심박수, 칼로리, 수면), 알림(메시지, 전화, 캘린더), 빠른 작업(타이머 시작, 음성으로 메시지 응답, 음악 제어), 컴패니언(카메라 리모컨, 자동차 키, NFC 결제). Counterpoint Research(2026년)에 따르면 글로벌 스마트워치 시장은 연간 1억 5천만 대를 초과하며, Apple Watch가 35%, Wear OS가 20%, 나머지는 Fitbit, Garmin 등이 차지하고 있습니다.

Watch App 제한 사항: 작은 화면(최대 2인치), 제한된 배터리 수명(최대 18~24시간), 전체 키보드 없음(음성 입력 또는 받아쓰기만 가능), 백그라운드 작업 제한(watchOS — 최대 10분, Wear OS — 최대 5분), 대부분의 기능에 전화와의 동기화 필요. watchOS 6(2019) 및 Wear OS 3(2022)부터 앱은 LTE 모듈을 통해 전화와 페어링하지 않고 자율적으로 작동할 수 있습니다.

Apple Watch: watchOS 및 SwiftUI

watchOS는 iOS를 기반으로 하고 동일한 프레임워크(Foundation, UIKit의 적응 버전, SwiftUI)를 사용하는 Apple의 스마트워치용 운영 체제입니다. 개발은 Xcode에서 Swift를 사용하여 이루어집니다. 주요 UI 프레임워크는 SwiftUI로, watchOS 특화 컴포넌트(캐러셀이 포함된 TabView, NavigationStack, DigitalCrownModifier를 통한 디지털 크라운, 길게 누르기 메뉴)를 제공합니다.

watchOS 탐색은 계층적 패러다임을 기반으로 구축됩니다. 주요 요소: 계층적 스택(자동 복귀 기능이 있는 NavigationStack), 모달 프레젠테이션(sheet), 페이지 기반 탐색(.tabViewStyle(.page)이 있는 TabView를 통해), 길게 누르기의 컨텍스트 메뉴. 디지털 크라운은 콘텐츠 스크롤 및 값 변경을 가능하게 합니다. 제스처: 탭, 길게 누르기, 스와이프, Force Touch(watchOS 7까지), 디지털 크라운 회전.

주요 watchOS 프레임워크: HealthKit(건강 데이터 액세스 — 심박수, 걸음 수, 수면, ECG), CoreMotion(가속도계, 자이로스코프), WatchConnectivity(iPhone과 데이터 교환), ClockKit(시계 화면의 컴플리케이션), BackgroundTasks(최대 10분 백그라운드 업데이트), ARKit(Series 9+의 FaceTime 효과). Watch App은 전체 기능(독의 독립형 앱) 또는 확장(iOS 버전과 동시)이 될 수 있습니다.

Wear OS: Kotlin 및 Compose

Wear OS는 Android를 기반으로 하는 Google의 스마트워치용 플랫폼입니다. 최신 개발은 Jetpack Compose for Wear OS가 포함된 Kotlin으로 이루어집니다 — 원형 화면에 최적화된 컴포넌트 세트: Scaffold, ScalingLazyColumn, Chip, Button, Card, Stepper. 모바일 Compose와 달리 Wear OS는 자체 수정자(세로 스크롤용 scrollable, 스와이프용 swipable, 크라운 제어용 RotaryInput)를 사용합니다.

Wear OS 탐색은 사이드 패널(SwipeToDismiss)과 카드 화면을 사용합니다. 주요 요소: SwipeDismissableNavHost(스와이프 백 탐색), 화면 배치(목록용 ScalingLazyColumn), 가로 캐러셀(Carousel), 시계 화면(WatchFaceService를 통한 WatchFace). Google은 뒤로 가기에 사이드 스와이프, 목록에 세로 스크롤을 권장합니다. 시계의 전원 버튼은 최근 앱 목록을 엽니다.

Wear OS의 건강 및 센서: Health Services API(데이터 제공자를 통한 걸음 수, 심박수, 칼로리, 수면, SpO2), SensorManager(가속도계, 자이로스코프, 기압계, 자기계), Location Services(FusedLocationProvider를 통한 GPS). Wear OS 5+는 자동 활동 유형 감지와 함께 달리기, 걷기, 자전거 타기, 수영 추적을 지원합니다. 데이터는 Health Connect를 통해 Google Fit과 동기화됩니다.

코드 예제: Apple Watch용 Swift

SwiftUI 및 HealthKit을 사용한 Apple Watch용 심박수 추적 앱을 살펴보겠습니다.

swift
import SwiftUI
import HealthKit

// 심박수 데이터 모델
struct HeartRateData: Identifiable {
    let id = UUID()
    let bpm: Double
    let date: Date
}

// HealthKit용 ViewModel
@Observable
final class HealthViewModel {
    private let healthStore = HKHealthStore()
    var currentHeartRate: Double = 0
    var isAuthorized: Bool = false

    func requestAuthorization() {
        guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
        else { return }
        let types = Set([heartRateType])
        healthStore.requestAuthorization(toShare: nil, read: types) { success, _ in
            Task { @MainActor in
                self.isAuthorized = success
                if success { self.startHeartRateQuery() }
            }
        }
    }

    func startHeartRateQuery() {
        guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
        else { return }
        let query = HKObserverQuery(
            sampleType: heartRateType, predicate: nil
        ) { [weak self] _, _, _ in
            self?.fetchLatestHeartRate()
        }
        healthStore.execute(query)
    }

    private func fetchLatestHeartRate() {
        guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
        else { return }
        let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
        let query = HKSampleQuery(
            sampleType: heartRateType, predicate: nil,
            limit: 1, sortDescriptors: [sort]
        ) { _, samples, _ in
            guard let sample = samples?.first as? HKQuantitySample else { return }
            let bpm = sample.quantity.doubleValue(for: HKUnit.count().unitDivided(by: .minute()))
            Task { @MainActor in
                self.currentHeartRate = bpm
            }
        }
        healthStore.execute(query)
    }
}

// 메인 화면
struct HeartRateView: View {
    @State private var viewModel = HealthViewModel()

    var body: some View {
        VStack {
            Image(systemName: "heart.fill")
                .foregroundColor(.red)
                .font(.largeTitle)

            Text("\(Int(viewModel.currentHeartRate))")
                .font(.system(size: 60, weight: .bold, design: .rounded))
                .foregroundColor(.red)

            Text("BPM")
                .font(.caption)
                .foregroundColor(.secondary)
        }
        .padding()
        .onAppear(perform: viewModel.requestAuthorization)
    }
}

주요 포인트: HKHealthStore가 HealthKit 데이터 액세스를 요청합니다. HKObserverQuery가 실시간 심박수 변화를 알립니다. HKSampleQuery가 최신 값을 가져옵니다. Watch App은 @Observable 덕분에 currentHeartRate가 변경되면 자동으로 UI를 업데이트합니다. HealthKit은 기기에서 로컬로 데이터를 처리하므로 서버 요청이 필요하지 않습니다.

코드 예제: Wear OS용 Kotlin

Jetpack Compose 및 Health Services API와 함께 Kotlin으로 작성된 Wear OS용 유사한 앱입니다.

kotlin
// MainActivity.kt
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.wear.compose.material.*
import androidx.wear.compose.foundation.arc.BasicArcParams
import com.google.android.horologist.health.HealthService

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            WearAppTheme {
                HeartRateScreen()
            }
        }
    }
}

@Composable
fun HeartRateScreen() {
    var heartRate by remember { mutableIntStateOf(0) }
    var isConnected by remember { mutableStateOf(false) }

    LaunchedEffect(Unit) {
        // HealthService — 센서 액세스용 API
        val healthService = HealthService()
        healthService.connect().onSuccess {
            isConnected = true
        }
    }

    Scaffold(
        timeText = { TimeText() },
        vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }
    ) {
        Column(
            modifier = Modifier
                .fillMaxSize()
                .scrollable(state = ScrollState),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center
        ) {
            Icon(
                imageVector = Icons.Filled.Favorite,
                contentDescription = "심박수",
                modifier = Modifier.size(40.dp),
                tint = MaterialTheme.colors.error
            )

            Text(
                text = heartRate.toString(),
                style = MaterialTheme.typography.display1
            )
            Text(
                text = "BPM",
                style = MaterialTheme.typography.caption2
            )
        }
    }
}

Wear OS 주요 컴포넌트: 표준 레이아웃을 위한 TimeText 및 Vignette가 포함된 Scaffold, 원형 화면 호환성을 위한 .scrollable() 수정자, 심박수 센서 액세스를 위한 HealthService(Horologist). Jetpack Compose for Wear OS는 원형 및 사각형 화면에 자동으로 인터페이스를 적용하므로 개발자가 다양한 폼 팩터를 수동으로 처리할 필요가 없습니다.

자주 묻는 질문

Watch App과 모바일 앱의 차이점은 무엇인가요?

Watch App은 제한된 화면(1.5~2인치 대각선), 소용량 배터리로 작동하며 제스처 제어를 사용합니다. 상호작용이 짧습니다 — 5~15초, 앱은 최대한 간결해야 하며 1~2개의 주요 지표를 표시해야 합니다.

Watch App에는 어떤 언어가 사용되나요?

Apple Watch용 — SwiftUI 및 WatchKit 프레임워크가 포함된 Swift. Wear OS용 — Jetpack Compose for Wear OS가 포함된 Kotlin. 두 플랫폼 모두 선언적 접근 방식으로 인터페이스를 구축합니다.

Watch App이 iPhone 없이 작동할 수 있나요?

네, LTE가 탑재된 Apple Watch Series 3 및 watchOS 6+부터 앱은 시계의 App Store를 통해 자율적으로 작동할 수 있습니다. Wear OS도 시계의 Google Play를 통해 독립적으로 작동하는 LTE 버전을 지원합니다.

Watch App의 제한 사항은 무엇인가요?

주요 제한 사항: 화면 크기(최대 2인치), 제한된 배터리 수명(최대 18시간), 전체 브라우저 또는 키보드 없음, 백그라운드 작업 제한(watchOS — 최대 10분, Wear OS — 최대 5분).

시계의 센서에 어떻게 액세스하나요?

Apple Watch에서는 심박수, 걸음 수, 수면에 HealthKit(HKHealthStore, HKSampleQuery), 가속도계에 CoreMotion을 사용합니다. Wear OS에서는 건강 지표에 Health Services API(Horologist를 통해), 원시 센서 데이터에 SensorManager를 사용합니다.

요약

  • Watch App — 5~15초 세션 및 최대 2인치 화면의 스마트워치용 애플리케이션
  • Apple Watch는 센서 액세스를 위해 SwiftUI, NavigationStack, Digital Crown 및 HealthKit이 포함된 watchOS 사용
  • Wear OS는 Jetpack Compose for Wear OS, Scaffold, ScalingLazyColumn 및 Health Services API가 포함된 Kotlin 사용
  • 자율성 — LTE 모듈을 통해 두 플랫폼 모두 스마트폰 연결 없이 앱 작동 가능
  • HealthKit(watchOS) 및 Health Services(Wear OS)는 심박수, 걸음 수, 수면, SpO2 액세스 제공
  • 제한 사항 — 작은 화면, 18~24시간 배터리, 백그라운드 작업 제한, 키보드 없음
  • 주요 시나리오 — 피트니스 트래커, 알림, 빠른 응답, 원격 제어, NFC 결제

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기