Skip to content

[Refactor]: Phase 1 코드 리뷰 이슈 수정 #25

@ohhalim

Description

@ohhalim

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() 훅으로 오더북 반영
  • 오더북 REST 조회 경로에 marketLock 적용
  • OrderRepository.findByIdWithLock() 추가 및 settle() 에 적용
  • DepositRequest@NotBlank, @Pattern 추가

참고

.docs/v2/ISSUES.md Priority 1~4

문제점

No response

개선 방안

No response

Metadata

Metadata

Assignees

Labels

refactorCode cleanup, restructuring, or maintainability improvement

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions