거부기린이 선택한 2가지 제약
By 최호1 min read154 words

거부기린이 선택한 2가지 제약

FE

Intro. 거북목을 피하는 가장 "개발자스러운" 방법

노트북 화면에 가까이 몸을 숙인 채 코딩하는 거북이 캐릭터노트북 화면에 가까이 몸을 숙인 채 코딩하는 거북이 캐릭터

하루 8시간 코딩, 당신의 목은 안녕한가요?

무언가에 집중하다 보면 집중하는 물체와 점점 얼굴이 가까워지는 경험, 모두들 해보셨을 겁니다.

20cm, 10cm... 그러다 보면 고개도 점점 아래로 떨어집니다.

우리는 모두 알고 있습니다. 자세가 점점 망가지고 있다는 걸.

그런데 왜 고치지 못할까요?

그래서 만들었습니다: "신경 쓰지 않아도 되는" 교정 서비스

알람을 설정하고, 타이머를 맞추고, 스트레칭 루틴을 외우고...

모두 일상생활에서 챙기기에 번거롭고 귀찮은 일들입니다.

우리에게 필요한 건 일상에 스며들어 자연스럽게 돌아가는 솔루션이었습니다.

거북기린은 당신이 의식하지 않아도, 잊고 있어도, 당신의 자세를 모니터링하고 필요한 순간에만 알려줍니다.

거부기린의 2가지 설계 원칙: 프라이버시 & UX

거부기린은 기획 단계부터 두 가지 원칙을 고민하며 만들어졌습니다.

첫째, 유저의 영상 혹은 이미지가 외부 서버로 노출되지 않을 것.

둘째, 사용자가 현재 하고 있는 작업에 불편함을 느끼지 않고 거북기린을 사용할 수 있을 것.

과연 거부기린은 이 두 가지 제약사항을 어떻게 풀어나갔을까요?

왜 이게 중요한가? — 당신의 얼굴을 누가 보고 있나요?

시중의 많은 자세 교정 앱들은 이렇게 작동합니다: "AI 분석을 위해 영상을 서버로 전송합니다"

문제는, 일하는 모습이 누군가의 서버에 저장된다는 것입니다.

  • 화상회의 중 피곤한 표정
  • 새벽 2시 야근하는 모습
  • 집 안 배경까지

카메라 피로가 현실인 이유를 아시나요? "누군가 나를 보고 있다"는 의식 때문입니다. 자세 교정 프로그램도 마찬가지입니다. 거부기린은 사용자의 일거수일투족이 서버로 전송된다면, 그건 교정이 아니라 감시라고 생각했습니다.

거부기린은 다릅니다. 모든 처리는 사용자의 컴퓨터 안에서만 일어납니다.

모든 처리를 클라이언트에서

거부기린은 자세 교정의 핵심인 판정 과정을 서버에 맡기지 않습니다

카메라 프레임을 기반으로 한 추론과 점수 계산, 상태 판단은 모두 사용자의 컴퓨터 내부에서 이루어집니. 서버는 실시간 분석에 관여하지 않으며, 사용자는 “누군가 보고 있다”는 의식 없이 서비스를 사용할 수 있습니다.

아래는 거부기린의 실제 처리 흐름입니다.

거부기린 데이터 처리 흐름거부기린 데이터 처리 흐름

카메라 입력은 로컬 모델로 바로 전달되고, 자세 추론과 점수 계산 역시 클라이언트 환경에서 처리됩니다. 이 결과를 바탕으로 자세가 무너졌을 때만 UI 알림이 발생합니다. 이 과정에서 영상 프레임이나 이미지 데이터는 외부로 전송되지 않습니다.

다만 서비스 개선과 사용자 피드백을 위해 최소한의 통계는 필요하다. 이때 서버로 전송되는 것은 결과에 대한 요약 정보뿐입니다. 예를 들어 자세 점수, 좋은/나쁜 자세 상태, 지속 시간 같은 집계 데이터만 JSON 형태로 전달된다. 개발자 도구의 Network 탭에서 확인할 수 있듯, 전송되는 요청에는 이미지·비디오·프레임 데이터가 포함되지 않습니다.

거부기린은 프라이버시를 “우리가 안 본다”는 선언으로 해결하지 않았습니다.

애초에 볼 수 없는 구조, 즉 원본은 로컬에만 남고 서버에는 판단 결과만 남는 구조로 설계했습니다. 이것이 거부기린이 선택한 프라이버시 보장의 방식입니다.

On-Device AI로 가능했던 이유 (MediaPipe Pose)

거부기린이 모든 자세 판정을 클라이언트에서 처리할 수 있었던 이유는 처음부터 온디바이스 실행을 전제로 설계된 모델을 선택했기 때문입니다.

관절 위치를 기준으로 포즈 랜드마크가 표시된 거북이와 기린 캐릭터관절 위치를 기준으로 포즈 랜드마크가 표시된 거북이와 기린 캐릭터

MediaPipe Pose는 브라우저와 데스크톱 환경에서 실시간으로 동작할 수 있도록 최적화된 포즈 추정 모델입니다. 서버 GPU를 전제로 한 대형 모델과 달리, 비교적 가벼운 연산 비용으로도 인체의 주요 관절 좌표를 안정적으로 추정할 수 있습니다. 덕분에 영상 프레임을 서버로 전송하지 않고도, 로컬 환경에서 즉각적인 자세 분석이 가능했습니다.

MediaPipe Pose는 이미지 자체를 다루는 대신, 관절 좌표(landmarks)라는 구조화된 수치 데이터를 반환합니다. 거부기린은 이 좌표를 기반으로 목의 기울기, 상체 각도 같은 지표를 계산하고, 이를 다시 “좋은 자세 / 나쁜 자세”라는 단순한 판단으로 변환합니다. 즉, 원본 영상은 판정 과정 이후 더 이상 필요하지 않으며, 외부로 전송될 이유도 없었습니다.

이러한 구조는 프라이버시와 UX 모두에 직접적인 영향을 미쳤습니다. 네트워크 지연 없이 즉각적인 피드백이 가능했고, 사용자는 카메라를 켜고 있다는 사실을 의식하지 않아도 됐습니다. On-Device AI는 단순한 기술 선택이 아니라, “감시당하지 않는 자세 교정” 이라는 거부기린의 방향성을 가능하게 한 전제 조건이었습니다.

ML 모델 대신 간단한 기하학 수식 활용

MediaPipe Pose는 인체의 주요 관절 좌표를 안정적으로 추출해줍니다.

하지만 거부기린이 최종적으로 알고 싶었던 것은 사람을 식별하거나 복잡한 포즈를 분류하는 일이 아니라, 지금 이 순간 자세가 유지되고 있는지, 아니면 무너지고 있는지였습니다. 이 문제를 해결하는 데에는 추가적인 ML 모델이 반드시 필요하지는 않다고 판단했습니다.

거부기린은 포즈 모델이 반환한 관절 좌표를 입력으로 받아, 이를 사람이 이해할 수 있는 규칙 기반 판정 로직으로 해석해줍니다. 즉, ML은 “몸의 형태를 읽는 역할”까지만 담당하고, 실제로 알림을 보낼지 말지에 대한 판단은 명확한 기준을 가진 로컬 로직이 수행합니다.

이 선택은 여러 측면에서 장점을 가졌습니다. 계산량이 적어 실시간 처리에 부담이 없었고, 환경이나 네트워크 상태에 영향을 받지 않았습니다. 또한 판정 기준이 명확하기 때문에 동작이 예측 가능했고, 예상치 못한 오작동이 발생했을 때도 원인을 빠르게 추적할 수 있었습니다. 무엇보다 추가 학습 데이터나 서버 연산 없이도 충분한 정확도를 확보할 수 있어, 모든 처리를 로컬에서 끝낼 수 있었습니다.

거부기린은 ML을 최소화한 것이 아니라, 필요한 지점에만 정확히 사용했습니다. 인식은 모델에게 맡기고, 판단은 규칙으로 수행하는 구조를 선택함으로써, 서비스는 과도한 복잡성을 피하면서도 일관된 사용자 경험을 제공할 수 있었습니다.

클라우드 AI의 정교함 vs 사용자 프라이버시

클라우드 기반 AI를 사용했다면, 더 정교한 분석도 가능했을 것입니다. 서버 GPU 자원을 활용해 복잡한 모델을 실행하고, 더 많은 맥락을 고려한 자세 분류나 개인화된 학습도 충분히 선택지에 있었습니다. 기술적으로만 보면, 클라우드 AI는 분명 더 강력한 도구입니다.

하지만 그 정교함의 대가는 사용자의 영상 데이터였습니다. 실시간 판정을 위해 카메라 프레임을 서버로 전송해야 하고, 이는 곧 사용자의 작업 환경과 일상이 외부 시스템을 거친다는 의미가 됩니다. 거부기린이 해결하고자 했던 문제는 “더 정확한 분석”이 아니라, 사용자가 의식하지 않아도 되는 자세 교정이었기 때문에 이 선택은 쉽게 받아들일 수 없었습니다.

거부기린은 정교함보다 신뢰를 택했다. 모든 판정을 로컬에서 수행하는 구조를 선택함으로써, 분석의 복잡성에는 일정한 한계가 생겼지만 대신 사용자는 카메라 사용에 대한 불안 없이 서비스를 사용할 수 있습니다.

이 트레이드오프는 기술적 타협이라기보다, 서비스의 방향성에 대한 선택이었다. 거부기린은 “가능한 가장 똑똑한 AI”보다, 사용자가 가장 안심하고 켜둘 수 있는 AI를 만들고자 했습니다. 그리고 이 기준에서 보면, 클라우드 AI를 사용하지 않은 선택은 제한이 아니라 필수 조건에 가까웠습니다.

UX: 사용자의 집중을 끊지 않습니다

브라우저 탭에 갇힌 웹 앱의 한계

브라우저 화면 안에 갇힌 거북이와 기린 캐릭터를 표현한 일러스트브라우저 화면 안에 갇힌 거북이와 기린 캐릭터를 표현한 일러스트

웹은 접근성이 뛰어나고 배포가 쉽다는 장점이 있습니다. 하지만 거부기린이 지향한 사용 경험을 구현하기에는, 브라우저라는 환경 자체가 여러 제약을 가집니다. 특히 “사용자가 의식하지 않아도 자연스럽게 동작하는 서비스”를 만들기에는 웹 앱은 구조적으로 불리했습니다.

웹 환경에서는 시스템 레벨의 제어가 제한적이다. 항상 화면 위에 표시되는 UI, 작업 흐름을 방해하지 않는 알림, 장시간 실행을 전제로 한 안정성 같은 요소들은 브라우저만으로는 구현에 한계가 있었습니다. 결과적으로 웹 앱은 사용자가 “의도적으로 켜두고 관리해야 하는 도구”에 머물 수밖에 없습니다.

거부기린이 해결하고자 했던 문제는 사용자가 앱을 계속 신경 쓰게 만드는 것이 아니었습니다. 오히려 사용자의 일상과 작업 흐름 속에 자연스럽게 스며들어, 필요할 때만 존재감을 드러내는 것이 목표였습니다. 브라우저 탭에 갇힌 웹 앱 구조는 이 목표와 근본적으로 맞지 않았고, 이는 이후 기술 선택에 중요한 기준이 되었습니다.

왜 Electron인가?

거부기린은 웹 앱의 한계를 인지한 시점부터, 브라우저 밖에서 동작하는 환경을 전제로 다시 설계를 시작했습니다. 이때 가장 중요했던 기준은 두 가지였습니다. 하나는 기존에 쌓아온 React 기반 개발 경험을 최대한 유지하는 것, 다른 하나는 웹으로는 구현하기 어려웠던 네이티브에 가까운 사용자 경험을 제공하는 것이었습니다.

Electron은 이 두 조건을 동시에 만족시키는 선택지였다. React로 UI와 상태 관리를 그대로 가져가면서도, 데스크톱 애플리케이션이 제공할 수 있는 시스템 레벨의 기능을 사용할 수 있었습니다. 덕분에 거부기린은 새로운 기술 스택에 적응하는 데 시간을 쓰기보다, 서비스의 핵심 문제와 사용자 경험에 집중할 수 있었습니다.

방해하지 않는 '항상 위 위젯'

데스크톱 환경에서 실행 중인 거부기린 애플리케이션 화면데스크톱 환경에서 실행 중인 거부기린 애플리케이션 화면

자세 교정 서비스는 항상 켜져 있어야 의미가 있지만, 동시에 사용자의 작업을 방해해서는 안 됩니다. Electron 환경에서는 항상 위에 표시되는 작은 위젯 형태의 UI를 구현할 수 있었고, 이를 통해 사용자는 별도의 창 전환 없이도 현재 상태를 인지할 수 있었습니다.

이 위젯은 화면을 가리지 않도록 최소한의 정보만 노출하며, 사용자가 집중하고 있는 작업 흐름을 끊지 않습니다. 브라우저 탭이나 전체 창을 띄워두지 않아도 되는 구조는, “의식하지 않아도 돌아가는 서비스”라는 거부기린의 목표와 잘 맞아떨어졌습니다.

OS 통합 시스템 알림

자세 교정과 스트레칭을 안내하는 거부기린 시스템 알림자세 교정과 스트레칭을 안내하는 거부기린 시스템 알림

또 하나의 중요한 요소는 알림 방식이었습니다. 웹 알림은 브라우저 상태나 권한에 크게 의존하며, 사용자가 놓치기 쉽습니다. 반면 Electron을 사용하면 운영체제의 네이티브 알림 시스템과 직접 연동할 수 있습니다.

거부기린은 이를 활용해, 자세가 일정 시간 이상 무너졌을 때만 OS 차원의 알림을 전달합니다. 알림은 눈에 띄지만 과하지 않게 설계되었고, 사용자는 현재 작업을 멈추지 않은 상태에서도 자연스럽게 인지할 수 있습니다. 이는 단순한 기술 기능이 아니라, UX 설계의 중요한 일부였습니다.

Outro

거부기린은 거창한 문제를 해결하려는 서비스는 아닙니다. 다만 하루 종일 컴퓨터 앞에 앉아 있는 사람이라면 누구나 겪는 불편함을, 최대한 조용하고 성가시지 않은 방식으로 다뤄보고 싶었습니다.

피드백 주시면 감사하겠습니다.

링크

Comments

Your random name is:
거부기린이 선택한 2가지 제약 | 거부기린