본문으로

서비스 구조 · Architecture

우리 앱은
이렇게 돌아갑니다.

이엘디가 직접 만들고 운영하는 앱들이 어떤 부품으로 이루어져 있고, 요청이 어디를 지나 어디에 닿는지 한 장씩 그렸습니다. 부품 이름과 흐름만 담았습니다. 2026년 10월 기준.

  • 운영 중
  • 도입 중(개발 서버에서 시험)
  • 외부 서비스
  • 짚어 볼 부품
  • 핵심 흐름

01

전체 지도

세 층, 한 클라우드

기기 → 진입점 → 서버 → 데이터·외부 서비스

폰 · 웹 · PC 클라이언트가 공개 진입점을 지나 Google Cloud 서울 리전의 서버에 닿습니다. 서버는 데이터베이스와 몇 가지 외부 서비스만 씁니다. CopyZoom 은 서버를 쓰지 않습니다.

  • 진입점은 셋API 와 웹은 Caddy(자동 HTTPS), 실시간 음성은 Cloud Run 엣지, 법인 사이트 같은 정적 페이지는 CloudFront.
  • 한 VM, 서비스별 격리Conoti 와 ELANFIT 은 같은 VM 에서 컨테이너와 데이터베이스를 따로 씁니다. 두 서비스 모두 운영 서버와 개발 서버가 나뉘어 있습니다.
  • 외부 의존은 최소로로그인 · 푸시는 Firebase, 결제는 App Store · Google Play, AI 는 OpenAI · Google 모델.
그림 1 · 서비스 전체 지도

02

Conoti · conoti.app

Conoti

AI 가 쓰고 사람이 보내는 모임 공지

폰 앱 · 웹 · PC 앱 · AI 에이전트가 모두 같은 서버 하나를 씁니다. 서버는 기능별 모듈로 나뉜 FastAPI 하나입니다.

  • 예약 발송은 한 번만서버 안 스케줄러가 단일 실행 잠금 · 상태 비교 갱신 · 발송 고유 키, 세 겹으로 같은 공지가 두 번 나가지 않게 막습니다.
  • 구독 상태는 서버가 판단App Store · Google Play 의 서버 알림을 서명 검증한 뒤에만 반영합니다.
  • 웹도 앱과 같은 기능웹 문구는 앱의 다국어 표에서 뽑아 만들고, 같은 API 를 씁니다(결제는 앱에서).
  • AI 에이전트용 MCP키마다 쓸 수 있는 방이 정해져 있어, 한 키로 다른 방에는 쓸 수 없습니다.
  • 운영 · 개발 분리새 기능은 개발 서버와 개발용 앱에서 먼저 검증하고, 정해진 절차로 운영에 승격합니다.
그림 2 · Conoti 구조

AI 작업 연결 — 폰에서 PC 의 AI 세션으로

PC 앱 Conoti AI 가 컴퓨터에서 도는 AI 코딩 세션의 결과를 폰으로 보내고, 폰에서 답장이나 허용을 돌려보냅니다.

  • 서버는 중계만폰(또는 브라우저)과 PC 가 Noise 프로토콜로 종단간 암호화합니다. 서버는 읽을 수 없는 암호문만 넘깁니다.
  • 기기 키는 꺼낼 수 없게웹에서는 기기 키를 내보낼 수 없는 형태로 브라우저에 보관합니다.
그림 3 · 폰 ↔ PC 연결

03

Conoti · ELANFIT 공통 · 도입 중

음성 모드: 앱 ↔ 엣지 ↔ 서버

무거운 오디오는 엣지로, 기준은 서버에

실시간 음성 대화의 오디오 처리만 Cloud Run 엣지(서울 리전)로 옮기는 구조입니다. 인증 · 잔액 · 대화 기록 · 정산의 기준은 그대로 서버에 남고, 엣지는 서버가 발급한 1회용 티켓으로만 그 사용자의 세션에 붙습니다. 지금은 개발 서버에서 시험 중이고, 기존 앱은 계속 서버를 거쳐 연결됩니다.

  1. 세션 요청 — 앱이 서버에 음성 세션을 엽니다.
  2. 조건 확인 — 서버가 잔액 · 요금제 · 사용 한도를 보고 세션을 등록합니다.
  3. 1회용 티켓 — 짧은 시간 안에 한 번만 쓸 수 있는 티켓과 엣지 주소를 앱에 줍니다.
  4. 티켓 제시 — 앱이 엣지에 소켓을 열며 티켓을 냅니다.
  5. 티켓 교환 — 엣지가 자기 서비스 신원(Google 서명 토큰)과 함께 티켓을 서버에 냅니다. 서버는 꺼내는 즉시 소진하고 사용자 · 기기 · 세션을 대조합니다.
  6. 세션 토큰 — 그 세션에서만 통하는 토큰과 이전 대화 맥락을 엣지에 줍니다.
  7. 엔진 연결 — 엣지가 실시간 AI 엔진에 연결합니다.
  8. 음성 스트림 — 오디오는 앱 · 엣지 · 엔진 사이로만 흐릅니다.
  9. 기록 · 도구 · 사용량 — 전사와 도구 호출, 사용량은 엣지와 서버 사이 링크로 오가고, 서버가 저장해 다음 대화로 이어 갑니다.
  10. 정산 · 폐기 — 끝나면 서버가 정산하고 토큰을 폐기합니다.
주체가진 것갖지 않는 것
앱로그인 토큰 · 1회용 티켓 · 마이크 · 스피커엔진 키 · 세션 토큰
엣지엔진 키(Secret Manager) · 세션 동안만 메모리에 둔 세션 토큰데이터베이스 접속 · 사용자 로그인 토큰 · 정산 권한
서버데이터베이스 · 세션의 진짜 상태 · 정산엣지 세션의 엔진 소켓
  • Conoti세션은 최대 30분. 음성 중 도구는 폰이 실행하고, 판단과 정산은 서버가 합니다.
  • ELANFIT세션은 최대 60분(Cloud Run 연결 상한에 맞춤). 기록 도구와 MCP 는 서버가 사용자 권한으로 실행합니다.
그림 4 · 음성 모드 순서

04

ELANFIT · elanfit.app

ELANFIT

말로 기록하는 AI 피트니스 코치

모바일 앱 · 백엔드 · 관리자 콘솔을 한 저장소에서 만듭니다. 서버는 비동기 FastAPI 하나입니다.

  • 계약 먼저모든 API 는 요청 · 응답 계약 문서를 먼저 고치고 서버와 앱을 맞춥니다. 응답은 한 가지 형식입니다.
  • 로그인구글 · 애플 · 페이스북 로그인(Firebase)을 서버가 확인한 뒤 자체 토큰을 발급합니다.
  • AI 코치대화 · 사진 인식 · 음성 코치. 코치가 참고하는 지식은 데이터베이스에 두고 임베딩으로 찾습니다.
  • 과금은 에너지 하나구독 · 충전 · 보상형 광고가 모두 에너지로 모입니다. 결제는 스토어 서명을 서버가 검증합니다.
  • MCP 서버사용자가 앱에서 발급한 키로 외부 AI 도구가 본인 기록을 다룹니다. 쓰기는 한 경로로만 지납니다.
  • 기업용 — 도입 중직원은 회사별 주소의 웹에서 자기 계정으로 등록합니다. 기업 담당자는 좌석 · 만료 · 가입 현황만 보고, 식단 · 운동 · 대화 기록은 볼 수 없습니다.
그림 5 · ELANFIT 구조

05

CopyZoom · iOS

CopyZoom

글씨에 대면 묶어 보여 주고, 탭하면 복사

카메라를 글씨에 대면 인식한 값을 연락처 · 계좌 · 주소 · 링크 · 금액 · 날짜로 묶어 보여 줍니다. 처음부터 끝까지 기기 안에서 끝납니다.

  • 서버도 계정도 없음인식한 글자와 사진을 서버 · 분석 도구 · 광고로 보내지 않습니다.
  • 분류기는 순수 Dart앱의 핵심입니다. 기기 지역에 따라 규칙이 달라집니다(한국은 은행 · 계좌 · 주소 · 사업자번호까지).
  • 민감한 값주민등록번호는 가려서 보여 주고 복사하지 않습니다. 계좌는 기기 전용으로, 2분 뒤 클립보드에서 사라집니다.
  • 광고는 하나결과 화면 배너 하나뿐입니다. 카메라 화면에는 광고를 두지 않습니다.
그림 6 · CopyZoom 구조

06

공통 인프라

어디에서 도는가

Google Cloud · AWS · 사무실 맥미니

  • Google Cloud 서울VM 한 대에 Caddy · 두 서비스의 API · 공유 PostgreSQL 이 있습니다. VM 은 Terraform 으로 관리하고, 백업은 Cloud Storage 에 둡니다.
  • Cloud Run서비스마다 음성 엣지 하나. 연결된 시간만 과금되고, 인스턴스끼리 나눌 상태가 없어 그대로 늘어납니다. AI 엔진 키는 Secret Manager 에 둡니다.
  • AWS법인 사이트(이 페이지) · 포트폴리오 · CopyZoom 안내는 S3 + CloudFront 정적 호스팅입니다.
  • 사무실 맥미니교육 · 도구 서비스를 돌립니다. 열어 둔 포트 없이 Cloudflare 터널로 바깥과 잇고, 모든 공개 요청은 nginx 게이트웨이 한 곳을 지납니다.
  • 운영 알림은 Conoti 로헬스 체크와 일일 보고가 Conoti 공지방으로 들어옵니다. Conoti 자신이 멈춘 날을 대비해 다른 알림 경로도 함께 둡니다.
그림 7 · 공통 인프라

07

배포 흐름

코드에서 사용자까지

개발에서 먼저, 운영은 검증 뒤

  • 서버개발 서버는 저장소를 당기면 바로 반영됩니다. 운영은 검증을 마친 코드만 승격해 이미지를 다시 빌드합니다.
  • 폰 앱개발용 앱으로 실기기에서 먼저 확인한 뒤 스토어 심사에 냅니다. 승인된 버전 위의 Dart 코드 수정은 Shorebird 코드 푸시로 심사 없이, 사용자가 앱을 다음에 켤 때 적용됩니다.
  • 코드 푸시로 못 보내는 것네이티브 플러그인 · 권한 문구 · 이미지 같은 에셋이 바뀌면 새 버전으로 다시 심사받습니다.
  • PC 앱서명한 빌드를 GitHub 릴리스로 내고, 앱이 서명을 확인한 뒤 스스로 업데이트합니다.
그림 8 · 배포 흐름