본문으로 건너뛰기

기술

하나의 웹, 세 가지 셸

화면을 플랫폼마다 따로 만들지 않습니다. React 로 만든 하나의 웹 UI 를 브라우저 · Electron · Capacitor 가 각각 태웁니다. 그래서 기능이 플랫폼 사이에서 벌어지지 않습니다.

시세 파이프라인

체결에서 화면까지

증권사 WebSocket 에서 받은 체결을 워커가 캐시에 넣고 조건을 평가합니다. API 는 평가 결과를 REST 와 소켓으로 내보냅니다.

  1. 01KIS WebSocket

    H0STCNT0 실시간 체결

    증권사 실시간 시세

  2. 02apps/worker

    Redis 캐시 · Redis Pub/Sub · BullMQ

    시세를 받아 캐시에 넣고 알림 조건을 평가합니다

  3. 03apps/api

    NestJS — REST + Socket.IO

    GET /api/quotes · /realtime

  4. 04apps/web

    React + Vite 실시간 카드

    같은 코드가 PC · 모바일 셸에도 들어갑니다

개발 중에는 증권사 키 없이 시뮬레이터 모드로 같은 경로를 흘려 볼 수 있습니다 — 화면과 알림 평가를 실제 시세 없이 검증합니다.

스택

쓰는 것

Frontend

  • React 19
  • Vite
  • Tailwind CSS 4
  • Socket.IO Client

API

  • NestJS 11
  • Prisma
  • PostgreSQL
  • Redis
  • Socket.IO

Worker

  • KIS WebSocket
  • BullMQ
  • ioredis

Desktop

  • Electron

Mobile

  • Capacitor 7 (iOS / Android)

Monorepo

  • pnpm workspace
  • Turborepo

저장소

한 저장소에서 전부 관리합니다

로직 · 엔진 · 화면을 저장소 하나에 둡니다. 나누면 같은 사실을 서로 다르게 적는 일이 생깁니다.

경로무엇
apps/apiNestJS — REST + Socket.IO
apps/workerKIS WebSocket 수집 + 알림 평가
apps/webReact + Vite — 공유 UI
apps/desktopElectron
apps/mobileCapacitor (iOS / Android)
packages/broker(KIS 클라이언트) · domain · indicators · config
infra/docker-compose · 배포 스크립트

가드

규칙은 사람이 아니라 CI 가 지킵니다배포 가드

회원이 보는 문자열에 쓰지 않기로 한 표현이 있습니다. 이것을 리뷰에서 잡지 않고 배포 전에 기계가 잡습니다. 조건이 걸리면 배포가 실패합니다.

차단

미래 수익 예측 표현

미래 가격이나 수익을 숫자로 제시하는 표현은 화면 어디에도 나가지 않습니다. 값의 출처가 엔진이든 고정값이든 같게 막습니다.

차단

매매 권유 문장

사고파는 행동을 권하는 문장과 매매 방법을 권하는 용어를 쓰지 않습니다.

검사

판정 뱃지의 출처

판정 단어와 엔진 뱃지는 엔진 출력에만 붙습니다. 화면 계산값에 붙이면 렌더 경로 검사가 막습니다.

이 소개 사이트도 같은 검사를 받습니다 — 빌드가 문구를 먼저 훑고, 걸리면 빌드가 멈춥니다.

보안 · 정책

지키기로 한 것

  • 세션 토큰은 Keychain(iOS) · Keystore(Android) · Electron safeStorage 에 둡니다.
  • Electron 은 contextIsolation 을 켜고 preload API 를 최소로 둡니다.
  • 관리자 계정은 MFA 와 RBAC, 감사 로그를 받습니다.
  • 시세 공급 계약의 표시 · 캐싱 · 재배포 조건을 사전에 확정합니다.
  • 투자 권유가 아니라는 고지를 싣고, 수익을 보장하는 표현을 쓰지 않습니다.
  • 국내 출시 전 금융 · 개인정보 전문가 검토를 받습니다.