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μ
@QueryNative 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)
AWS RDS (MySQL 8.0)
Docker
AWS ECR
AWS EKS (Kubernetes)
kubectl
Git
Swagger
Postman
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λ₯Ό λ€λ€λ³΄λ μν©μμ, ν΄λ¬μ€ν° μμ±λΆν° μλΉμ€ λ°°ν¬κΉμ§ μ 체 κ³Όμ μ νμ΅νκ³ μ μ©ν΄μΌ νμ΅λλ€.
[ν΄κ²°]
λ¨κ³λ³ λ°°ν¬
Docker μ΄λ―Έμ§ λΉλ λ° ECR νΈμ
EKS ν΄λ¬μ€ν° μμ±
kubectl μ€μ λ° ν΄λ¬μ€ν° μ°κ²°
Deployment λ° Service YAML μμ±
kubectl applyλ‘ λ°°ν¬
LoadBalancer μ€μ λ° μΈλΆ μ κ·Ό ν μ€νΈ
[κ²°κ³Ό]
Kubernetes κΈ°λ° μ»¨ν μ΄λ μ€μΌμ€νΈλ μ΄μ κ²½νμ μμμΌλ©°, AWS EKSλ₯Ό νμ©ν ν΄λΌμ°λ λ€μ΄ν°λΈ μ ν리μΌμ΄μ λ°°ν¬ λ₯λ ₯μ ν보νμ΅λλ€. ν₯ν νλ‘μ νΈμμ νμ₯ κ°λ₯ν λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²λ₯Ό ꡬμΆνλ λ° νμ©ν μ μλ κΈ°λ°μ λ§λ ¨νμ΅λλ€.
Last updated