제 목 :
우리집 비서 만들기 프로젝트 #1 - 발단편

지금은 미국 출장 중. 12월이면 한국에 돌아가는데, 돌아가면 꼭 사고 싶은 물건이 하나 생겼다. Even Realities의 스마트 안경 Even G2다.

나는 안경을 쓴다. 어차피 하루 종일 얼굴에 뭔가를 걸치고 다니는데, 그게 화면까지 보여 준다면 마다할 이유가 없다. G2는 카메라도 스피커도 없이 렌즈 안쪽의 초록색 Micro LED 디스플레이로 정보를 보여 주는 안경이고, 무게가 36g밖에 안 된다. 국내에도 8월에 정식 출시되어서, 귀국하면 바로 구매할 생각이다.
그런데 출장지에서 할 일 없이 기다리기 싫어서 내가 쓸 앱을 먼저 만들어 두고 싶었다. 이 프로젝트는 그 생각에서 시작됐다.
G2에서 돌아가는 앱은 사실 웹앱이다
G2에는 Even Hub라는 앱 스토어 겸 개발자 플랫폼이 있다. SDK와 시뮬레이터를 npm으로 받을 수 있어서, 안경이 없어도 지금 당장 개발을 시작할 수 있다. 출장 중인 나한테 딱이다.
문서를 읽어 보니 구조가 재밌다. Even Hub 앱은 웹 기술로 만드는 웹앱이다. 폰에 설치된 Even Realities 앱이 내 앱을 WebView로 띄우고, 안경과의 블루투스 통신은 Even 앱이 대신 처리한다. 앱 로직도 안경이 아니라 폰에서 돈다. 안경은 화면과 입력 장치일 뿐이다.
웹 개발자 입장에서는 반가운 소식이다. Vite에 SDK 하나 붙이면 끝이니까.
참고로 다들 해상도(640×350) 이야기만 하길래 주사율도 찾아봤는데, 패널은 60Hz다. 다만 개발자 입장에서 이 숫자는 큰 의미가 없다. 실제 화면 갱신 속도를 정하는 건 패널이 아니라 폰에서 안경으로 블루투스로 데이터를 보내는 속도이고, SDK는 애니메이션도 지원하지 않는다. G2는 영상을 보는 기기가 아니라 가끔 바뀌는 텍스트를 힐끗 보는 HUD라고 생각하는 게 맞다.
그래서 뭘 만들고 싶었냐면
내가 안경으로 하고 싶은 건 거창하지 않았다.
- 우리집 Tapo L535 전구 켜고 끄기
- 카카오톡 알림 받기, 메시지 보내기
- 메일 보내기
- 그리고 쓰다 보니 생각난 것, 옵시디언 노트에 메모 남기기
하나씩 따져 보니 생각보다 순탄치 않았는데 카카오톡 알림은 개발할 필요가 없다. G2가 원래 폰 알림을 보여 주니까 Even 앱에서 카카오톡 알림만 켜면 끝이다. 오히려 SDK에는 폰 알림을 읽는 API가 없어서, 알림을 가공하는 앱은 만들 수도 없다.
카카오톡 메시지 보내기는 카카오 정책에 막혔다. ’나에게 보내기’는 제한 없이 쓸 수 있지만, ’친구에게 보내기’는 받는 친구도 내 앱에 카카오 로그인으로 연결하고 동의해야 하고, 권한을 받아도 같은 친구에게 하루 20건까지다. 아무 채팅방에나 답장하는 건 공식 API로는 불가능하다. 깔끔하게 포기하고 ’나에게 보내기’만 쓰기로 했다.
전구와 메일, 옵시디언은 만들 수는 있는데 걸리는 게 하나 있었다.
결국 서버가 필요하다
앞에서 G2 앱이 폰의 WebView 안에서 돈다고 했다. 이게 발목을 잡는다. Even Hub 앱이 밖으로 요청을 보내려면 관문을 두 개 통과해야 한다.
- 목적지 도메인이
app.json의 네트워크 화이트리스트에 있어야 하고 - WebView 브라우저 엔진의 CORS 검사를 통과해야 한다.
그리고 운영 환경에서는 HTTPS만 된다. 집 공유기 안에 있는 전구에 http://192.168.x.x로 직접 명령을 보내는 건 불가능하다는 뜻이다. 공식 문서도 CORS를 고칠 수 없는 API라면 내가 운영하는 서버를 거쳐서 호출하라고 안내한다.
결국 이런 구조가 된다.
다행히 우리집에는 이미 서버가 있다. 시놀로지 NAS다. 24시간 켜져 있고, 집 LAN 안에 있어서 전구에 바로 닿고, Docker도 돌릴 수 있다. 전구 제어는 비공식 Tapo 라이브러리(tapo)가 L535를 지원하니까 이걸 쓰면 되고, 메일은 이미 쓰고 있는 AWS SES로 보내면 된다.
옵시디언은 더 쉬웠다. 내 보관소는 이미 NAS에 설치한 Gitea와 git으로 연동되어 있다. 그러니 서버가 그 저장소를 clone해서 쓰고, 메모를 남길 때는 commit하고 push하면 된다. Mac의 옵시디언은 평소처럼 pull해서 보면 그만이다.
잠깐, 이거 안경 앱이 아닌데?
여기까지 정리하고 나니 이상한 점이 보였다.
전구 제어도, 메일 발송도, 옵시디언도, 카카오도 전부 서버에 있다. G2 앱이 하는 일은 서버에 “불 꺼 줘”라고 요청하고 결과를 화면에 띄우는 것뿐이다. 안경 앱을 만들려고 시작했는데, 정작 만들어야 할 건 서버였다.
그렇다면 굳이 G2에 묶어 둘 이유가 없다. 폰에서도 부르고 싶고, 손목에서도 부르고 싶다. 내 워치는 Amazfit인데, 찾아보니 Zepp OS에도 미니 프로그램 개발 환경이 있었다. 구조도 G2와 거의 같다. 워치 앱은 블루투스로 폰의 Zepp 앱과 이야기하고, 폰 쪽 Side Service가 fetch로 외부 서버를 호출한다. 요즘은 Claude 같은 AI도 MCP로 도구를 부를 수 있으니, AI한테 “거실 불 꺼 줘”라고 시키는 것도 가능하다.
그래서 방향을 틀었다. 안경 앱이 아니라, 집안의 모든 걸 대신 처리해 주는 비서를 만들자. 이름은 Secretary다.
Secretary는 서비스 허브다. 집안의 IoT 기기, 메일 서버, Git 서버를 연동해 두고, 어떤 클라이언트든 요청만 보내면 대신 처리해 준다. 클라이언트는 각자 잘하는 일만 한다.
- Flutter 앱(폰): 메인 앱이자 관리자 콘솔. 기기 등록과 승인을 맡는다.
- G2: 힐끗 보는 정보와 음성 명령
- 워치: 전등 켜기 같은 빠른 실행, 승인 탭
- MCP: AI가 대신 일을 시킬 때
이렇게 해 두면 G2가 아직 없는 지금도 폰으로 개발하고 써 볼 수 있다. 나중에 다른 기기가 생겨도 클라이언트만 하나 더 붙이면 된다. 안경 하나 사려다 일이 커졌지만, 이쪽이 훨씬 마음에 든다.
그런데 밖에서 집 서버를 연다고?
문제는 보안이다. 출장 중에도, 퇴근길에도 쓰려면 Secretary는 외부에서 접속할 수 있어야 한다. 이 서버는 집 불을 끄고, 내 이름으로 메일을 보내고, 내 노트를 고칠 수 있다. 털리면 곤란한 정도가 아니다.
최근에 시큐어 인프라, 시큐어 코딩 글을 쓰면서 “들어올 수 있는 문을 줄이라”고 잔소리를 늘어놓았는데, 이번에는 그걸 우리집에 적용할 차례다. 고민 끝에 큰 방향은 이렇게 잡았다.
- NAS 포트는 하나도 열지 않는다. Cloudflare Tunnel로 NAS에서 바깥으로 터널을 뚫고, 그 앞을 Cloudflare Access가 지킨다. 개인 용도라면 둘 다 무료다.
- 기기마다 따로 열쇠를 준다. 요청마다 HMAC 서명을 붙여서, 가로챈 요청을 다시 쓸 수 없게 한다.
- 위험한 일은 다른 기기에서 한 번 더 확인한다. 안경에서 메일 발송을 요청하면, 워치나 폰에서 탭해야 실제로 나간다.
그런데 여기서 또 하나 걸렸다. 내 도메인은 AWS Route53에서 관리하고 있는데, Cloudflare 무료 플랜은 도메인 전체의 DNS를 Cloudflare로 옮겨야만 Tunnel을 쓸 수 있다. 서브도메인만 넘기는 건 Business나 Enterprise 플랜의 기능이다. SES 메일 인증 레코드가 잔뜩 걸린 도메인을 홈 서버 하나 때문에 옮기기는 싫어서, Secretary 전용 도메인을 하나 새로 사기로 했다. 이번 프로젝트에서 유일하게 돈이 드는 부분이다.
다음 편 예고
정리하면, 스마트 안경 앱을 만들려다가 집안 비서를 만들게 됐다. 안경은 12월에나 오니까, 그 전까지 서버부터 차근차근 만들어 볼 생각이다. 시리즈는 대략 이렇게 이어질 것 같다.
- 발단편 - 지금 이 글
- 설계편 - 인증(HMAC 서명, 기기 키), Cloudflare Tunnel과 Access, 보안 설계
- 서버편 - NAS에 Docker로 Secretary 코어 올리기, SES 메일과 Gitea·옵시디언 연동
- IoT편 - 귀국 후 Tapo 전구 연결하기
- 클라이언트편 - Flutter 앱, G2 앱, Amazfit 워치, MCP
계획은 언제든 바뀔 수 있다. 이 글 자체가 계획이 바뀐 이야기니까.
그럼 안녕!

꼬리말을 불러오는 중...