
이 글은 알파코에서 진행되는 [신한투자증권] 프로디지털아카데미 과정 중, 김송아 강사님과 함께하는 '파이널 프로젝트'를 기반으로 작성되었습니다
우리 프로젝트의 키포인트는 같은 카테고리끼리는 or, 각각의 카테고리 끼리는 and로 처리돼서 울리는 것이다.
42개(시가, 종가 알림 제외)의 조건들을 모두 if-else로 다 처리하는 건 본능적으로 아니라고 느껴졌다..
그래서 모든 조건을 컴포넌트 단위로 분리했다.
인터페이스를 통해 공통 형태를 묶고, 각 조건은 어노테이션으로 매핑되게 하여 팩토리가 자동으로 등록하고 찾아주는 구조이다.
덕분에 BOLLINGER_LOWER_TOUCH 같은 조건이 들어오면 자동으로 해당 evaluator(조건탐지기)가 선택돼서 실행된다.

구조를 이렇게 짠 이유
1. 조건 추가가 간단해야 했다.
새 지표를 만들 때마다 기존 코드를 건드리는 건 위험했다. 새로운 조건 클래스를 만들고 @ConditionTypeMapping(ConditionType.XXX) 만 붙이면 끝나도록 하였다.
2. 테스트가 독립적으로 돌아야 했다.
각 evaluator가 단독으로 테스트할 수 있도록 공통 의존성을 최소화하고, 인터페이스로 분리했다.
3. 실시간 데이터와 맞물려야 했다.
Redis에 쌓은 minute: / daily: 데이터를 가져와서 각 evaluator가 판단할 수 있도록 했다
고민했던 부분들
- 지표별 evaluator를 다 따로 두는 게 너무 많은가?
처음엔 공통화하려다, 결국 각각 독립이 낫다고 결론을 내렸다. 이유는 조건마다 판단 계산식이 완전히 달라서 였다. 억지로 통합하려 하면 오히려 if문 지옥이 펼쳐질 것 같았다.
- Factory vs Manager 구조를 분리해야 하나?
Factory는 evaluator 등록/조회, Manager는 실제 실행 + Redis 연결 관리로 역할을 분리했다. 단일 책임 원칙(SRP)을 지키려는 시도였다.
- Redis 타입이 바뀌면 어떻게 대응할까?
실제로 WRONGTYPE 에러를 몇 번 맞으면서 key 타입 검증 로직을 추가했다. 이때 “안정성은 디테일에서 나온다”는 걸 다시 느꼈다.
정리하자면
44개의 조건을 코드로 옮긴다는 건 단순한 작업이 아니었다.
확장 가능한 설계에 대해 고민하는 시간이었다.
조건은 계속 늘어날수도, 줄어들수도 있고, 데이터는 매 분 바뀌고, 조건의 조합은 늘 다르다.
결국은 로직이 늘어나도 단순하게 유지할 수 있는 구조를 생각했다.
'And - 실시간 조건 감지·자동매매 시스템' 카테고리의 다른 글
| [신투 프디아] 맞춤 조건에 맞는 기업 찾기! (0) | 2025.10.17 |
|---|---|
| [신투 프디아] 실시간성과 안정성의 균형 맞추기 (Redis, MySQL) (0) | 2025.10.17 |
| [신투 프디아] 파이널 프로젝트 - 금융 데이터 가져오기! (1) | 2025.10.02 |
| [신투 프디아] 파이널 프로젝트 - 백엔드 패키지 설계 의도(with. DDD) (4) | 2025.09.26 |
| [신투 프디아] 파이널 프로젝트 - MSA 인프라 설계 의도 회고 (5) | 2025.09.24 |