Skip to content

Commit 98f45fa

Browse files
committed
idem
2 parents 5b4c334 + 996882a commit 98f45fa

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

README.md

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,49 @@
11
# autoInvest
22

3-
주가를 **실시간 감시**하다가
4-
① 지정가 도달 → **시장가 손절**
5-
② 이후 다시 지정가 도달 → **재매수**
6-
까지 자동으로 실행하는 API 서버입니다
3+
주식 관리 API입니다.
74

8-
---
5+
주식을 하면서 손절을 못하는 이유는, "혹시 여기서 다시 오르면 어떡하지?" 라는 생각 때문입니다.
96

10-
## 1) 프로젝트 개요
7+
주가를 실시간 (WebSocket && HTTP Polling) 으로 감시하다가, 지정한 손절가에 도달하면 자동 손절.
8+
이후 감시를 지속하여 주가가 손절가에 다시 도달하면 재매수하게 하는 API입니다.
119

12-
- **프로젝트명**: autoInvest
13-
- **문제 정의**
14-
- 실시간 주가 감시는 연결 유지(WebSocket) + 이벤트 폭주 특성이 강해서
15-
- 작은 인스턴스(EC2 micro)에서는 **세션과 메모리중복 데이터**가 바로 병목으로 다가옴
16-
- **해결 방향**
17-
- 실시간 주가 수신은 **한 번만** 받아서 전역 Redis로 **브로드캐스팅(Pub/Sub)**
18-
- 거래/후처리 작업은 **Redis Streams****작업 큐**를 구성해 안정적으로 처리
10+
현재 LS 증권의 세션을 다룰 수 있으며, 다른 증권사를 추가하기 위해 전략패턴(디자인패턴)을 사용하여 원활한 확장성을 제고하였습니다.
1911

2012
---
2113

22-
## 2) 아키텍처
14+
## 1) 문제 해결 요약
15+
### 메모리 트러블
16+
- **문제 정의**
17+
- EC2 micro 환경에서 계속 유지되고 있는 유저들의 웹소켓 세션으로 메모리가 포화되어 한 서버에 많은 유저를 감당하기 어려움.
18+
-
19+
- **해결 방향**
20+
- 모든 서버에서 **주식 종목당 단 한 개의 세션만 유지**하고, 전역 Redis로 **브로드캐스팅(Pub/Sub)**
21+
- 중복 쓰기 및 데이터 정합성을 보장하기 위해 **Redis 분산락** 으로 유일한 쓰기 보장.
2322

24-
> 환경: **EC2 micro** 기반
25-
> 구성: **App 서버 + 전역 Redis 서버 + RDS(MySQL)**
23+
- 거래/후처리 작업은 **Redis Streams****작업 큐**를 구성해 안정적으로 처리
2624

27-
## 3) 기술 스택
25+
---
26+
## 2) 기술 스택
2827

29-
Language: Java 17
28+
**Language**: ![Java](https://img.shields.io/badge/Java-007396?style=for-the-badge&logo=java&logoColor=white)
3029

31-
Framework: Spring Boot (WebFlux)
30+
**Framework**: ![Spring](https://img.shields.io/badge/Spring-6DB33F?style=for-the-badge&logo=spring&logoColor=white)
31+
![Spring WebFlux](https://img.shields.io/badge/WebFlux-6DB33F?style=for-the-badge&logo=spring&logoColor=white)
3232

33-
DB: MySQL (AWS RDS)
33+
**DB**: ![MySQL](https://img.shields.io/badge/MySQL-4479A1?style=for-the-badge&logo=mysql&logoColor=white)
34+
![R2DBC](https://img.shields.io/badge/R2DBC-0A7FC1?style=for-the-badge&logo=reactivex&logoColor=white)
3435

35-
Cache / Messaging: Redis
36+
**Cache / Messaging**: ![Redis](https://img.shields.io/badge/Redis-DC382D?style=for-the-badge&logo=redis&logoColor=white)
3637

37-
Redis Pub/Sub: 공통 데이터 브로드캐스팅
38+
**Infra**: ![AWS](https://img.shields.io/badge/AWS-232F3E?style=for-the-badge&logo=amazonaws&logoColor=white)
39+
![EC2](https://img.shields.io/badge/EC2-FF9900?style=for-the-badge&logo=amazonec2&logoColor=white)
40+
![RDS](https://img.shields.io/badge/RDS-527FFF?style=for-the-badge&logo=amazonrds&logoColor=white)
41+
![Docker](https://img.shields.io/badge/Docker-2496ED?style=for-the-badge&logo=docker&logoColor=white)
3842

39-
Redis Streams: 작업 큐
43+
## 3) 아키텍처
44+
![autoInvest_최종](https://github.com/user-attachments/assets/917b9c02-903a-4970-8344-c2ee217c30fe)
4045

41-
Infra: AWS EC2 micro, RDS
46+
<img width="5605" height="6125" alt="Untitled diagram-2026-02-11-051546" src="https://github.com/user-attachments/assets/50a2d26d-3247-42c2-9612-d2513def6db7" />
4247

4348

4449
## 4) 트러블 슈팅

0 commit comments

Comments
 (0)