스트링 교체 시점은 날짜가 아니라 사용량으로 정해집니다. 같은 한 달이라도 주 1회 치는 사람과 주 4회 치는 사람은 코트에서 보낸 시간이 네 배 차이 납니다. 달력은 똑같이 흘러도 스트링이 받은 부하는 전혀 다릅니다.
String GOAT도 처음에는 작업 날짜에 교체 주기를 더하는 방식이었습니다. 저 역시 스트링을 직접 매는 동호인이라, 이 기준이 어디서 어긋나는지는 쓰면서 계속 느꼈습니다. 많이 친 주와 거의 못 친 주가 같은 날 같은 알림을 받으니까요.
기준을 날짜에서 사용량으로 옮기고 싶었지만 거기서 막혔습니다. 플레이 시간은 경기가 끝나고 "오늘 두 시간 반쯤 쳤나" 하고 어림잡는 순간 데이터가 아니라 기억이 됩니다. 타구 수는 셀 방법도 없습니다. 스트링 기록 앱을 만들면서도 정작 스트링이 얼마나 일했는지는 채울 방법이 없었던 셈입니다.
워치 앱은 그 구멍을 메우려고 만들었습니다. 애플워치나 갤럭시워치에서 세션을 시작하면 타구 수와 플레이 시간이 기록되고, 그 기록이 교체 시점 판단으로 들어갑니다.
다만 만드는 쪽에서 넘어야 할 제약이 하나 있었습니다. 테니스를 칠 때 워치는 보통 라켓을 잡지 않는 손목에 찹니다. 라켓 손에 차면 그립이 불편하고 충격이 그대로 전달되기 때문입니다. 그런데 타구를 세는 쪽에서는 이 습관이 불리합니다. 공이 맞는 순간의 충격은 라켓을 쥔 팔에 가장 뚜렷하게 남고, 반대쪽 팔에는 훨씬 약하게 전해집니다. 그래서 손목 센서로 타구를 세는 기능은 대체로 "워치를 라켓 손에 차라"는 전제에서 출발합니다.
String GOAT는 그 전제를 바꾸지 않는 쪽을 택했습니다. 평소처럼 라켓 반대 손목에 차면 됩니다.
이 글은 스트링을 직접 매거나 교체 주기를 스스로 관리하는 플레이어를 위한 것입니다. 어떻게 동작하는지, 어디까지 정확한지, 그 기록이 교체 판단으로 어떻게 이어지는지 순서대로 정리했습니다.
핵심 요약
- 지원 기기 — watchOS 9.0 이상(Apple Watch Series 4 이상), Wear OS 3.0 이상(갤럭시 워치 등). 페어링된 휴대폰 앱과 함께 동작합니다.
- 착용 위치 — 라켓을 잡지 않은 손목.
- 기록 항목 — 타구 수, 플레이 시간, 심박수, 소모 칼로리, 실외 GPS 경로.
- 정확도 — 빈 스윙과 걷기는 세지 않습니다. 다만 그라운드스트로크 전체로는 약 4분의 3 수준이고, 원핸드 백핸드는 실제보다 적게 잡힙니다.
- 쓰임새 — 누적 플레이 시간이 스트링 종류별 수명 기준과 비교됩니다. 날짜가 아니라 실제 사용량으로 교체 시점을 알려줍니다.
약한 신호에서 타구를 읽는 방법
반대쪽 팔에도 흔적은 남습니다. 다만 약할 뿐입니다. 그래서 필요한 것은 신호를 키우는 방법이 아니라, 약한 신호를 읽도록 학습된 모델입니다.
String GOAT는 KAIST 연구팀이 발표한 Silent Impact 모델을 적용했습니다. 라켓을 쥐지 않은 팔의 움직임만으로 임팩트를 판별하도록 만들어진 모델입니다. 2024년 UIST(ACM 사용자 인터페이스 소프트웨어·기술 심포지엄)에 발표됐고(Park, Yang, Jo), CC BY 4.0 라이선스로 공개되어 저작자 표시를 조건으로 상업적 사용이 가능합니다. String GOAT 앱의 오픈소스 라이선스 화면에도 표기하고 있습니다. 원문은 ACM 디지털 라이브러리에서 볼 수 있습니다.
분석은 워치가 아니라 휴대폰에서 돌아갑니다. 워치는 센서 데이터를 모아 보내고, 휴대폰이 그 데이터를 모델에 넣습니다. 이 과정이 기기 안에서 끝나기 때문에 코트에서 인터넷이 잘 안 잡혀도 감지에는 영향이 없습니다.
한 세션에 기록되는 것
워치 앱에서 라켓을 고르고 세션을 시작하면, 종료할 때까지 다음 항목이 함께 쌓입니다.
| 항목 | 내용 |
|---|---|
| 타구 수 | 임팩트가 감지된 횟수 |
| 플레이 시간 | 세션 시작부터 종료까지 |
| 심박수 | 평균·최대 및 구간별 누적 |
| 소모 칼로리 | 워치 헬스 데이터 기반 |
| 이동 거리·경로 | 실외 세션에서 GPS 사용 시 |
지원 기기는 watchOS 9.0 이상(Apple Watch Series 4 이상)과 Wear OS 3.0 이상(갤럭시 워치 등)입니다. 워치 앱은 페어링된 휴대폰의 String GOAT 앱과 함께 동작하므로 휴대폰에도 앱이 필요합니다.
얼마나 정확한가
타구 수는 화면에 숫자로 나오는 순간 "이게 맞나"라는 질문을 받습니다. 여기 적는 수치는 논문이 보고한 성능이 아니라 우리 앱에서 직접 측정한 결과입니다. 같은 모델이라도 워치 기종과 처리 과정이 다르면 결과가 달라지기 때문입니다.
확실한 쪽부터 봅니다. 공 없이 라켓만 휘두르는 동작은 세지 않습니다. 실내 테스트에서 빈 스윙 30회가 0으로 기록됐고, 걷거나 서 있는 구간도 0이었습니다. 스윙 동작이 아니라 공이 맞는 순간을 감지하기 때문입니다. 라켓을 들고 코트를 이동하거나 공을 주우러 다녀도 숫자가 올라가지 않습니다. 포핸드 위주로 친 테스트에서는 실제 타구 수와 거의 일치했습니다.
부족한 쪽입니다.
- 그라운드스트로크(바운드된 공을 베이스라인에서 치는 포핸드·백핸드) 전체로는 약 4분의 3 수준입니다. 실제로 친 것보다 적게 기록될 수 있습니다.
- 원핸드 백핸드는 특히 적게 잡힙니다. 적용한 모델의 학습 데이터에 원핸드 백핸드 사용자가 거의 없었던 것이 원인으로 보입니다.
- 빠른 발리는 놓칠 수 있습니다. 짧은 간격으로 이어지는 타구가 하나로 합쳐집니다.
- 스트로크 종류는 구분하지 않습니다. 포핸드·백핸드·발리를 나눠 세지 않습니다.
그래서 이 숫자는 심판이 세어준 정확한 타구 수가 아닙니다. 세션끼리 비교하는 운동량 지표에 가깝습니다. 오늘이 지난주보다 많았는지, 이 스트링으로 지금까지 얼마나 쳤는지를 보는 데는 충분합니다. 절대값 그대로 쓸 값은 아닙니다.
누적 기록이 교체 알림으로 이어지는 방식
그렇다면 정확하지 않은 숫자로 교체를 판단하는 것 아니냐는 의문이 남습니다. 교체 알림을 움직이는 값은 타구 수가 아니라 플레이 시간입니다. 시간은 세션 시작과 종료로 재기 때문에 추정이 아니라 실측값입니다.
세션이 저장되면 플레이 시간이 라켓별로 누적됩니다. String GOAT는 이 누적 시간을 스트링 종류별 수명 기준과 비교합니다. 폴리와 멀티, 내추럴 거트는 견디는 시간이 서로 다르기 때문에 종류마다 기준이 다르고, 이 값은 자료 조사를 거쳐 정한 것입니다. 스트링이 끊어지지 않아도 성능이 먼저 죽는다는 점은 Tennis Warehouse University의 실험에서도 확인된 내용입니다.
바뀌는 것은 알림이 오는 시점이 아니라 알림의 근거입니다. "매단 지 한 달"이 아니라 "이 스트링으로 실제로 몇 시간을 쳤는가"가 기준이 됩니다. 한 달에 한 번 치는 사람과 주 4회 치는 사람이 같은 날 같은 알림을 받지 않습니다.
타구 수도 라켓별로 함께 쌓입니다. 플레이 시간과 나란히 놓으면, 같은 시간을 쳤어도 타구가 많았던 스트링과 적었던 스트링이 구분됩니다.
텐션 측정과 합치면 판단이 한 단계 더 정확해집니다
누적 시간과 타구 수만으로도 달력보다는 낫습니다. 다만 이것도 결국 얼마나 썼는지를 볼 뿐, 스트링이 지금 어떤 상태인지를 직접 보는 것은 아닙니다.
스트링 상태를 직접 재는 값은 따로 있습니다. 스트링을 맨 직후의 텐션, 그리고 이후에 측정한 DT(동적 텐션, 스트링베드 스티프니스)입니다. 앱에 스트링을 등록할 때 초기 DT를 함께 입력해두면 그 값이 기준점이 되고, 이후 측정할 때마다 점이 하나씩 찍힙니다.
여기에 워치 데이터가 붙으면 축이 하나 더 생깁니다. 텐션이 며칠 만에 얼마나 떨어졌는지가 아니라, 몇 번의 타구를 견디고 얼마나 떨어졌는지를 보게 되는 것입니다. 두 측정 사이에 실제로 몇 개를 쳤는지는 워치가 채워줍니다.
측정값이 쌓이면 String GOAT는 그 궤적을 이어 임계값에 언제 닿을지 추정합니다. 기준은 초기값 대비 손실률과 주관 점수이고, 결과는 예상 교체일 또는 남은 타구 수로 나옵니다. 텐션 측정 데이터가 있으면 자동으로 이 방식이 쓰입니다 — 어떤 신호로 판단할지는 설정이 아니라 데이터 가용성이 정합니다.
