# Stock Recommendation Service

퀀트 투자 전략 기반 베트남 주식 종목 추천 서비스를 Spring Boot로 개발했습니다.

***

## 1. Overview

외부 백테스팅 툴에서 검증된 퀀트 투자 전략을 기반으로, 베트남 3\~40대 개인 투자자에게 주식 종목을 추천하는 RESTful API 서비스를 개발했습니다. Spring Data JPA를 활용한 백엔드 API 설계부터 AWS EKS 기반 컨테이너 배포까지 전 과정을 담당한 파일럿 프로젝트입니다.

***

## 2. WHY? — 배경 & 문제 정의

베트남 주식 시장은 개인 투자자 비중이 높지만, 데이터 기반 종목 선정 도구가 부족한 상황이었습니다. 대부분의 투자자가 뉴스나 지인 추천에 의존해 종목을 선택했고, 백테스팅으로 검증된 전략을 쉽게 접할 수 있는 서비스가 필요했습니다.

해결해야 할 핵심 문제는 두 가지였습니다.

* **전략 신뢰성 확보**: 감이 아닌 백테스팅으로 검증된 퀀트 전략을 서비스화
* **접근성 제공**: 전문 트레이딩 툴 없이도 3\~40대 일반 투자자가 종목 추천을 받을 수 있는 API 구축

***

## 3. System Architecture

```
외부 백테스팅 툴 → Spring Boot API Server → Client
                        ↓
                  MySQL (Spring Data JPA)
                        ↑
              AWS EKS (컨테이너 배포)
```

***

## 4. Tech Stack

<table><thead><tr><th width="266.0703125">영역</th><th>기술</th></tr></thead><tbody><tr><td>Backend</td><td>Spring Boot, Java, Spring Data JPA</td></tr><tr><td>Database</td><td>MySQL</td></tr><tr><td>인프라</td><td>AWS EKS, Docker</td></tr><tr><td>API 설계</td><td>RESTful API</td></tr><tr><td>전략 검증</td><td>외부 백테스팅 툴</td></tr></tbody></table>

***

## 5. Contributions

| 영역     | 기여 내용                                        |
| ------ | -------------------------------------------- |
| API 설계 | Spring Data JPA 기반 종목 추천 RESTful API 설계 및 개발 |
| 전략 연동  | 외부 백테스팅 툴의 전략 결과를 서비스에 통합하는 데이터 흐름 설계        |
| 배포     | AWS EKS 기반 컨테이너 배포 환경 구축                     |

***

## 6. Implementation

### 6.1 RESTful API 설계 — 종목 추천 엔드포인트 구성

퀀트 전략별로 추천 종목 목록, 종목 상세 정보, 전략 설명을 제공해야 했습니다. 클라이언트가 전략 유형과 필터 조건을 조합해 요청할 수 있도록 Spring Data JPA의 동적 쿼리 기능을 활용했습니다.

```java
public interface StockRecommendationRepository
        extends JpaRepository<StockRecommendation, Long> {

    List<StockRecommendation> findByStrategyTypeAndSectorOrderByScoreDesc(
        StrategyType strategyType,
        String sector
    );
}
```

엔티티 설계 시 전략 타입, 종목 코드, 추천 점수, 추천 일자를 핵심 필드로 구성했고, 전략별 조회가 빈번하므로 `strategyType`에 인덱스를 설정했습니다.

**결과:** 전략 유형·섹터 조합 기반의 유연한 종목 조회 API를 확보했습니다.

***

### 6.2 백테스팅 전략 연동 — 외부 툴 결과 통합

외부 백테스팅 툴에서 산출한 전략 결과를 서비스 DB에 반영해야 했습니다. 전략 결과 포맷이 고정되어 있지 않았기 때문에, 전략별 파서를 분리하고 공통 인터페이스로 추상화했습니다.

```java
public interface StrategyResultParser {
    List<StockRecommendation> parse(String rawData);
}
```

각 전략 유형에 대응하는 파서 구현체를 등록하고, 신규 전략 추가 시 파서만 구현하면 기존 흐름을 변경하지 않는 구조로 설계했습니다.

**결과:** 전략 추가 시 파서 구현체 하나만 작성하면 되는 확장 가능한 구조를 확보했습니다.

***

### 6.3 AWS EKS 배포 — 컨테이너 기반 운영 환경 구축

파일럿 프로젝트였지만 이후 확장을 고려해 단일 서버 배포 대신 EKS를 선택했습니다. Docker로 애플리케이션을 컨테이너화한 뒤 EKS 클러스터에 배포했습니다.

배포 구성:

| 구성 요소   | 설정                      |
| ------- | ----------------------- |
| 컨테이너    | Spring Boot Docker 이미지  |
| 오케스트레이션 | AWS EKS                 |
| 서비스 노출  | LoadBalancer 타입 Service |

**결과:** 트래픽 증가 시 Pod 수평 확장이 가능한 배포 환경을 구축했습니다.

***

## 7. Results

* 퀀트 전략 기반 종목 추천 API를 설계하고 파일럿 서비스로 배포 완료
* 전략 추가 시 파서 구현체만 작성하면 되는 확장 가능한 아키텍처 확보
* AWS EKS 기반 컨테이너 배포로 수평 확장 가능한 운영 환경 구축
* Spring Data JPA 기반 RESTful API로 전략·섹터 조합 필터링 기능 제공

***

## 8. Lessons Learned

**배운 점**

* Spring Data JPA의 메서드 네이밍 쿼리만으로 대부분의 조회 요건을 충족할 수 있었지만, 복잡한 동적 필터가 필요한 시점에는 QueryDSL 도입을 검토해야 한다는 점을 체감했습니다
* 파일럿 단계에서도 EKS를 선택한 덕분에 배포·스케일링 경험을 확보했지만, 초기 비용 대비 효율을 따지면 ECS Fargate가 더 적합했을 수 있습니다

**개선할 점**

* 백테스팅 결과 동기화가 수동이었기 때문에, 스케줄러 또는 이벤트 기반 자동 동기화 도입이 필요합니다
* API 인증·인가 미구현 상태로 배포했으므로, Spring Security 또는 JWT 기반 인증 계층 추가가 필요합니다
* 추천 결과에 대한 사용자 피드백 루프가 없어 전략 성과를 서비스 내에서 추적할 수 없었습니다


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://judy-valentine.gitbook.io/judy/work-experience/gentle-energy-corp./stock-recommendation-service.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
