Piqq (픽)야구 예측 플랫폼 운영 시스템
실제 운영 중인 야구 예측 플랫폼. 예측 API, 관리자 도구, 결제 검증, 정산 배치, Terraform 인프라 개선을 맡았습니다.
프로젝트 소개
Piqq는 piqq.me에서 실제 서비스 중인 야구 예측 플랫폼입니다. Blynx에서 NestJS 백엔드, React 관리자 대시보드, Spring Batch 정산 서버, 결제 서버, Terraform 인프라를 넘나들며 라이브 예측, 스토어, 재화/정산, 크롤링, 배포 개선을 구현했습니다.
- 역할
- 백엔드 API, 관리자 대시보드, Spring Batch 정산, 결제 검증, Terraform 인프라 개선
- 형태
- Blynx 회사 프로젝트
- 상태
- 진행/운영
Company Work
회사 프로젝트 범위
실제 담당했던 백엔드, 프론트엔드, 배치, 결제, 인프라 영역을 중심으로 묶었습니다.

구현한 기능
- LLM 기반 라이브 예측 생성 흐름을 템플릿 기반 시스템으로 교체하고 앱용 API를 추가
- KBO 경기 승자 예측, 이닝별 예측, 미진행 이닝 null 처리 등 라이브 예측 상세 응답 개선
- 관리자 대시보드에 라이브 예측 관리, 시뮬레이터, 모바일 프리뷰, 스토어 어드민 페이지 구현
- Spring Batch 서버에서 KBO/MLB 정산 날짜 보정, 개별 예측 취소 환불, 거래 내역 필터 추가
- Apple/Google 인앱 결제 검증과 acknowledgement 처리, JWT 검증, 테스트 환경 설정 구현
- Terraform으로 ECS blue-green 배포, CloudFront 캐시 정책 보존, 크롤링 주기, EC2 스펙 조정
사용 기술
서비스 요구사항에 맞춰 사용한 기술과 선택 이유입니다.
프론트엔드
언어
TypeScript
프론트엔드와 Node.js 백엔드에서 타입 안정성을 확보하고 API 계약 변경을 추적하기 위해 사용했습니다.
프레임워크/라이브러리
React
관리자 대시보드와 사용자 웹에서 상태 변화가 많은 운영 화면을 컴포넌트로 구성하기 위해 사용했습니다.
Vite
관리자 대시보드를 빠르게 개발하고 빌드하기 위한 프론트엔드 도구로 사용했습니다.
백엔드
언어
TypeScript
프론트엔드와 Node.js 백엔드에서 타입 안정성을 확보하고 API 계약 변경을 추적하기 위해 사용했습니다.
Kotlin
Spring 서버에서 null 안정성과 간결한 도메인 코드를 확보하기 위해 사용했습니다.
프레임워크/런타임
NestJS
예측, 사용자, 스토어, 라이브 운영 API처럼 요청/응답이 많은 서버 기능을 모듈 단위로 나누기 위해 사용했습니다.
Spring Boot
재화와 정산처럼 트랜잭션 안정성이 중요한 서버를 별도 서비스로 구성하기 위해 사용했습니다.
Spring Batch
대량 베팅 정산, 스냅샷 백필, 환불처럼 재시도와 처리 이력이 중요한 작업에 사용했습니다.
DB/검색
저장소
MongoDB
예측 그룹과 경기 관련 문서 데이터를 유연하게 저장하기 위해 사용했습니다.
MySQL
재화, 지갑, 거래, 정산처럼 무결성이 중요한 데이터를 관계형으로 관리하기 위해 사용했습니다.
외부 연동/결제
서비스
Toss Payments
스토어 결제와 유료 상품 구매 흐름을 국내 결제 환경에 맞춰 붙이기 위해 사용했습니다.
인프라
클라우드/배포
AWS
ECS, S3, CloudFront, EventBridge, Lambda 등 운영 인프라를 구성하기 위해 사용했습니다.
Terraform
회사 인프라 변경을 코드로 남기고 dev/prod 환경 차이를 통제하기 위해 사용했습니다.
Docker
서비스별 빌드와 배포 환경을 일관되게 만들기 위해 사용했습니다.
CI/CD
배포 흐름
ECS Blue-Green Deploy
프론트엔드 운영 배포에서 새 버전 전환 위험을 줄이기 위해 blue-green 방식으로 구성했습니다.
Docker Build
서비스별 실행 환경을 이미지로 고정하고 배포 과정에서 빌드 결과를 일관되게 유지하기 위해 사용했습니다.
구조와 개선
NestJS API: 예측 그룹, 선택지, 라이브 예측, 사용자, 스토어, 자산 API 제공 React Dashboard: 라이브 예측 관리, 스토어 관리, 모바일 프리뷰, 운영 시뮬레이터 구성 Spring Batch/Kotlin: 재화, 베팅 스냅샷, 정산, 환불, 백필 작업 처리 Payments service: Toss Payments와 Apple/Google 인앱 결제 검증 흐름 분리 Crawler/Lambda: KBO/나무위키 데이터 수집과 S3 저장을 위한 Go 기반 크롤러 연동 Terraform/AWS: ECS, EC2, CloudFront, S3, EventBridge, IAM, blue-green 배포 리소스 관리
- NestJS API: 예측 그룹, 선택지, 라이브 예측, 사용자, 스토어, 자산 API 제공
- React Dashboard: 라이브 예측 관리, 스토어 관리, 모바일 프리뷰, 운영 시뮬레이터 구성
- Spring Batch/Kotlin: 재화, 베팅 스냅샷, 정산, 환불, 백필 작업 처리
- Payments service: Toss Payments와 Apple/Google 인앱 결제 검증 흐름 분리
- Crawler/Lambda: KBO/나무위키 데이터 수집과 S3 저장을 위한 Go 기반 크롤러 연동
- Terraform/AWS: ECS, EC2, CloudFront, S3, EventBridge, IAM, blue-green 배포 리소스 관리
성과와 회고
- 신고 목록 조회에서 항목마다 유저/대상 정보를 다시 조회하던 N+1 문제를 제거했습니다. 목록 단위로 필요한 데이터를 먼저 모아 매핑하는 방식으로 바꿔, 페이지 크기가 커질수록 늘어나던 DB 호출을 고정된 조회 흐름으로 줄였습니다.
- 사용자용 예측 그룹 목록은 MongoDB Aggregation으로 predictions와 myBets를 함께 조회하도록 정리했습니다. 기존처럼 그룹마다 참여 여부를 따로 확인하지 않고, `{ groupId, userId }` 인덱스를 타는 단일 조회 흐름으로 N+1을 제거했습니다.
- 운영 자동화는 단순 스케줄 추가가 아니라 주기와 데이터 기준을 계속 조정했습니다. 크롤링 주기는 Terraform에서 1시간에서 10분으로 줄였고, KBO/MLB 정산 기준일 오류와 개별 예측 취소 환불 흐름을 배치 서버에서 보정했습니다.
- 배포 쪽에서는 Docker 빌드 캐시를 선택적으로 쓰도록 바꾸고, 프론트엔드 ECS blue-green 배포를 구성했습니다. 배포 속도와 롤백 가능성을 같이 챙기면서 운영 중 새 버전 전환 위험을 줄였습니다.
- 운영 인프라를 Terraform으로 수정할 때는 성능 개선만 보지 않고, CloudFront 캐시 정책처럼 콘솔에서 조정된 수동 설정이 배포 때 덮이지 않도록 lifecycle 정책까지 함께 다뤘습니다.