Stock Recommendation Service

Overview

[ν€€νŠΈ 투자 μ „λž΅ 기반 λ² νŠΈλ‚¨ 주식 μ’…λͺ© μΆ”μ²œ μ„œλΉ„μŠ€]λ₯Ό Spring Boot둜 κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ λ°±ν…ŒμŠ€νŒ… νˆ΄μ„ 톡해 κ²€μ¦λœ 투자 μ „λž΅μ„ 기반으둜 λ² νŠΈλ‚¨ 3~40λŒ€λ₯Ό νƒ€κ²ŸμœΌλ‘œ ν•œ 주식 μ’…λͺ© μΆ”μ²œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” 파일럿 ν”„λ‘œμ νŠΈμ˜€μŠ΅λ‹ˆλ‹€. Spring Data JPAλ₯Ό ν™œμš©ν•œ RESTful API 섀계뢀터 AWS EKS 기반 λ°°ν¬κΉŒμ§€ λ°±μ—”λ“œ μ „λ°˜μ„ λ‹΄λ‹Ήν–ˆμŠ΅λ‹ˆλ‹€.


Timeline

기획 및 섀계 단계

κΈ‰ν•˜κ²Œ 기획된 파일럿 ν”„λ‘œμ νŠΈλ‘œ, λ² νŠΈλ‚¨ ν˜„μ§€ 3~40λŒ€λ₯Ό νƒ€κ²ŸμœΌλ‘œ ν•œ 주식 μ’…λͺ© μΆ”μ²œ μ„œλΉ„μŠ€ μš”κ΅¬μ‚¬ν•­μ„ λΆ„μ„ν•˜κ³  μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜λ₯Ό μ„€κ³„ν–ˆμŠ΅λ‹ˆλ‹€. μ™ΈλΆ€ λ°±ν…ŒμŠ€νŒ… 툴과의 연동 ꡬ쑰λ₯Ό κ²€ν† ν•˜κ³ , 투자 μ „λž΅ 및 μΆ”μ²œ λ„λ©”μΈμ˜ 데이터 λͺ¨λΈμ„ 섀계 및 κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€.

개발 단계

Spring Boot 기반 REST API μ„œλ²„λ₯Ό κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. Spring Data JPAλ₯Ό ν™œμš©ν•˜μ—¬ 투자 μ „λž΅ 및 주식 μ’…λͺ© μΆ”μ²œ λ„λ©”μΈμ˜ CRUD APIλ₯Ό 섀계 및 κ΅¬ν˜„ν–ˆμœΌλ©°, λ³΅μž‘ν•œ 쑰회 μš”κ΅¬μ‚¬ν•­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ Native Queryλ₯Ό ν™œμš©ν–ˆμŠ΅λ‹ˆλ‹€. κΈ°νšνŒ€μ—μ„œ 전달받은 μ „λž΅ 및 μ’…λͺ© 데이터λ₯Ό νŒ€μ›κ³Ό ν˜‘μ—…ν•˜μ—¬ AWS RDS(MySQL)에 μ μž¬ν•˜λŠ” νŒŒμ΄ν”„λΌμΈμ„ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€.

배포 단계

Docker 기반 μ»¨ν…Œμ΄λ„ˆ 이미지λ₯Ό λΉŒλ“œν•˜κ³  AWS ECR에 ν‘Έμ‹œν–ˆμŠ΅λ‹ˆλ‹€. AWS EKS ν΄λŸ¬μŠ€ν„°λ₯Ό μƒμ„±ν•˜κ³  kubectl λͺ…λ Ήμ–΄λ₯Ό 톡해 Spring Boot μ„œλΉ„μŠ€λ₯Ό λ°°ν¬ν–ˆμŠ΅λ‹ˆλ‹€. 배포 ν™˜κ²½ ꡬ성과 μ„œλΉ„μŠ€ μ•ˆμ •μ„±μ„ ν™•λ³΄ν–ˆμœΌλ‚˜, 사업적 이유둜 μ‹€μ œ μ‹œμž₯ μΆœμ‹œλŠ” μ§„ν–‰λ˜μ§€ λͺ»ν–ˆμŠ΅λ‹ˆλ‹€.


Key Features

1. ν€€νŠΈ μ „λž΅ 기반 μ’…λͺ© μΆ”μ²œ

μ™ΈλΆ€ λ°±ν…ŒμŠ€νŒ… 툴둜 κ²€μ¦λœ λ‹€μ–‘ν•œ 투자 μ „λž΅μ„ 기반으둜 λ² νŠΈλ‚¨ 주식 μ’…λͺ©μ„ μΆ”μ²œν•˜λŠ” μ‹œμŠ€ν…œμ„ κ΅¬μΆ•ν–ˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžλŠ” μ „λž΅λ³„ μΆ”μ²œ μ’…λͺ© 리슀트λ₯Ό μ‘°νšŒν•˜κ³ , 각 μ’…λͺ©μ˜ 상세 정보λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

핡심 κΈ°λŠ₯

  • 투자 μ „λž΅λ³„ μΆ”μ²œ μ’…λͺ© 쑰회

  • μ’…λͺ©λ³„ 상세 정보 및 투자 κ·Όκ±° 제곡

  • μ „λž΅ μ„±κ³Ό μ§€ν‘œ 및 λ°±ν…ŒμŠ€νŒ… κ²°κ³Ό 제곡

2. 투자 μ „λž΅ 관리

λ‹€μ–‘ν•œ ν€€νŠΈ 투자 μ „λž΅μ„ κ΄€λ¦¬ν•˜κ³ , 각 μ „λž΅μ˜ μ„±κ³Ό μ§€ν‘œλ₯Ό 좔적할 수 μžˆλŠ” μ‹œμŠ€ν…œμ„ κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€.

핡심 κΈ°λŠ₯

  • μ „λž΅ CRUD API

  • μ „λž΅λ³„ 수읡λ₯  및 리슀크 μ§€ν‘œ 쑰회

  • μ „λž΅ νžˆμŠ€ν† λ¦¬ 및 λ°±ν…ŒμŠ€νŒ… κ²°κ³Ό 관리

3. RESTful API 섀계

Spring Boot와 Spring Data JPAλ₯Ό ν™œμš©ν•˜μ—¬ ν™•μž₯ κ°€λŠ₯ν•˜κ³  μœ μ§€λ³΄μˆ˜κ°€ μš©μ΄ν•œ RESTful APIλ₯Ό μ„€κ³„ν–ˆμŠ΅λ‹ˆλ‹€.

핡심 κΈ°λŠ₯

  • 투자 μ „λž΅ API (GET, POST, PUT, DELETE)

  • μ’…λͺ© μΆ”μ²œ API (λ³΅μž‘ν•œ 쑰회 쑰건 지원)

  • Native Queryλ₯Ό ν™œμš©ν•œ μ„±λŠ₯ μ΅œμ ν™”


Architecture

전체 μ‹œμŠ€ν…œ μ•„ν‚€ν…μ²˜

데이터 흐름 μ•„ν‚€ν…μ²˜

배포 νŒŒμ΄ν”„λΌμΈ


Contributions

1. 투자 μ „λž΅ 및 μ’…λͺ© μΆ”μ²œ API 개발

  • Spring Data JPA 기반 API 섀계

    • 투자 μ „λž΅ 도메인 섀계 및 CRUD API κ΅¬ν˜„

    • μ’…λͺ© μΆ”μ²œ 도메인 섀계 및 쑰회 API κ΅¬ν˜„

    • RESTful API 섀계 원칙 μ€€μˆ˜

  • Native Query ν™œμš©

    • λ³΅μž‘ν•œ 쑰회 쑰건을 μš”κ΅¬ν•˜λŠ” μΆ”μ²œ μ’…λͺ© API에 @Query Native Query ν™œμš©

    • 닀쀑 ν…Œμ΄λΈ” JOIN 및 집계 쿼리 μ΅œμ ν™”

    • μ „λž΅λ³„, 쑰건별 동적 쿼리 처리

2. AWS EKS 기반 배포 ν™˜κ²½ ꡬ좕

  • Docker μ»¨ν…Œμ΄λ„ˆν™”

    • Spring Boot μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ Docker μ΄λ―Έμ§€λ‘œ λΉŒλ“œ

    • Multi-stage build둜 이미지 크기 μ΅œμ ν™”

    • AWS ECR에 이미지 ν‘Έμ‹œ

  • AWS EKS 배포

    • AWS EKS ν΄λŸ¬μŠ€ν„° 생성 및 ꡬ성

    • kubectl을 ν†΅ν•œ Deployment 및 Service 배포

    • LoadBalancer둜 μ™ΈλΆ€ νŠΈλž˜ν”½ λΌμš°νŒ… μ„€μ •


Tech Stack

  • Spring Boot 2.7

  • Java 17

  • Spring Data JPA

  • Spring Web (REST API)


Challenges

Native Queryλ₯Ό ν™œμš©ν•œ λ³΅μž‘ν•œ 쑰회 μ„±λŠ₯ μ΅œμ ν™”

[문제 상황]

μ „λž΅λ³„ μΆ”μ²œ μ’…λͺ©μ„ μ‘°νšŒν•  λ•Œ, λ‹€μ–‘ν•œ 필터링 쑰건(수읡λ₯ , 리슀크 점수, μ„Ήν„° λ“±)κ³Ό μ—¬λŸ¬ ν…Œμ΄λΈ” JOIN이 ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€. Spring Data JPA의 λ©”μ„œλ“œ μΏΌλ¦¬λ‚˜ Criteria APIλ‘œλŠ” λ³΅μž‘ν•œ 쑰건을 ν‘œν˜„ν•˜κΈ° μ–΄λ ΅κ³ , μ„±λŠ₯도 μ΅œμ ν™”ν•˜κΈ° νž˜λ“€μ—ˆμŠ΅λ‹ˆλ‹€.

[ν•΄κ²°]

  • Native Query ν™œμš©

    • @Query μ–΄λ…Έν…Œμ΄μ…˜μ˜ nativeQuery = true μ˜΅μ…˜μœΌλ‘œ 직접 SQL μž‘μ„±

    • λ³΅μž‘ν•œ JOIN 및 집계 쿼리λ₯Ό 효율적으둜 κ΅¬ν˜„

    • λ°μ΄ν„°λ² μ΄μŠ€ 고유 κΈ°λŠ₯(MySQL ν•¨μˆ˜ λ“±) ν™œμš© κ°€λŠ₯

  • 쿼리 μ΅œμ ν™”

    • 인덱슀λ₯Ό κ³ λ €ν•œ WHERE 절 쑰건 μˆœμ„œ μ‘°μ •

    • λΆˆν•„μš”ν•œ 데이터 쑰회 제거 (SELECT 절 μ΅œμ ν™”)

    • EXPLAIN으둜 μ‹€ν–‰ κ³„νš 뢄석 ν›„ κ°œμ„ 

  • 동적 쿼리 처리

    • νŒŒλΌλ―Έν„° λ°”μΈλ”©μœΌλ‘œ SQL Injection λ°©μ§€

    • 선택적 필터링 쑰건 처리

[κ²°κ³Ό]

Native Query ν™œμš©μœΌλ‘œ λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ 효율적으둜 μ²˜λ¦¬ν•˜κ³ , 쿼리 μ„±λŠ₯을 μ΅œμ ν™”ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, λ°μ΄ν„°λ² μ΄μŠ€ μ˜μ‘΄μ„±μ΄ μƒκΈ°λŠ” 단점도 ν•¨κ»˜ μΈμ‹ν–ˆμŠ΅λ‹ˆλ‹€.

AWS EKS 배포 κ²½ν—˜

[문제 상황]

처음 Kubernetes와 AWS EKSλ₯Ό λ‹€λ€„λ³΄λŠ” μƒν™©μ—μ„œ, ν΄λŸ¬μŠ€ν„° 생성뢀터 μ„œλΉ„μŠ€ λ°°ν¬κΉŒμ§€ 전체 과정을 ν•™μŠ΅ν•˜κ³  μ μš©ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.

[ν•΄κ²°]

단계별 배포

  1. Docker 이미지 λΉŒλ“œ 및 ECR ν‘Έμ‹œ

  2. EKS ν΄λŸ¬μŠ€ν„° 생성

  3. kubectl μ„€μ • 및 ν΄λŸ¬μŠ€ν„° μ—°κ²°

  4. Deployment 및 Service YAML μž‘μ„±

  5. kubectl apply둜 배포

  6. LoadBalancer μ„€μ • 및 μ™ΈλΆ€ μ ‘κ·Ό ν…ŒμŠ€νŠΈ

[κ²°κ³Ό]

Kubernetes 기반 μ»¨ν…Œμ΄λ„ˆ μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜ κ²½ν—˜μ„ μŒ“μ•˜μœΌλ©°, AWS EKSλ₯Ό ν™œμš©ν•œ ν΄λΌμš°λ“œ λ„€μ΄ν‹°λΈŒ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 배포 λŠ₯λ ₯을 ν™•λ³΄ν–ˆμŠ΅λ‹ˆλ‹€. ν–₯ν›„ ν”„λ‘œμ νŠΈμ—μ„œ ν™•μž₯ κ°€λŠ₯ν•œ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜λ₯Ό κ΅¬μΆ•ν•˜λŠ” 데 ν™œμš©ν•  수 μžˆλŠ” κΈ°λ°˜μ„ λ§ˆλ ¨ν–ˆμŠ΅λ‹ˆλ‹€.

Last updated