프로젝트/프로젝트 회고
[최종 프로젝트 - 현재 시세를 반영한 모의 투자 서비스] 5분 브리핑
코딩로봇
2025. 6. 10. 18:28
✅ 구현한 기능
📌 주문 관리: 지정가(Limit) 및 시장가(Market) 매수/매도 주문
- 지정가 매수/매도: 사용자가 원하는 가격과 수량으로 주문 생성
- 시장가 매수/매도: 현재 시장 가격으로 즉시 주문 실행
- 주문 조회 및 취소: 계좌별 주문 내역 조회 및 취소 기능 제공
✅ 주요 로직
- 지정가 주문 (LimitOrderService)
- 계좌 유효성 검사 및 잔액 확인
- 지정가 × 수량 → 총액 계산 및 잔액 차감
- 주문 객체 생성 및 저장, 응답 DTO 반환
- 시장가 주문 (MarketOrderService)
- 계좌 및 주식 조회 후 시장 가격으로 즉시 주문 처리
- 보유 자산 수량 또는 계좌 잔액 업데이트
- 주문 조회 (OrderService)
- QueryDSL 기반 커서 페이징으로 효율적 조회
- 계좌 ID, 주문 유형, 상태, 날짜 필터링 지원
✅ 프로젝트 배경
📌 목적
- 실시간 주식 시세 기반의 모의 투자 플랫폼 구축
- 사용자가 투자 경험을 쌓을 수 있도록 지원
✅ 요구사항
📌 기능적 요구사항
- 지정가/시장가 주문 생성, 조회, 취소
- 계좌 잔액 및 보유 주식 관리
📌 비기능적 요구사항
- 멀티스레드 환경에서도 동시성 보장
- 높은 처리 속도 및 데이터 무결성 유지
- 확장 가능한 아키텍처 설계 (예: 분산 환경)
✅ 의사결정
⚠️ 문제 정의 (Why)
- 멀티스레드 환경에서 동일 계좌에 대한 동시 주문 처리 시
- 잔액 및 보유 자산 데이터 불일치 발생
2개의 동일한 보유 주식 매도시 하나의 주문만 실행됨.
📌 원인
- 동시성 제어 부족 → 여러 스레드가 동일 자원(계좌, 보유 자산)을 동시에 수정
✅ 해결 방법
- 계좌 잔액 및 보유 자산 업데이트 시 락 필요
- 동시 접근을 제한해 단일 스레드만 수정하도록 제어
📌 기술 선택지 비교
기술 | 장점 | 단점 | 적합성 |
비관적 락 | - DB 수준 무결성 보장 - 구현 간단 |
- 성능 저하 - 데드락 위험 - 분산 환경 부적합 |
단일 DB 환경에 적합 |
낙관적 락 | - 충돌 적을 경우 성능 우수 - 구현 간단 |
- 충돌 많으면 재시도 비용 증가 - 롤백 처리 복잡 |
주문 충돌 많아 부적합 |
분산 락 (Lettuce) | - 가볍고 빠름 - 높은 확장성 |
- 설정 복잡 - 락 해제 실패 위험 |
확장성 좋지만 관리 어려움 |
분산 락 (Redisson) | - 자동 락 갱신 - 간단한 API - 다양한 락 지원 |
- Redis 의존성 - 설정 복잡도 증가 |
확장성과 안정성 모두 만족 |
✅ 최종 선택: Redisson
📌 선택 이유
- 확장성: 분산 환경에서 동시성 제어 가능
- 안정성: 자동 락 갱신으로 락 해제 실패 방지
- 간편한 API: getLock, lock 등으로 빠른 통합 가능
✅ 회고
📌 Redisson의 장단점
장점
- 자동 락 갱신: 네트워크 지연이나 예외 상황에서도 락 유지
- 확장성: 분산 환경 대응 가능 → 사용자 증가에 유리
- 간편한 API: 빠른 구현과 유지보수 가능
단점
- Redis 의존성: Redis 장애 시 락 기능 중단
- 설정 복잡도: Redisson 설정 학습 필요
- 성능 오버헤드: Redis 통신 비용
- 락 관리 부담: 락 대기 시간 증가 위험 존재
✅ 설계/기술 선택 학습 회고
- 동시성 문제의 원인을 직접 파악하고, 해결 방법을 다양하게 탐색
- Redisson을 활용한 확장 가능한 동시성 제어 적용 경험
- QueryDSL 기반 커서 페이징으로 대량 주문 처리 최적화 학습