Branch Keyword
matching-consistency
리팩토링 대상
배경
Phase 1 코드 리뷰에서 발견된 동시성/정합성 버그와 누락된 검증을 수정한다.
Phase 2(Kafka + WebSocket) 시작 전에 완료한다.
BLOCKER
1. 오더북 Rollback 불일치
현상: settle() 도중 예외 발생 시 DB는 롤백되지만 in-memory 오더북은 변경된 채로 남는다.
해결: match()를 두 단계로 분리한다.
planMatch() — 큐 변경 없이 MatchResult만 계산
applyMatchPlan() — afterCommit() 훅에서 오더북에 반영
2. getBuySide / getSellSide 동시 읽기 위험
현상: REST 오더북 조회가 marketLock 없이 getBuySide() / getSellSide() 를 호출한다.
match() 와 동시에 실행되면 ConcurrentModificationException 이 발생할 수 있다.
해결: 스냅샷 조회도 기존 marketLock 안에서 실행한다. MatchingEngine에 lock을 추가하지 않는다.
3. Maker Order Row Lock 누락
현상: settle() 에서 maker 주문을 findById() (일반 조회)로 읽는다.
SELECT ... FOR UPDATE 없이 조회하므로 향후 시장 lock을 우회하는 API가 생기면 즉시 위험해진다.
해결: findByIdWithLock() 으로 교체하고, fill 이전에 주문 상태를 재검증한다.
4. DepositRequest 검증 없음
현상: asset, amount 모두 String 타입이고 @NotBlank 등 검증 애노테이션이 없다.
null / 빈 문자열이 들어오면 서비스 레이어에서 NPE 또는 NumberFormatException 발생.
해결: @NotBlank 및 숫자 형식 @Pattern 을 추가한다.
작업 범위
참고
.docs/v2/ISSUES.md Priority 1~4
문제점
No response
개선 방안
No response
Branch Keyword
matching-consistency
리팩토링 대상
배경
Phase 1 코드 리뷰에서 발견된 동시성/정합성 버그와 누락된 검증을 수정한다.
Phase 2(Kafka + WebSocket) 시작 전에 완료한다.
BLOCKER
1. 오더북 Rollback 불일치
현상:
settle()도중 예외 발생 시 DB는 롤백되지만 in-memory 오더북은 변경된 채로 남는다.해결:
match()를 두 단계로 분리한다.planMatch()— 큐 변경 없이 MatchResult만 계산applyMatchPlan()—afterCommit()훅에서 오더북에 반영2. getBuySide / getSellSide 동시 읽기 위험
현상: REST 오더북 조회가
marketLock없이getBuySide()/getSellSide()를 호출한다.match()와 동시에 실행되면ConcurrentModificationException이 발생할 수 있다.해결: 스냅샷 조회도 기존
marketLock안에서 실행한다. MatchingEngine에 lock을 추가하지 않는다.3. Maker Order Row Lock 누락
현상:
settle()에서 maker 주문을findById()(일반 조회)로 읽는다.SELECT ... FOR UPDATE없이 조회하므로 향후 시장 lock을 우회하는 API가 생기면 즉시 위험해진다.해결:
findByIdWithLock()으로 교체하고, fill 이전에 주문 상태를 재검증한다.4. DepositRequest 검증 없음
현상:
asset,amount모두String타입이고@NotBlank등 검증 애노테이션이 없다.null / 빈 문자열이 들어오면 서비스 레이어에서 NPE 또는
NumberFormatException발생.해결:
@NotBlank및 숫자 형식@Pattern을 추가한다.작업 범위
MemoryOrderBook.planMatch()/applyMatchPlan()분리OrderService.createOrder()—afterCommit()훅으로 오더북 반영marketLock적용OrderRepository.findByIdWithLock()추가 및settle()에 적용DepositRequest—@NotBlank,@Pattern추가참고
.docs/v2/ISSUES.mdPriority 1~4문제점
No response
개선 방안
No response