작업 목록으로

Oh My Stocks

웹 · 데스크톱

여러 증권사의 시세와 계좌, 주문을 한곳에서 다루는 도구입니다. 웹과 데스크톱, 터미널에서 같은 서버 기능을 이용하며 증권사별로 다른 조회와 주문 방식을 연결합니다.

작은 시세 차트 화면과 장부, 인증 정보 관리를 상징하는 열쇠를 그린 일러스트

주문을 보낸 뒤의 결과까지 확인하기

여러 화면에서 같은 규칙 쓰기

시세 조회와 주문의 규칙은 서버가 맡고, 증권사 연결은 별도 구성으로 나누고 있습니다. 화면은 요청과 결과 표시에 집중하도록 해, 기능을 고칠 때 웹과 데스크톱의 처리 규칙이 달라지지 않도록 했습니다.

주문 응답이 끊겼을 때

주문 응답이 없다고 같은 주문을 다시 보내면 중복으로 접수될 수 있습니다. 요청마다 식별자를 부여하고, 결과가 불확실하면 자동으로 재주문하지 않고 기존 주문의 접수 여부를 확인하도록 구성했습니다.

인증 정보를 보관하고 전달하기

iPhone에서는 Face ID로 열 수 있는 증권사 인증 정보 보관함도 만들었습니다. 인증 정보가 어디에 남고 서버에 어떻게 전달되는지도 함께 다루고 있습니다.

설계와 구현서버와 Gateway · 주문 멱등성 · 결과 대조

구성과 실행 경계

웹·데스크톱·터미널 → OMS API의 정책·상태 → 실행 기록 → Broker Gateway → 증권사

앱 서버는 주문 정책과 로컬 상태를, Broker Gateway는 증권사 연결과 선택한 조회·주문 전송을 맡습니다. 같은 자격 증명의 실시간 연결은 한 곳에서 소유하고 구독을 나눠 전달합니다. 앱 서버를 다시 실행해도 증권사 연결의 수명을 따로 관리할 수 있는 대신, 별도 프로세스와 권한 만료 상태를 운영해야 합니다. 새 주문의 Gateway 경로를 구현했으며, 취소·정정은 기존 경로가 남아 있습니다.

전송보다 실행 기록을 먼저

주문을 보내기 전에 멱등키와 요청 내용의 지문을 저장합니다. 같은 키와 같은 내용이면 기존 실행 상태를 반환하고, 내용이 다르면 거절합니다. 전송 중 연결이 끊기거나 결과 저장에 실패하면 결과 미확인 상태로 남겨 자동으로 재주문하지 않습니다. 재시작 후에도 이 기록을 읽어 전송 여부가 모호한 주문을 다시 실행하지 않도록 했습니다.

복구 경로에서는 주문을 보낼 수 없게

결과를 대조하는 인터페이스에는 주문 전송 메서드를 두지 않았습니다. 지원하는 주문 유형에서 증권사 내역이 충분한 범위를 포함하고, 원래 요청과 일치하는 후보가 하나일 때만 상태를 확정합니다. 내역이 비었거나 후보가 여럿이면 실패로 단정하지 않습니다. 즉시 결과를 보여주지 못하더라도 중복 주문을 피하는 쪽을 택했습니다.

인증 정보의 보관과 사용 권한 나누기

장기 자격 증명은 암호화한 Vault에 두고, Gateway에는 만료되는 메모리 사용권을 전달합니다. 자격 증명을 교체할 때는 이전 권한이 회수됐다는 응답을 받은 뒤 새 권한을 발급합니다. iPhone 승인과 서명된 Core 연동도 구현했지만, 주문 실행과 자격 증명 관리 권한을 모두 Core로 옮기는 작업은 별도 단계입니다.

검증과 남은 범위

동시 요청의 중복 전송 방지, 타임아웃 이후 재전송 차단, 재시작 복구, 조회만으로 결과를 대조하는 경로에 자동 테스트를 두었습니다. 실제 주문 접수·체결 알림, 장시간 실행, 물리적인 전원 차단과 복구는 운영 환경에서 따로 확인할 항목으로 관리합니다.

지금까지와 다음 단계

시세·계좌·주문 기능과 iPhone 인증 정보 보관함을 구현했습니다. 모바일 웹은 조회를 중심으로 다듬고 있습니다.

데스크톱 배포와 인증 흐름은 아직 다듬고 있습니다. 실제 주문의 접수·체결과 장시간 실행도 운영 환경에서 확인할 과제로 남아 있습니다.

TypeScript, Fastify, Svelte, Electron, SQLite를 사용합니다.

프로젝트 회고 · 비공개