![]() 주용완 PM, DevOps, SRE, CDC |
![]() 서지혜 PL, Cloud Infra, AI |
![]() 유동균 Logging, Monitoring |
![]() 이준호 Onpremise Infra |
![]() 이명진 Data Management, Infra |
MoneyLog : 청년 맞춤형 금융 생활관리 플랫폼
AI 기반 소비 분석과 소셜 피드를 결합하여, 청년들이 자신의 금융 생활을 즐겁게 관리하고 공유할 수 있는 참여형 금융 플랫폼입니다.
기획 배경 자세히 보기
최근 청년 세대에게 소비는 단순한 지출 행위를 넘어, 자신의 가치관과 개성을 드러내는 중요한 자기표현의 수단이 되었습니다. 'Todo Mate'나 'Setlog'와 같은 서비스의 흥행에서 알 수 있듯, 자신의 일상과 목표를 기록하고 공유하며 또래와 동기부여를 주고받는 문화는 이미 청년 세대의 주요 트렌드로 자리 잡고 있습니다.
그러나 기존의 금융 및 자산관리 애플리케이션은 대부분 계좌, 카드, 보험, 소비 내역과 같은 금융 데이터를 숫자와 통계 중심으로 제공하는 데 집중되어 있습니다.
MoneyLog는 이러한 한계를 해결하기 위해:
- ✅ AI를 활용한 사용자 소비 데이터 분석
- ✅ 가계부 작성과 관리 자동화 지원
- ✅ 월별 소비 리포트 및 청년정책 추천
- ✅ 소셜 피드 기반 소비 공유 및 피드백
금융 데이터의 '연결'과 '스토리화'를 통해 청년들이 자신만의 소비 방식을 자연스럽게 돌아볼 수 있는 소셜 금융 생태계 구축
| 구분 | 내용 |
|---|---|
| 금융의 소셜화 | 단순 지출 기록을 '금융 피드'로 전환, 또래 피드백을 통한 리텐션 극대화 |
| 정보 비대칭 해소 | 파편화된 청년정책/금융상품 정보를 맞춤형으로 제공 |
| 사용자 측면 | 시각적 피드로 심리적 거부감 낮추고 지속적인 기록 습관 형성 |
| 플랫폼 측면 | 소셜 피드 기반 높은 리텐션과 생활 밀착형 플랫폼 확장 |
| 사회적 측면 | 청년 혜택 정보 접근성 향상, 금융 이해도 문화 확산 |
| 목표 | 설명 |
|---|---|
| Infrastructure | Amazon EKS 기반 컨테이너 환경, Auto-scaling, 서버 이중화 |
| Application | Java/TypeScript 기반 MSA, 인증·인가, 소셜 피드 기능 |
| DevOps | Jenkins/GitLab CI/CD 파이프라인, 실시간 모니터링 |
| Testing | DB 무결성 검증, JUnit 단위/통합 테스트, 문서화 |
| AI/ML | 소비 패턴 분석, 개인화 추천, 청년정책/카드/보험 추천 |
전체 기술 스택 상세 보기
- Language: Java 17, Python 3.x
- Framework: Spring Boot 3.5.14, FastAPI 0.115.0, Node.js + TypeScript
- Database: PostgreSQL, Redis
- Message Queue: NATS JetStream
- CDC: Debezium
- AI/ML: LangGraph, LangChain, Anthropic Claude, Neo4j, Sentence Transformers
- Framework: Next.js 16.2.6, React 19
- Language: TypeScript 5.7.3
- UI Library: Radix UI, Tailwind CSS 4.2.0
- State Management: Apollo Client (GraphQL)
- Data Visualization: Recharts
- Container: Docker, Kubernetes (Amazon EKS)
- Orchestration: Terraform, Helm
- Service Mesh: Istio
- CI/CD: Jenkins, GitLab CI/CD
- Monitoring: Prometheus, Grafana, Loki, Tempo, Alloy, Grafana Faro
- Observability: OpenTelemetry, SonarQube
하이브리드 클라우드 구조로 AWS와 온프레미스 환경을 Site-to-Site VPN으로 연결했습니다.
| 환경 | 구성 요소 | 설명 |
|---|---|---|
| AWS 클라우드 | EKS, Multi-AZ, ALB, WAF | 고가용성 확보, Istio 인그레스 게이트웨이 라우팅 |
| 온프레미스 | vSphere(ESXi), K8s | HAProxy + Keepalived 이중화, NATS JetStream |
마이크로서비스 아키텍처(MSA) 기반으로 도메인별 서비스를 분리했습니다.
| 계층 | 설명 |
|---|---|
| 게이트웨이 | S3/CloudFront → ALB → Istio Gateway → BFF → Spring Cloud Gateway |
| 마이크로서비스 | Social, Alarm, Budget, Auth, AI 서비스 (Controller-Service-Component-DBIO) |
| 데이터 동기화 | 독립 DB 사용, CDC(Change Data Capture)로 비동기 전파 |
|
|
LangGraph 기반 AI 파이프라인을 통해 사용자의 소비 패턴을 분석하고, 개인 맞춤형 금융상품과 청년정책을 자동 추천합니다.
|
핵심 기술
|
성능 개선
|
graph LR
A[Profile<br/>사용자 데이터] --> B[Embed<br/>가중 평균 임베딩]
B --> C[VectorSearch<br/>상위 30개]
C --> D[Rerank<br/>7개 압축]
D --> E[Filter<br/>조건 필터링]
E --> F[GraphExpand<br/>관계 조회]
F --> G[Conflict<br/>중복 감지]
G --> H[LLM<br/>추천 생성]
H --> I[Save<br/>DB 저장]
핵심 코드 보기
# app/domain/recommend_ai/graph.py - LangGraph 파이프라인 구성
from langgraph.graph import StateGraph, START, END
def build_recommend_graph():
graph = StateGraph(RecommendState)
# 노드 등록
graph.add_node("profile", profile_node)
graph.add_node("embed", embed_node)
graph.add_node("vector_search", vector_search_node)
graph.add_node("rerank", rerank_node)
graph.add_node("filter", filter_node)
graph.add_node("graph_expand", graph_expand_node)
graph.add_node("conflict", conflict_node)
graph.add_node("llm", llm_recommend_node)
graph.add_node("save", save_node)
# 에지 연결
graph.add_edge(START, "profile")
graph.add_conditional_edges("profile", _has_error, {
"save": "save",
"continue": "embed"
})
# ... (생략) ...
return graph.compile()코드 링크: LangGraph Pipeline | Embedding Node
Debezium CDC와 NATS JetStream을 활용한 이벤트 기반 아키텍처로 데이터 일관성을 보장하면서 실시간 처리를 구현했습니다.
|
핵심 아키텍처
|
고가용성 보장
|
PostgreSQL → Debezium → NATS JetStream → AI/Alarm Service
(WAL) (CDC) (Pub/Sub) (Consumer)
핵심 코드 보기
# debezium/aws_debezium/debezium-budget.yaml - CDC 설정
apiVersion: v1
kind: ConfigMap
metadata:
name: debezium-budget-config
data:
application.properties: |
debezium.sink.type=nats-jetstream
debezium.sink.nats-jetstream.url=nats://k8s_leaf:leaf_password@10.0.2.65:4222
debezium.source.connector.class=io.debezium.connector.postgresql.PostgresConnector
debezium.source.database.hostname=oka-budget.ctku6oc2yg75.ap-northeast-2.rds.amazonaws.com
debezium.source.topic.prefix=budget-server
debezium.source.plugin.name=pgoutput코드 링크: Debezium Config | NATS Consumer
Istio 서비스 메시와 Argo Rollouts를 결합하여 카나리 배포로 무중단 배포를 실현했습니다.
|
핵심 기능
|
배포 프로세스
|
핵심 코드 보기
# infra/manifest/gateway-service/istio.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: gateway-service-moneylog-vs
spec:
hosts: ["*"]
gateways: [moneylog-gateway]
http:
- match:
- uri:
prefix: "/graphql"
route:
- destination:
host: bff-service
port:
number: 8085코드 링크: Istio Gateway | Jenkinsfile Canary
Hot Storage(S3)와 Cold Storage(MinIO)를 자동 티어링하여 성능과 비용을 동시에 최적화했습니다.
|
저장소 구성
|
비용 절감
|
graph LR
A[HOT<br/>S3 업로드] --> B[ARCHIVING<br/>MinIO 복사]
B --> C[BOTH<br/>체크섬 검증]
C --> D[DELETING_HOT<br/>7일 대기]
D --> E[COLD<br/>S3 삭제 완료]
자동화 스케줄러
- 📅 매일 03:00 KST: 아카이브 작업 (50개/배치)
- 📅 매일 03:30 KST: Hot 삭제 작업
핵심 코드 보기
// FeedImageArchiveScheduler.java - 자동화 스케줄러
@Scheduled(cron = "0 0 3 * * *", zone = "Asia/Seoul")
public void archiveEligibleImages() {
feedImageArchiveBatchService.archiveEligibleImages();
}
@Scheduled(cron = "0 30 3 * * *", zone = "Asia/Seoul")
public void deleteEligibleHotObjects() {
feedImageHotDeletionService.deleteEligibleHotObjects();
}코드 링크: Archive Scheduler | MinIO StatefulSet
Prometheus + Sloth로 SLO를 관리하고, AWS Lambda + Claude AI로 장애를 자동 분석하여 Slack으로 알림합니다.
|
SLI/SLO 정의
|
AIOps 효과
|
graph LR
A[Prometheus<br/>SLO 감지] --> B[Alertmanager<br/>필터링]
B --> C[SNS<br/>발행]
C --> D[Lambda<br/>트리거]
D --> E[Loki<br/>로그 수집]
E --> F[Claude AI<br/>분석]
F --> G[Slack<br/>알림]
핵심 코드 보기
# aiops-lambda/lambda_function.py - AI 자동 분석
def lambda_handler(event, context):
for record in event['Records']:
alert_data = json.loads(record['Sns']['Message'])
for alert in alert_data.get('alerts', []):
if alert['status'] == 'firing':
service_name = alert['labels'].get('service')
# 1. Loki에서 로그 수집
logs = get_loki_logs(service_name)
# 2. Bedrock으로 AI 분석
analysis = analyze_with_bedrock(alert_desc, logs)
# 3. Slack으로 리포트 전송
send_to_slack(alert_title, analysis)코드 링크: AIOps Lambda | SLO Definitions




