토스 Open API의 개인 계좌·주문 기능을 연동해 계좌 조회·선택, 주식 주문·정정·취소, 보유 종목 및 거래 내역 조회를 하나의 UI에서 처리할 수 있게 한다. MySQL에 모든 상태를 영속화하여 앱이 꺼져도 주문 내역이 유지되고, Toss CUD 요청과 로컬 DB를 항상 동기 상태로 유지한다.
목표
ID
요구사항
우선순위
R-01
토스 계좌 목록을 조회해 원하는 계좌를 선택하고, 선택 상태를 MySQL에 영속화한다
높음
R-02
매수 가능 금액·매도 가능 수량·매매 수수료를 주문 전 실시간으로 조회한다
높음
R-03
선택 계좌로 매수·매도 주문을 접수하고, Toss 성공 시 MySQL에 동기화한다
높음
R-04
미체결 주문의 가격·수량을 정정하거나 취소할 수 있다
높음
R-05
계좌의 보유 종목 현황(수량·평균 매수가)을 조회하고 MySQL에 upsert한다
중간
R-06
특정 계좌의 거래 내역을 최신순으로 조회하고 MySQL에 upsert한다
중간
요구사항
사용자 문제와 해결 방안
사용자 문제
해결 방안
계좌가 여러 개일 때 어떤 계좌로 주문하는지 분명하지 않다
계좌 목록 조회 후 활성 계좌 선택, 선택 상태 MySQL 영속화
매수 전 가용 금액·수수료를 별도로 확인해야 한다
매수 가능 금액, 매도 가능 수량, 매매 수수료를 API로 사전 조회
주문 후 결과를 앱 안에서 확인할 수 없다
주문 접수·정정·취소 API + MySQL 동기화로 로컬 주문 이력 유지
보유 종목 현황을 실시간으로 볼 수 없다
보유 종목 조회 API를 통해 계좌별 holdings 스냅샷 제공
어떤 거래를 했는지 히스토리를 확인하기 어렵다
거래 내역 조회 API + MySQL에 trade_history 적재
기대 효과
주문 흐름(계좌 선택 → 가용 금액 확인 → 주문 → 이력 확인)을 앱 안에서 완결.
Toss와 MySQL을 항상 동기 상태로 유지해 오프라인 조회 가능.
알림·시그널·추천 기능과 연동(추천 가격으로 바로 주문 등록 흐름 확장 가능).
경쟁사·동일 제품군 비교
토스증권 앱 (내 자산·주문)
앱 내 계좌·주문·보유 종목 전체 제공. 단 외부 도구 연동·자동화 불가.
증권사 HTS (키움 영웅문 등)
조건 주문·자동 주문 기능 풍부. 단 외부 API·자체 도구 연동이 어렵고 Mac 지원 미흡.
비교 요약표
항목
본 도구
토스 앱
증권사 HTS
계좌 목록 연동
✅(토스 API)
✅
✅
주문·정정·취소
✅
✅
✅
로컬 DB 영속화
✅(MySQL)
✗
△
커스텀 자동화 연동
✅
✗
✗
Mac 네이티브
✅
✗
△
세부 정책
정책 1: 계좌 목록 조회와 선택
유저 스토리
사용자로서, 토스 계좌 목록을 조회해 원하는 계좌를 선택하고 싶다.
사용자로서, 선택한 계좌가 앱 재시작 후에도 유지되기를 원한다.
UI / UX 주요 작업 포인트
계좌 선택 드롭다운: 계좌번호(마스킹)·계좌명·잔고 표시.
선택 계좌는 헤더·주문 폼·보유종목 탭에서 전역 컨텍스트로 사용.
상세 정책
GET /api/v1/accounts → 계좌 목록을 MySQL accounts 테이블에 upsert 후 응답.
PUT /api/v1/accounts/{accountNumber}/select → 선택 상태 플래그(selected) MySQL에 영속화.
활성 계좌는 1개만 허용. 선택 변경 시 기존 선택 해제.
마이그레이션 조건 (선택)
accounts 테이블 신규 생성. 실패 시 역방향 DDL로 제거.
정책 2: 매수 가능 금액·매도 가능 수량·수수료 조회
유저 스토리
사용자로서, 주문 전 매수 가능 금액과 수수료를 미리 확인하고 싶다.
사용자로서, 매도 시 판매 가능한 수량을 실시간으로 확인하고 싶다.
UI / UX 주요 작업 포인트
주문 폼: 종목·수량·가격 입력 → “조회” 클릭 → 가능 금액/수량·예상 수수료 인라인 표시.
상세 정책
GET /api/v1/accounts/purchasable?symbol=&quantity=&price= → 토스 API 프록시, MySQL 저장 없음.
GET /api/v1/accounts/sellable?symbol=&quantity= → 토스 API 프록시, MySQL 저장 없음.
GET /api/v1/accounts/fee?symbol=&quantity=&price=&orderType= → 토스 API 프록시, MySQL 저장 없음.
세 API 모두 실시간 조회가 목적이므로 캐시 없이 Toss API를 즉시 호출.
정책 3: 주식 주문 접수·정정·취소
유저 스토리
사용자로서, 선택한 계좌로 종목을 매수/매도 주문하고 싶다.
사용자로서, 접수된 주문의 가격 또는 수량을 정정하고 싶다.
사용자로서, 미체결 주문을 취소하고 싶다.
UI / UX 주요 작업 포인트
주문 폼: 매수/매도 탭, 종목·수량·가격·주문 유형(시장가/지정가) 입력.
미체결 주문 테이블: 정정·취소 버튼 제공.
상세 정책
POST /api/v1/orders → Toss 주문 API 호출 → 성공 시 MySQL orders 테이블에 INSERT.
PATCH /api/v1/orders/{id} → Toss 주문 정정 API 호출 → 성공 시 MySQL orders UPDATE(status=CORRECTED, 가격/수량 반영).
DELETE /api/v1/orders/{id} → Toss 주문 취소 API 호출 → 성공 시 MySQL orders UPDATE(status=CANCELLED).
Toss 호출 실패 시 MySQL 업데이트 없음(Toss가 진실 원천). 트랜잭션은 MySQL 업데이트 단계에만 적용.