GET /api/v1/accounts/{accountNumber}/trade-history
인증 방식
client_credentials(시세 조회용)
OAuth Authorization Code Flow(개인 계좌용) 추가
CUD 처리 흐름 (Toss 진실 원천)
PlaceOrderUseCase.execute(command)
└─ OrderDomainService.placeOrder(command)
├─ 1. OrderGateway.placeOrder() → TossOrderId
└─ 2. (Toss 성공 시) OrderRepository.save(Order with tossOrderId, PENDING)
Toss 실패 → 예외 전파, MySQL 미저장.
정정/취소도 동일 패턴: Toss 성공 → MySQL status 업데이트.
Component Diagram
flowchart LR
subgraph Presentation["Presentation"]
AC[AccountApiController]
OC[OrderApiController]
end
subgraph Application["Application"]
AU[Account UseCases]
OU[Order UseCases]
HU[Holding/History UseCases]
end
subgraph Domain["Domain"]
ADS[AccountDomainService]
ODS[OrderDomainService]
HDS[HoldingDomainService]
AGW[AccountGateway]
OGW[OrderGateway]
HGW[HoldingGateway]
AR[AccountRepository]
OR[OrderRepository]
HR[HoldingRepository]
THR[TradeHistoryRepository]
end
subgraph Infra["Infrastructure"]
TAG[TossAccountGateway]
TOG[TossOrderGateway]
THG[TossHoldingGateway]
ARI[AccountRepositoryImpl]
ORI[OrderRepositoryImpl]
HRI[HoldingRepositoryImpl]
THRI[TradeHistoryRepositoryImpl]
end
AC --> AU
OC --> OU
OC --> HU
AU --> ADS
OU --> ODS
HU --> HDS
ADS --> AGW
ADS --> AR
ODS --> OGW
ODS --> OR
HDS --> HGW
HDS --> HR
HDS --> THR
TAG -.->|implements| AGW
TOG -.->|implements| OGW
THG -.->|implements| HGW
ARI -.->|implements| AR
ORI -.->|implements| OR
HRI -.->|implements| HR
THRI -.->|implements| THR
Sequence Diagram — 주문 접수
sequenceDiagram
participant C as OrderApiController
participant U as PlaceOrderUseCase
participant D as OrderDomainService
participant G as OrderGateway
participant R as OrderRepository
C->>U: execute(PlaceOrderCommand)
U->>D: placeOrder(command)
D->>G: placeOrder(accountNumber, symbol, type, quantity, price)
G-->>D: tossOrderId
D->>R: save(Order(tossOrderId, PENDING))
R-->>D: savedOrder
D-->>U: savedOrder
U-->>C: PlaceOrderResponse
Sequence Diagram — 보유종목 조회
sequenceDiagram
participant C as AccountApiController
participant U as GetHoldingsUseCase
participant D as HoldingDomainService
participant G as HoldingGateway
participant R as HoldingRepository
C->>U: execute(accountNumber)
U->>D: getHoldings(accountNumber)
D->>G: fetchHoldings(accountNumber)
G-->>D: List<HoldingData>
D->>R: upsertAll(holdings)
R-->>D: List<Holding>
D-->>U: List<Holding>
U-->>C: List<HoldingResponse>
ERD
erDiagram
ACCOUNTS {
varchar account_number PK
varchar account_name
varchar account_type
decimal cash_balance
tinyint selected
datetime refreshed_at
datetime created_at
}
ORDERS {
bigint id PK
varchar toss_order_id UK
varchar account_number
varchar symbol
varchar order_type
varchar price_type
int quantity
decimal price
varchar status
datetime ordered_at
datetime corrected_at
datetime cancelled_at
}
HOLDINGS {
bigint id PK
varchar account_number
varchar symbol
int quantity
decimal average_price
datetime refreshed_at
}
TRADE_HISTORY {
bigint id PK
varchar toss_transaction_id UK
varchar account_number
varchar symbol
varchar trade_type
int quantity
decimal price
datetime traded_at
}
accounts.selected: TINYINT(1). 선택 변경 시 이전 선택 행 selected=0, 신규 selected=1 (단일 트랜잭션).
holdings: (account_number, symbol) 복합 UK. upsert 시 quantity·average_price·refreshed_at 갱신.